]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/clipbrd.cpp
don't pass arrays by value (and also fixed signed/unsigned comparison warning
[wxWidgets.git] / src / gtk / clipbrd.cpp
index 3188efb47578de1f84c91bd85993253ed49289aa..c6edc527b1d980eff1b786ecec9ab9c15fb36e7a 100644 (file)
@@ -28,8 +28,6 @@
 //-----------------------------------------------------------------------------
 
 #if wxUSE_THREADS
 //-----------------------------------------------------------------------------
 
 #if wxUSE_THREADS
-extern void wxapp_install_thread_wakeup();
-extern void wxapp_uninstall_thread_wakeup();
 #endif
 
 //-----------------------------------------------------------------------------
 #endif
 
 //-----------------------------------------------------------------------------
@@ -244,36 +242,28 @@ selection_handler( GtkWidget *WXUNUSED(widget),
 
     if (!data->IsSupportedFormat( format )) return;
 
 
     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;
 
     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,
 
     gtk_selection_data_set(
         selection_data,
@@ -281,6 +271,8 @@ selection_handler( GtkWidget *WXUNUSED(widget),
         8*sizeof(gchar),
         (unsigned char*) d,
         size );
         8*sizeof(gchar),
         (unsigned char*) d,
         size );
+
+    free(d);
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -347,7 +339,6 @@ void wxClipboard::Clear()
     {
 #if wxUSE_THREADS
         /* disable GUI threads */
     {
 #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
 #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 */
 
 #if wxUSE_THREADS
         /* re-enable GUI threads */
-        wxapp_install_thread_wakeup();
 #endif
     }
 
 #endif
     }
 
@@ -449,7 +439,6 @@ bool wxClipboard::AddData( wxDataObject *data )
 
 #if wxUSE_THREADS
     /* disable GUI threads */
 
 #if wxUSE_THREADS
     /* disable GUI threads */
-    wxapp_uninstall_thread_wakeup();
 #endif
 
     /* Tell the world we offer clipboard data */
 #endif
 
     /* Tell the world we offer clipboard data */
@@ -464,7 +453,6 @@ bool wxClipboard::AddData( wxDataObject *data )
 
 #if wxUSE_THREADS
     /* re-enable GUI threads */
 
 #if wxUSE_THREADS
     /* re-enable GUI threads */
-    wxapp_install_thread_wakeup();
 #endif
 
     return res;
 #endif
 
     return res;