// (there are quite a few of them, so don't enable this by default)
 static const wxChar *TRACE_DND = _T("dnd");
 
+extern GdkEvent *g_lastMouseEvent;
+
+extern int g_lastButtonNumber;
+
 //----------------------------------------------------------------------------
 // standard icons
 //----------------------------------------------------------------------------
     }
     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)
+    if (g_lastButtonNumber)
     {
         int action = GDK_ACTION_COPY;
         if ( flags & wxDrag_AllowMove )
         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;
 
             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;
 }
 
 
 // yet, defer setting the focus to idle time.
 wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
 
+// Save the last mouse event for drag start
+GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL;
+int g_lastButtonNumber = 0;
+
 extern bool g_mainThreadLocked;
 
 //-----------------------------------------------------------------------------
 {
     wxCOMMON_CALLBACK_PROLOGUE(gdk_event, win);
 
+    g_lastButtonNumber = gdk_event->button;
+
     if (win->m_wxwindow && (g_focusWindow != win) && win->AcceptsFocus())
     {
         gtk_widget_grab_focus( win->m_wxwindow );
         return FALSE;
     }
 
+    g_lastMouseEvent = (GdkEvent*) gdk_event;
+    
     wxMouseEvent event( event_type );
     InitMouseEvent( win, event, gdk_event );
 
 {
     wxCOMMON_CALLBACK_PROLOGUE(gdk_event, win);
 
+    g_lastButtonNumber = 0;
+
     wxEventType event_type = wxEVT_NULL;
 
     switch (gdk_event->button)
             return FALSE;
     }
 
+    g_lastMouseEvent = (GdkEvent*) gdk_event;
+    
     wxMouseEvent event( event_type );
     InitMouseEvent( win, event, gdk_event );
 
         gdk_event->y = y;
     }
 
+    g_lastMouseEvent = (GdkEvent*) gdk_event;
+
     wxMouseEvent event( wxEVT_MOTION );
     InitMouseEvent(win, event, gdk_event);