X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9fecabb76a55117670269db3f461c6729e796d7d..8064223b7b1b3657363b7a635c381b9269d95e55:/src/gtk1/dnd.cpp diff --git a/src/gtk1/dnd.cpp b/src/gtk1/dnd.cpp index d24aa7a952..47ce58b017 100644 --- a/src/gtk1/dnd.cpp +++ b/src/gtk1/dnd.cpp @@ -56,7 +56,12 @@ static long gs_flagsForDrag = 0; // the trace mask we use with wxLogTrace() - call // wxLog::AddTraceMask(TRACE_DND) to enable the trace messages from here // (there are quite a few of them, so don't enable this by default) -static const wxChar *TRACE_DND = _T("dnd"); +#define TRACE_DND _T("dnd") + +// global variables because GTK+ DnD want to have the +// mouse event that caused it +extern GdkEvent *g_lastMouseEvent; +extern int g_lastButtonNumber; //---------------------------------------------------------------------------- // standard icons @@ -672,7 +677,7 @@ source_drag_data_get (GtkWidget *WXUNUSED(widget), extern "C" { static void source_drag_data_delete( GtkWidget *WXUNUSED(widget), - GdkDragContext *context, + GdkDragContext *WXUNUSED(context), wxDropSource *WXUNUSED(drop_source) ) { if (g_isIdle) @@ -851,6 +856,14 @@ wxDragResult wxDropSource::DoDragDrop(int flags) if (g_blockEventsOnDrag) return wxDragNone; + // don't start dragging if no button is down + if (g_lastButtonNumber == 0) + return wxDragNone; + + // we can only start a drag after a mouse event + if (g_lastMouseEvent == NULL) + return wxDragNone; + // disabled for now g_blockEventsOnDrag = true; @@ -871,30 +884,6 @@ wxDragResult wxDropSource::DoDragDrop(int flags) } delete[] array; - GdkEventMotion event; - event.window = m_widget->window; - int x = 0; - int y = 0; - GdkModifierType state; - gdk_window_get_pointer( event.window, &x, &y, &state ); - event.x = x; - event.y = y; - event.state = state; - event.time = (guint32)GDK_CURRENT_TIME; - - /* GTK wants to know which button was pressed which caused the dragging */ - int button_number = 0; - if (event.state & GDK_BUTTON1_MASK) button_number = 1; - else if (event.state & GDK_BUTTON2_MASK) button_number = 2; - else if (event.state & GDK_BUTTON3_MASK) button_number = 3; - -#if wxUSE_THREADS - /* disable GUI threads */ -#endif - - /* don't start dragging if no button is down */ - if (button_number) - { int action = GDK_ACTION_COPY; if ( flags & wxDrag_AllowMove ) action |= GDK_ACTION_MOVE; @@ -907,8 +896,8 @@ wxDragResult wxDropSource::DoDragDrop(int flags) GdkDragContext *context = gtk_drag_begin( m_widget, target_list, (GdkDragAction)action, - button_number, /* number of mouse button which started drag */ - (GdkEvent*) &event ); + g_lastButtonNumber, // number of mouse button which started drag + (GdkEvent*) g_lastMouseEvent ); m_dragContext = context; @@ -920,24 +909,11 @@ wxDragResult wxDropSource::DoDragDrop(int flags) m_retValue = ConvertFromGTK(context->action); if ( m_retValue == wxDragNone ) m_retValue = wxDragCancel; - } - -#if wxUSE_THREADS - /* re-enable GUI threads */ -#endif g_blockEventsOnDrag = false; UnregisterWindow(); - // this shouldn't be needed but somehow, sometimes, without this the cursor - // stays grabbed even when the DND operation ends and the application - // becomes unresponsive and has to be killed resulting in loss of all - // unsaved data, so while this fix is ugly it's still better than - // alternative - if ( gdk_pointer_is_grabbed() ) - gdk_pointer_ungrab(GDK_CURRENT_TIME); - return m_retValue; }