From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Tue, 18 Dec 2001 18:43:10 +0000 (+0000)
Subject: fix for using wxDataObjectComposite with the clipboard
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/33754c4d83c59b7523a6da0c4fb21079cb60301c

fix for using wxDataObjectComposite with the clipboard


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13078 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

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);
 }
 
 //-----------------------------------------------------------------------------