X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/61b04ac6528f18f8cb57215f74795d565451d65c..7b1279006496ba3251a755bcef91301ad107bb78:/src/gtk/clipbrd.cpp diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 58b1952e17..c6edc527b1 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -19,17 +19,15 @@ #include "wx/utils.h" #include "wx/log.h" -#include "glib.h" -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include +#include //----------------------------------------------------------------------------- // thread system //----------------------------------------------------------------------------- #if wxUSE_THREADS -extern void wxapp_install_thread_wakeup(); -extern void wxapp_uninstall_thread_wakeup(); #endif //----------------------------------------------------------------------------- @@ -42,7 +40,7 @@ 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 char *TRACE_CLIPBOARD = _T("clipboard"); +static const wxChar *TRACE_CLIPBOARD = _T("clipboard"); //----------------------------------------------------------------------------- // reminder @@ -212,7 +210,7 @@ selection_clear_clip( GtkWidget *WXUNUSED(widget), GdkEventSelection *event ) /* 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; @@ -244,36 +242,28 @@ selection_handler( GtkWidget *WXUNUSED(widget), 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, @@ -281,6 +271,8 @@ selection_handler( GtkWidget *WXUNUSED(widget), 8*sizeof(gchar), (unsigned char*) d, size ); + + free(d); } //----------------------------------------------------------------------------- @@ -347,7 +339,6 @@ void wxClipboard::Clear() { #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 @@ -380,7 +371,6 @@ void wxClipboard::Clear() #if wxUSE_THREADS /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); #endif } @@ -449,7 +439,6 @@ bool wxClipboard::AddData( wxDataObject *data ) #if wxUSE_THREADS /* disable GUI threads */ - wxapp_uninstall_thread_wakeup(); #endif /* Tell the world we offer clipboard data */ @@ -464,7 +453,6 @@ bool wxClipboard::AddData( wxDataObject *data ) #if wxUSE_THREADS /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); #endif return res; @@ -490,9 +478,11 @@ bool wxClipboard::IsSupported( const wxDataFormat& format ) /* 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") ); @@ -588,7 +578,8 @@ bool wxClipboard::GetData( wxDataObject& data ) 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 @@ -606,7 +597,8 @@ bool wxClipboard::GetData( wxDataObject& data ) return TRUE; } - wxLogDebug( wxT("wxClipboard::GetData: format not found") ); + wxLogTrace( TRACE_CLIPBOARD, + wxT("wxClipboard::GetData: format not found") ); /* return failure */ delete[] array;