From: Owen W. Taylor Date: Sun, 7 Oct 2012 18:13:56 +0000 (-0400) Subject: GdkDisplay: handle multiple calls to _gdk_display_pause_events() X-Git-Url: http://pileus.org/git/?p=~andy%2Fgtk;a=commitdiff_plain;h=e4aa9f05ae6e9b55d696f43c64ea61d91f8a1671 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 --- diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index bded54aec..79d162b2a 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -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 diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index 8f448eba7..b4559eb4c 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -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, diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index d068e13c2..8e05a8edc 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -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; diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 0ac0cfeda..211f8fd9e 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -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); } /**