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