From 86f19f7ce546b37e69a710d3f1140b8a7463239d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 3 Nov 2007 21:46:55 +0000 Subject: [PATCH] handle failure of gtk_drag_begin() (which can happen e.g. because gdk_pointer_grab() failed) in DoDragDrop() (patch 1825237) + minor cleanup in trunk version of the code git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49608 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/dnd.h | 9 +++++---- src/gtk/dnd.cpp | 29 ++++++++++++++++++----------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/include/wx/gtk/dnd.h b/include/wx/gtk/dnd.h index f4cd2992d2..6f877727bc 100644 --- a/include/wx/gtk/dnd.h +++ b/include/wx/gtk/dnd.h @@ -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_ diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index c995a53350..431141ef46 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -23,6 +23,8 @@ #include "wx/gdicmn.h" #endif +#include "wx/scopeguard.h" + #include //---------------------------------------------------------------------------- @@ -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); -- 2.45.2