]> Pileus Git - ~andy/gtk/commitdiff
GdkDisplay: handle multiple calls to _gdk_display_pause_events()
authorOwen W. Taylor <otaylor@fishsoup.net>
Sun, 7 Oct 2012 18:13:56 +0000 (14:13 -0400)
committerOwen W. Taylor <otaylor@fishsoup.net>
Thu, 14 Feb 2013 22:19:50 +0000 (17:19 -0500)
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

gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h
gdk/gdkevents.c
gdk/gdkwindow.c

index bded54aecb131eb171f4975a0815750ce8c1367b..79d162b2a9df6261ac18b4612e2b8904ab82646a 100644 (file)
@@ -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
index 8f448eba77f484846765d35e199881a50d893044..b4559eb4cb3634247019ef0466fae4bbd1d5d5d6 100644 (file)
@@ -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,
index d068e13c2bfb150fc8e80a319093a206f7676b01..8e05a8edcde71972265144bf81b16826f0a0fe88 100644 (file)
@@ -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;
index 0ac0cfeda0813d257d2a8cc45b343e1567990612..211f8fd9ee437f8b1495020a858a94f0d75a6722 100644 (file)
@@ -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);
 }
 
 /**