]> git.saurik.com Git - wxWidgets.git/commitdiff
backported changes from gtk/window.cpp 1.679 and dnd.cpp 1.116 checking that the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Dec 2006 13:59:27 +0000 (13:59 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Dec 2006 13:59:27 +0000 (13:59 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk1/dnd.cpp
src/gtk1/window.cpp

index 2295ecef460d9e69b9818aa91d5def1105ec7688..38e37d4e634395ca0de4f0feffa0c852f774ca13 100644 (file)
@@ -53,13 +53,16 @@ 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;
 
 //----------------------------------------------------------------------------
@@ -855,6 +858,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;
 
@@ -875,9 +886,6 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
     }
     delete[] array;
 
-    /* don't start dragging if no button is down */
-    if (g_lastButtonNumber)
-    {
         int action = GDK_ACTION_COPY;
         if ( flags & wxDrag_AllowMove )
             action |= GDK_ACTION_MOVE;
@@ -903,7 +911,6 @@ wxDragResult wxDropSource::DoDragDrop(int flags)
         m_retValue = ConvertFromGTK(context->action);
         if ( m_retValue == wxDragNone )
             m_retValue = wxDragCancel;
-    }
 
     g_blockEventsOnDrag = false;
 
index 25864e277a961737cc60015eb05fa57d587198cc..12b9216ad7d22421ffb5bc7e67e886323643dad5 100644 (file)
@@ -225,7 +225,8 @@ wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
 // the last click here (extern: used from gtk/menu.cpp)
 guint32 wxGtkTimeLastClick = 0;
 
-// Save the last mouse event for drag start
+// global variables because GTK+ DnD want to have the
+// mouse event that caused it
 GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL;
 int g_lastButtonNumber = 0;
 
@@ -1615,8 +1616,10 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
     if (win->GetEventHandler()->ProcessEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" );
+        g_lastMouseEvent = NULL;
         return TRUE;
     }
+    g_lastMouseEvent = NULL;
 
     if (event_type == wxEVT_RIGHT_DOWN)
     {
@@ -1773,13 +1776,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
         win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
     }
 
-    if (win->GetEventHandler()->ProcessEvent( event ))
+    bool ret = win->GetEventHandler()->ProcessEvent( event );
+    g_lastMouseEvent = NULL;
+
+    if ( ret )
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" );
-        return TRUE;
     }
 
-    return FALSE;
+    return ret ? TRUE : FALSE;
 }
 }