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
This commit is contained in:
Vadim Zeitlin
2007-11-03 21:46:55 +00:00
parent bef5e9e5f6
commit 86f19f7ce5
2 changed files with 23 additions and 15 deletions

View File

@@ -80,10 +80,6 @@ public:
// start drag action // start drag action
virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly); virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly);
// GTK implementation
void RegisterWindow();
void UnregisterWindow();
void PrepareIcon( int action, GdkDragContext *context ); void PrepareIcon( int action, GdkDragContext *context );
GtkWidget *m_widget; GtkWidget *m_widget;
@@ -103,6 +99,11 @@ private:
void SetIcons(const wxIcon& copy, void SetIcons(const wxIcon& copy,
const wxIcon& move, const wxIcon& move,
const wxIcon& none); const wxIcon& none);
// GTK implementation
void GTKConnectDragSignals();
void GTKDisconnectDragSignals();
}; };
#endif // _WX_GTK_DND_H_ #endif // _WX_GTK_DND_H_

View File

@@ -23,6 +23,8 @@
#include "wx/gdicmn.h" #include "wx/gdicmn.h"
#endif #endif
#include "wx/scopeguard.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -813,10 +815,8 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
if (g_lastMouseEvent == NULL) if (g_lastMouseEvent == NULL)
return wxDragNone; return wxDragNone;
// disabled for now GTKConnectDragSignals();
g_blockEventsOnDrag = true; wxON_BLOCK_EXIT_OBJ0(*this, wxDropSource::GTKDisconnectDragSignals);
RegisterWindow();
m_waiting = true; m_waiting = true;
@@ -850,6 +850,12 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
g_lastButtonNumber, // number of mouse button which started drag g_lastButtonNumber, // number of mouse button which started drag
(GdkEvent*) g_lastMouseEvent ); (GdkEvent*) g_lastMouseEvent );
if ( !context )
{
// this can happen e.g. if gdk_pointer_grab() failed
return wxDragError;
}
m_dragContext = context; m_dragContext = context;
PrepareIcon( action, context ); PrepareIcon( action, context );
@@ -861,16 +867,15 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
if ( m_retValue == wxDragNone ) if ( m_retValue == wxDragNone )
m_retValue = wxDragCancel; m_retValue = wxDragCancel;
g_blockEventsOnDrag = false;
UnregisterWindow();
return m_retValue; 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_signal_connect (m_widget, "drag_data_get",
G_CALLBACK (source_drag_data_get), this); G_CALLBACK (source_drag_data_get), this);
@@ -879,11 +884,13 @@ void wxDropSource::RegisterWindow()
} }
void wxDropSource::UnregisterWindow() void wxDropSource::GTKDisconnectDragSignals()
{ {
if (!m_widget) if (!m_widget)
return; return;
g_blockEventsOnDrag = false;
g_signal_handlers_disconnect_by_func (m_widget, g_signal_handlers_disconnect_by_func (m_widget,
(gpointer) source_drag_data_get, (gpointer) source_drag_data_get,
this); this);