#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
//-----------------------------------------------------------------------------
#if wxUSE_THREADS
-extern void wxapp_install_thread_wakeup();
-extern void wxapp_uninstall_thread_wakeup();
#endif
//-----------------------------------------------------------------------------
// 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 char *TRACE_CLIPBOARD = _T("clipboard");
+static const wxChar *TRACE_CLIPBOARD = _T("clipboard");
//-----------------------------------------------------------------------------
// reminder
/* 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);
}
//-----------------------------------------------------------------------------
{
#if wxUSE_THREADS
/* disable GUI threads */
- wxapp_uninstall_thread_wakeup();
#endif
/* As we have data we also own the clipboard. Once we no longer own
#if wxUSE_THREADS
/* re-enable GUI threads */
- wxapp_install_thread_wakeup();
#endif
}
#if wxUSE_THREADS
/* disable GUI threads */
- wxapp_uninstall_thread_wakeup();
#endif
/* Tell the world we offer clipboard data */
#if wxUSE_THREADS
/* re-enable GUI threads */
- wxapp_install_thread_wakeup();
#endif
return res;
/* 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_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;