]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/clipbrd.cpp
added wxArtProvider
[wxWidgets.git] / src / gtk / clipbrd.cpp
index bfd34502bd093dbe5072221979d0b8f55ab728ca..c6edc527b1d980eff1b786ecec9ab9c15fb36e7a 100644 (file)
@@ -28,8 +28,6 @@
 //-----------------------------------------------------------------------------
 
 #if wxUSE_THREADS
-extern void wxapp_install_thread_wakeup();
-extern void wxapp_uninstall_thread_wakeup();
 #endif
 
 //-----------------------------------------------------------------------------
@@ -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;
@@ -590,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
@@ -608,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;