From b47056410d59b7789636906dcfae119e4f6f1100 Mon Sep 17 00:00:00 2001 From: Robert Roebling <robert@roebling.de> Date: Tue, 23 Dec 2008 20:46:46 +0000 Subject: [PATCH] Don't allow concurrent requests, check return message of async request git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57518 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/clipboard/clipboard.cpp | 9 +++++++-- src/gtk/clipbrd.cpp | 9 ++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/samples/clipboard/clipboard.cpp b/samples/clipboard/clipboard.cpp index 6a20dea42c..3843e7ab2c 100644 --- a/samples/clipboard/clipboard.cpp +++ b/samples/clipboard/clipboard.cpp @@ -27,7 +27,7 @@ #endif -#define USE_ASYNCHRONOUS_CLIPBOARD_REQUEST 0 +#define USE_ASYNCHRONOUS_CLIPBOARD_REQUEST 1 class MyApp : public wxApp { @@ -167,7 +167,12 @@ void MyFrame::OnUpdateUI(wxUpdateUIEvent&event) #if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST if (m_request == Idle) { - wxTheClipboard->IsSupportedAsync( this ); + if (!wxTheClipboard->IsSupportedAsync( this )) + { + // request failed, try again later + event.Enable( m_clipboardSupportsText ); // not yet known, assume last value + return; + } m_request = Waiting; event.Enable( m_clipboardSupportsText ); // not yet known, assume last value } diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 55a2ba66c6..15ffd8be44 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -367,6 +367,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), if ( !selection_data || selection_data->length <= 0 ) { clipboard->m_sink->QueueEvent( event ); + clipboard->m_sink.Release(); return; } @@ -380,6 +381,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), _T("got unsupported clipboard target") ); clipboard->m_sink->QueueEvent( event ); + clipboard->m_sink.Release(); return; } } @@ -405,6 +407,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), } clipboard->m_sink->QueueEvent( event ); + clipboard->m_sink.Release(); } } @@ -521,8 +524,12 @@ 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, -- 2.47.2