X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/311c1be9edd5e8a0f6d3e2ac4d42ca8d96d9c855..55410bb4f67febe1ca20654f078ea4fb9a6223ae:/src/gtk/clipbrd.cpp diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 55a2ba66c6..2938ec3861 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -24,18 +24,19 @@ #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 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; @@ -360,13 +361,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; } @@ -380,6 +382,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), _T("got unsupported clipboard target") ); clipboard->m_sink->QueueEvent( event ); + clipboard->m_sink.Release(); return; } } @@ -403,8 +406,9 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), event->AddFormat( format ); } - + clipboard->m_sink->QueueEvent( event ); + clipboard->m_sink.Release(); } } @@ -436,7 +440,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 ); @@ -521,13 +525,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; }