]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dnd.cpp
moved some wxMimeTypeCommands methods into .cpp file from header, this generally...
[wxWidgets.git] / src / gtk / dnd.cpp
index 6ef44f891a2bb405b016da6016b844d7de6399b6..2a147ae6824693f850a2b422fc657fc8727ce64c 100644 (file)
@@ -39,10 +39,17 @@ extern bool g_blockEventsOnDrag;
 // the flags used for the last DoDragDrop()
 static long gs_flagsForDrag = 0;
 
+#ifdef __WXDEBUG__
 // 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");
+#endif
+
+// global variables because GTK+ DnD want to have the
+// mouse event that caused it
+extern GdkEvent *g_lastMouseEvent;
+extern int       g_lastButtonNumber;
 
 //----------------------------------------------------------------------------
 // standard icons
@@ -831,6 +838,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;
 
@@ -851,73 +866,36 @@ 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;
+    int action = GDK_ACTION_COPY;
+    if ( flags & wxDrag_AllowMove )
+        action |= GDK_ACTION_MOVE;
 
-#if wxUSE_THREADS
-    /* disable GUI threads */
-#endif
+    // VZ: as we already use g_blockEventsOnDrag it shouldn't be that bad
+    //     to use a global to pass the flags to the drop target but I'd
+    //     surely prefer a better way to do it
+    gs_flagsForDrag = flags;
 
-    /* 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;
-
-        // VZ: as we already use g_blockEventsOnDrag it shouldn't be that bad
-        //     to use a global to pass the flags to the drop target but I'd
-        //     surely prefer a better way to do it
-        gs_flagsForDrag = flags;
-
-        GdkDragContext *context = gtk_drag_begin( m_widget,
+    GdkDragContext *context = gtk_drag_begin( m_widget,
                 target_list,
                 (GdkDragAction)action,
-                button_number,  /* number of mouse button which started drag */
-                (GdkEvent*) &event );
-
-        m_dragContext = context;
+                g_lastButtonNumber,  // number of mouse button which started drag
+                (GdkEvent*) g_lastMouseEvent );
 
-        PrepareIcon( action, context );
+    m_dragContext = context;
 
-        while (m_waiting)
-            gtk_main_iteration();
+    PrepareIcon( action, context );
 
-        m_retValue = ConvertFromGTK(context->action);
-        if ( m_retValue == wxDragNone )
-            m_retValue = wxDragCancel;
-    }
+    while (m_waiting)
+        gtk_main_iteration();
 
-#if wxUSE_THREADS
-    /* re-enable GUI threads */
-#endif
+    m_retValue = ConvertFromGTK(context->action);
+    if ( m_retValue == wxDragNone )
+         m_retValue = wxDragCancel;
 
     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;
 }