From 33754c4d83c59b7523a6da0c4fb21079cb60301c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 18 Dec 2001 18:43:10 +0000 Subject: [PATCH] fix for using wxDataObjectComposite with the clipboard git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13078 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/clipbrd.cpp | 44 +++++++++++++++++++------------------------- src/gtk1/clipbrd.cpp | 44 +++++++++++++++++++------------------------- 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 3188efb475..881b0dce87 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -244,36 +244,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, d ); - data->GetDataHere( selection_data->target, (void*) 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 +273,8 @@ selection_handler( GtkWidget *WXUNUSED(widget), 8*sizeof(gchar), (unsigned char*) d, size ); + + free(d); } //----------------------------------------------------------------------------- diff --git a/src/gtk1/clipbrd.cpp b/src/gtk1/clipbrd.cpp index 3188efb475..881b0dce87 100644 --- a/src/gtk1/clipbrd.cpp +++ b/src/gtk1/clipbrd.cpp @@ -244,36 +244,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, d ); - data->GetDataHere( selection_data->target, (void*) 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 +273,8 @@ selection_handler( GtkWidget *WXUNUSED(widget), 8*sizeof(gchar), (unsigned char*) d, size ); + + free(d); } //----------------------------------------------------------------------------- -- 2.47.2