/////////////////////////////////////////////////////////////////////////////
-// Name: clipbrd.cpp
+// Name: gtk/clipbrd.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#include "wx/utils.h"
#include "wx/log.h"
-#include "glib.h"
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
//-----------------------------------------------------------------------------
// thread system
GdkAtom g_clipboardAtom = 0;
GdkAtom g_targetsAtom = 0;
+// the trace mask we use with wxLogTrace() - call
+// wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here
+// (there will be a *lot* of them!)
+static const wxChar *TRACE_CLIPBOARD = _T("clipboard");
+
//-----------------------------------------------------------------------------
// reminder
//-----------------------------------------------------------------------------
GdkAtom selection;
GdkAtom target;
GdkAtom type;
- gint format;
+ gint format;
guchar *data;
- gint length;
+ gint length;
};
*/
if ( wxTheClipboard && selection_data->length > 0 )
{
/* make sure we got the data in the correct form */
-
- // VZ: I don't know what does this mean (and GTK+ authors apparently
- // don't know either, Owen Taylor writes that "Motif seems to ask
- // for TARGETS atom sometimes" (??)), but it seems that xterm
- // (which is not a Motif app AFAIK) does this too, so it's
- // absolutely essential to support this, otherwise we can't paste
- // text from xterm!
GdkAtom type = selection_data->type;
if ( type != GDK_SELECTION_TYPE_ATOM )
{
- if ( strcmp(gdk_atom_name(type), "TARGETS") != 0 )
+ if ( strcmp(gdk_atom_name(type), "TARGETS") )
{
- // don't know what this is
+ wxLogTrace( TRACE_CLIPBOARD,
+ _T("got unsupported clipboard target") );
+
clipboard->m_waiting = FALSE;
return;
}
- //else: don't know what this is, but it seems to work in the same
- // way as GDK_SELECTION_TYPE_ATOM does
}
- //else: the data is the list of formats supported by the selection
- /*
+#ifdef __WXDEBUG__
wxDataFormat clip( selection_data->selection );
- wxLogDebug( wxT("selection received for targets, clipboard %s"), clip.GetId().c_str() );
- */
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("selection received for targets, clipboard %s"),
+ clip.GetId().c_str() );
+#endif // __WXDEBUG__
// the atoms we received, holding a list of targets (= formats)
GdkAtom *atoms = (GdkAtom *)selection_data->data;
{
wxDataFormat format( atoms[i] );
- /*
- wxLogDebug( wxT("selection received for targets, format %s"), format.GetId().c_str() );
- */
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("selection received for targets, format %s"),
+ format.GetId().c_str() );
if (format == clipboard->m_targetRequested)
{
/* the clipboard is no longer in our hands. we can the delete clipboard data. */
if (wxTheClipboard->m_data)
{
- wxLogDebug( wxT("wxClipboard will get cleared" ) );
+ wxLogTrace(TRACE_CLIPBOARD, wxT("wxClipboard will get cleared" ));
delete wxTheClipboard->m_data;
wxTheClipboard->m_data = (wxDataObject*) NULL;
if (!data->IsSupportedFormat( format )) return;
- /* this will fail for composite formats */
- if (format.GetType() == wxDF_TEXT)
- {
- wxTextDataObject *text_object = (wxTextDataObject*) data;
- wxString text( text_object->GetText() );
-
-#if wxUSE_UNICODE
- const wxWX2MBbuf s = text.mbc_str();
- int len = strlen(s);
-#else // more efficient in non-Unicode
- const char *s = text.c_str();
- int len = (int) text.Length();
-#endif
- gtk_selection_data_set(
- selection_data,
- GDK_SELECTION_TYPE_STRING,
- 8*sizeof(gchar),
- (unsigned char*) (const char*) s,
- len );
-
- return;
- }
-
int size = data->GetDataSize( format );
if (size == 0) return;
- char *d = new char[size];
+ void *d = malloc(size);
- data->GetDataHere( selection_data->target, (void*) d );
+ data->GetDataHere( selection_data->target, d );
+
+ // transform Unicode text into multibyte before putting it on clipboard
+#if wxUSE_UNICODE
+ if ( format.GetType() == wxDF_TEXT )
+ {
+ const wchar_t *wstr = (const wchar_t *)d;
+ size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0);
+ char *str = malloc(len + 1);
+ wxConvCurrent->WC2MB(str, wstr, len);
+ str[len] = '\0';
+
+ free(d);
+ d = str;
+ }
+#endif // wxUSE_UNICODE
gtk_selection_data_set(
selection_data,
8*sizeof(gchar),
(unsigned char*) d,
size );
+
+ free(d);
}
//-----------------------------------------------------------------------------
for (size_t i = 0; i < m_data->GetFormatCount(); i++)
{
- wxLogDebug( wxT("wxClipboard now supports atom %s"), array[i].GetId().c_str() );
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("wxClipboard now supports atom %s"),
+ array[i].GetId().c_str() );
gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget),
clipboard,
bool wxClipboard::IsSupported( const wxDataFormat& format )
{
/* reentrance problems */
- if (m_open) return TRUE;
+ if (m_waiting) return FALSE;
/* store requested format to be asked for by callbacks */
m_targetRequested = format;
+#if 0
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("wxClipboard:IsSupported: requested format: %s"),
+ format.GetId().c_str() );
+#endif
+
wxCHECK_MSG( m_targetRequested, FALSE, wxT("invalid clipboard format") );
m_formatSupported = FALSE;
{
wxDataFormat format( array[i] );
- wxLogDebug( wxT("wxClipboard::GetData: requested format: %s"), format.GetId().c_str() );
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("wxClipboard::GetData: requested format: %s"),
+ format.GetId().c_str() );
/* is data supported by clipboard ? */
m_waiting = TRUE;
- wxLogDebug( wxT("wxClipboard::GetData: format found, start convert") );
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("wxClipboard::GetData: format found, start convert") );
gtk_selection_convert( m_clipboardWidget,
m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY
return TRUE;
}
- wxLogDebug( wxT("wxClipboard::GetData: format not found") );
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("wxClipboard::GetData: format not found") );
/* return failure */
delete[] array;