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:
parent
bef5e9e5f6
commit
86f19f7ce5
@ -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_
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user