// (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);