Avoid blocking paint events from long-running mouse event handlers

If a mouse event handler calls Refresh(), increase the likelyhood that a
paint event can be issued before the next mouse event occurs, by requesting
more mouse events from the the end of the handler rather than the start.
See #18314
This commit is contained in:
Paul Cornett
2018-12-31 10:45:44 -08:00
parent 974c75272c
commit 942362063d

View File

@@ -1815,19 +1815,6 @@ gtk_window_motion_notify_callback( GtkWidget * WXUNUSED(widget),
wxCOMMON_CALLBACK_PROLOGUE(gdk_event, win);
if (gdk_event->is_hint)
{
int x = 0;
int y = 0;
#ifdef __WXGTK3__
gdk_window_get_device_position(gdk_event->window, gdk_event->device, &x, &y, NULL);
#else
gdk_window_get_pointer(gdk_event->window, &x, &y, NULL);
#endif
gdk_event->x = x;
gdk_event->y = y;
}
g_lastMouseEvent = (GdkEvent*) gdk_event;
wxMouseEvent event( wxEVT_MOTION );
@@ -1875,6 +1862,20 @@ gtk_window_motion_notify_callback( GtkWidget * WXUNUSED(widget),
g_lastMouseEvent = NULL;
// Request additional motion events. Done at the end to increase the
// chances that lower priority events requested by the handler above, such
// as painting, can be processed before the next motion event occurs.
// Otherwise a long-running handler can cause paint events to be entirely
// blocked while the mouse is moving.
if (gdk_event->is_hint)
{
#ifdef __WXGTK3__
gdk_event_request_motions(gdk_event);
#else
gdk_window_get_pointer(gdk_event->window, NULL, NULL, NULL);
#endif
}
return ret;
}