git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49608
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// start drag action
virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly);
// 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;
void PrepareIcon( int action, GdkDragContext *context );
GtkWidget *m_widget;
void SetIcons(const wxIcon& copy,
const wxIcon& move,
const wxIcon& none);
void SetIcons(const wxIcon& copy,
const wxIcon& move,
const wxIcon& none);
+
+ // GTK implementation
+ void GTKConnectDragSignals();
+ void GTKDisconnectDragSignals();
+
};
#endif // _WX_GTK_DND_H_
};
#endif // _WX_GTK_DND_H_
#include "wx/gdicmn.h"
#endif
#include "wx/gdicmn.h"
#endif
+#include "wx/scopeguard.h"
+
#include <gtk/gtk.h>
//----------------------------------------------------------------------------
#include <gtk/gtk.h>
//----------------------------------------------------------------------------
if (g_lastMouseEvent == NULL)
return wxDragNone;
if (g_lastMouseEvent == NULL)
return wxDragNone;
- // disabled for now
- g_blockEventsOnDrag = true;
-
- RegisterWindow();
+ GTKConnectDragSignals();
+ wxON_BLOCK_EXIT_OBJ0(*this, wxDropSource::GTKDisconnectDragSignals);
g_lastButtonNumber, // number of mouse button which started drag
(GdkEvent*) g_lastMouseEvent );
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 );
m_dragContext = context;
PrepareIcon( action, context );
if ( m_retValue == wxDragNone )
m_retValue = wxDragCancel;
if ( m_retValue == wxDragNone )
m_retValue = wxDragCancel;
- g_blockEventsOnDrag = false;
-
- UnregisterWindow();
-
-void wxDropSource::RegisterWindow()
+void wxDropSource::GTKConnectDragSignals()
+ if (!m_widget)
+ return;
+
+ g_blockEventsOnDrag = true;
g_signal_connect (m_widget, "drag_data_get",
G_CALLBACK (source_drag_data_get), this);
g_signal_connect (m_widget, "drag_data_get",
G_CALLBACK (source_drag_data_get), this);
-void wxDropSource::UnregisterWindow()
+void wxDropSource::GTKDisconnectDragSignals()
+ g_blockEventsOnDrag = false;
+
g_signal_handlers_disconnect_by_func (m_widget,
(gpointer) source_drag_data_get,
this);
g_signal_handlers_disconnect_by_func (m_widget,
(gpointer) source_drag_data_get,
this);