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
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_

View 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);