]> git.saurik.com Git - wxWidgets.git/commitdiff
handle failure of gtk_drag_begin() (which can happen e.g. because gdk_pointer_grab...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 3 Nov 2007 21:46:55 +0000 (21:46 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 3 Nov 2007 21:46:55 +0000 (21:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49608 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/dnd.h
src/gtk/dnd.cpp

index f4cd2992d2f2e8919e45e6963f77c0312deceba0..6f877727bc6703a6ae43b7123822f1ecf2484474 100644 (file)
@@ -80,10 +80,6 @@ public:
     // start drag action
     virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly);
 
-    // GTK implementation
-    void RegisterWindow();
-    void UnregisterWindow();
-
     void PrepareIcon( int action, GdkDragContext *context );
 
     GtkWidget       *m_widget;
@@ -103,6 +99,11 @@ private:
     void SetIcons(const wxIcon& copy,
                   const wxIcon& move,
                   const wxIcon& none);
+
+    // GTK implementation
+    void GTKConnectDragSignals();
+    void GTKDisconnectDragSignals();
+
 };
 
 #endif // _WX_GTK_DND_H_
index c995a53350540539662f9447732e92b362aee5e8..431141ef464c92a98d2ba333971b36034cf47812 100644 (file)
@@ -23,6 +23,8 @@
     #include "wx/gdicmn.h"
 #endif
 
+#include "wx/scopeguard.h"
+
 #include <gtk/gtk.h>
 
 //----------------------------------------------------------------------------
@@ -813,10 +815,8 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
     if (g_lastMouseEvent == NULL)
         return wxDragNone;
 
-    // disabled for now
-    g_blockEventsOnDrag = true;
-
-    RegisterWindow();
+    GTKConnectDragSignals();
+    wxON_BLOCK_EXIT_OBJ0(*this, wxDropSource::GTKDisconnectDragSignals);
 
     m_waiting = true;
 
@@ -850,6 +850,12 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
                 g_lastButtonNumber,  // number of mouse button which started drag
                 (GdkEvent*) g_lastMouseEvent );
 
+    if ( !context )
+    {
+        // this can happen e.g. if gdk_pointer_grab() failed
+        return wxDragError;
+    }
+
     m_dragContext = context;
 
     PrepareIcon( action, context );
@@ -861,16 +867,15 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
     if ( m_retValue == wxDragNone )
          m_retValue = wxDragCancel;
 
-    g_blockEventsOnDrag = false;
-
-    UnregisterWindow();
-
     return m_retValue;
 }
 
-void wxDropSource::RegisterWindow()
+void wxDropSource::GTKConnectDragSignals()
 {
-    if (!m_widget) return;
+    if (!m_widget)
+        return;
+
+    g_blockEventsOnDrag = true;
 
     g_signal_connect (m_widget, "drag_data_get",
                       G_CALLBACK (source_drag_data_get), this);
@@ -879,11 +884,13 @@ void wxDropSource::RegisterWindow()
 
 }
 
-void wxDropSource::UnregisterWindow()
+void wxDropSource::GTKDisconnectDragSignals()
 {
     if (!m_widget)
         return;
 
+    g_blockEventsOnDrag = false;
+
     g_signal_handlers_disconnect_by_func (m_widget,
                                           (gpointer) source_drag_data_get,
                                           this);