GdkDisplay: handle multiple calls to _gdk_display_pause_events()
Since events can be paused independently for each window during processing, make _gdk_display_pause_events() count how many times it is called and only unpause when unpause_events() is called the same number of times. https://bugzilla.gnome.org/show_bug.cgi?id=685460
This commit is contained in:
@ -307,7 +307,7 @@ gdk_display_get_event (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
|
||||
if (display->events_paused)
|
||||
if (display->event_pause_count > 0)
|
||||
return NULL;
|
||||
|
||||
GDK_DISPLAY_GET_CLASS (display)->queue_events (display);
|
||||
@ -2008,10 +2008,17 @@ gdk_display_notify_startup_complete (GdkDisplay *display,
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_display_set_events_paused (GdkDisplay *display,
|
||||
gboolean events_paused)
|
||||
_gdk_display_pause_events (GdkDisplay *display)
|
||||
{
|
||||
display->events_paused = !!events_paused;
|
||||
display->event_pause_count++;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_display_unpause_events (GdkDisplay *display)
|
||||
{
|
||||
g_return_if_fail (display->event_pause_count > 0);
|
||||
|
||||
display->event_pause_count--;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@ -113,8 +113,9 @@ struct _GdkDisplay
|
||||
guint double_click_time; /* Maximum time between clicks in msecs */
|
||||
GdkDevice *core_pointer; /* Core pointer device */
|
||||
|
||||
guint event_pause_count; /* How many times events are blocked */
|
||||
|
||||
guint closed : 1; /* Whether this display has been closed */
|
||||
guint events_paused : 1; /* Whether events are blocked */
|
||||
guint flushing_events : 1; /* Inside gdk_display_flush_events */
|
||||
|
||||
GArray *touch_implicit_grabs;
|
||||
@ -298,8 +299,8 @@ void _gdk_display_pointer_info_foreach (GdkDisplay *display
|
||||
GdkDisplayPointerInfoForeach func,
|
||||
gpointer user_data);
|
||||
gulong _gdk_display_get_next_serial (GdkDisplay *display);
|
||||
void _gdk_display_set_events_paused (GdkDisplay *display,
|
||||
gboolean events_paused);
|
||||
void _gdk_display_pause_events (GdkDisplay *display);
|
||||
void _gdk_display_unpause_events (GdkDisplay *display);
|
||||
void _gdk_display_flush_events (GdkDisplay *display);
|
||||
void _gdk_display_event_data_copy (GdkDisplay *display,
|
||||
const GdkEvent *event,
|
||||
|
||||
@ -88,7 +88,7 @@ _gdk_event_queue_find_first (GdkDisplay *display)
|
||||
GList *tmp_list;
|
||||
GList *pending_motion = NULL;
|
||||
|
||||
if (display->events_paused)
|
||||
if (display->event_pause_count > 0)
|
||||
return NULL;
|
||||
|
||||
tmp_list = display->queued_events;
|
||||
|
||||
@ -11620,7 +11620,7 @@ gdk_window_flush_events (GdkFrameClock *clock,
|
||||
|
||||
display = gdk_window_get_display (window);
|
||||
_gdk_display_flush_events (display);
|
||||
_gdk_display_set_events_paused (display, TRUE);
|
||||
_gdk_display_pause_events (display);
|
||||
|
||||
gdk_frame_clock_request_phase (clock, GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS);
|
||||
}
|
||||
@ -11648,7 +11648,7 @@ gdk_window_resume_events (GdkFrameClock *clock,
|
||||
window = GDK_WINDOW (data);
|
||||
|
||||
display = gdk_window_get_display (window);
|
||||
_gdk_display_set_events_paused (display, FALSE);
|
||||
_gdk_display_unpause_events (display);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user