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:
Owen W. Taylor
2012-10-07 14:13:56 -04:00
parent d446dda920
commit e4aa9f05ae
4 changed files with 18 additions and 10 deletions

View 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

View 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,

View 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;

View 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);
}
/**