]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/clipbrd.cpp
guarding scrollbar
[wxWidgets.git] / src / gtk / clipbrd.cpp
index 24b9da8278a1277329ed3d3a99e65230598bbe8a..538a80e7af18d42b5a155efd4a8afef8d56c42e8 100644 (file)
 #include "wx/clipbrd.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/utils.h"
     #include "wx/dataobj.h"
 #endif
 
-#include "wx/ptr_scpd.h"
+#include "wx/scopedarray.h"
 #include "wx/scopeguard.h"
+#include "wx/evtloop.h"
 
 #include "wx/gtk/private.h"
 
-wxDECLARE_SCOPED_ARRAY(wxDataFormat, wxDataFormatArray)
-wxDEFINE_SCOPED_ARRAY(wxDataFormat, wxDataFormatArray)
+typedef wxScopedArray<wxDataFormat> wxDataFormatArray;
 
 // ----------------------------------------------------------------------------
 // data
@@ -74,8 +75,8 @@ public:
 
     ~wxClipboardSync()
     {
-        while ( ms_clipboard )
-            gtk_main_iteration();
+        while (ms_clipboard)
+            wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_CLIPBOARD);
     }
 
     // this method must be called by GTK+ callbacks to indicate that we got the
@@ -102,7 +103,7 @@ public:
 private:
     static wxClipboard *ms_clipboard;
 
-    DECLARE_NO_COPY_CLASS(wxClipboardSync)
+    wxDECLARE_NO_COPY_CLASS(wxClipboardSync);
 };
 
 wxClipboard *wxClipboardSync::ms_clipboard = NULL;
@@ -143,14 +144,12 @@ targets_selection_received( GtkWidget *WXUNUSED(widget),
         }
     }
 
-#ifdef __WXDEBUG__
     // it's not really a format, of course, but we can reuse its GetId() method
     // to format this atom as string
     wxDataFormat clip(selection_data->selection);
     wxLogTrace( TRACE_CLIPBOARD,
                 wxT("Received available formats for clipboard %s"),
                 clip.GetId().c_str() );
-#endif // __WXDEBUG__
 
     // the atoms we received, holding a list of targets (= formats)
     const GdkAtom * const atoms = (GdkAtom *)selection_data->data;
@@ -282,7 +281,6 @@ selection_handler( GtkWidget *WXUNUSED(widget),
 
     wxDataFormat format( selection_data->target );
 
-#ifdef __WXDEBUG__
     wxLogTrace(TRACE_CLIPBOARD,
                _T("clipboard data in format %s, GtkSelectionData is target=%s type=%s selection=%s timestamp=%u"),
                format.GetId().c_str(),
@@ -291,7 +289,6 @@ selection_handler( GtkWidget *WXUNUSED(widget),
                wxString::FromAscii(wxGtkString(gdk_atom_name(selection_data->selection))).c_str(),
                GPOINTER_TO_UINT( signal_data )
                );
-#endif // __WXDEBUG__
 
     if ( !data->IsSupportedFormat( format ) )
         return;
@@ -360,12 +357,14 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget),
 
     if (!clipboard->m_sink)
         return;
-        
+
     wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED);
-    
+    event->SetEventObject( clipboard );
+
     if ( !selection_data || selection_data->length <= 0 )
     {
         clipboard->m_sink->QueueEvent( event );
+        clipboard->m_sink.Release();
         return;
     }
 
@@ -379,18 +378,17 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget),
                         _T("got unsupported clipboard target") );
 
             clipboard->m_sink->QueueEvent( event );
+            clipboard->m_sink.Release();
             return;
         }
     }
 
-#ifdef __WXDEBUG__
     // it's not really a format, of course, but we can reuse its GetId() method
     // to format this atom as string
     wxDataFormat clip(selection_data->selection);
     wxLogTrace( TRACE_CLIPBOARD,
                 wxT("Received available formats for clipboard %s"),
                 clip.GetId().c_str() );
-#endif // __WXDEBUG__
 
     // the atoms we received, holding a list of targets (= formats)
     const GdkAtom * const atoms = (GdkAtom *)selection_data->data;
@@ -402,8 +400,9 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget),
 
         event->AddFormat( format );
     }
-    
+
     clipboard->m_sink->QueueEvent( event );
+    clipboard->m_sink.Release();
 }
 }
 
@@ -435,7 +434,7 @@ wxClipboard::wxClipboard()
     g_signal_connect (m_targetsWidget, "selection_received",
                       G_CALLBACK (targets_selection_received), this);
 
-    // we use m_targetsWidgetAsync to query what formats asynchronously
+    // we use m_targetsWidgetAsync to query what formats are available asynchronously
     m_targetsWidgetAsync = gtk_window_new( GTK_WINDOW_POPUP );
     gtk_widget_realize( m_targetsWidgetAsync );
 
@@ -520,13 +519,17 @@ void wxClipboard::AddSupportedTarget(GdkAtom atom)
 
 bool wxClipboard::IsSupportedAsync(wxEvtHandler *sink)
 {
+    if (m_sink.get())
+        return false;  // currently busy, come back later
+
+    wxCHECK_MSG( sink, false, wxT("no sink given") );
+
     m_sink = sink;
-    
     gtk_selection_convert( m_targetsWidgetAsync,
                            GTKGetClipboardAtom(),
                            g_targetsAtom,
                            (guint32) GDK_CURRENT_TIME );
-                           
+
     return true;
 }