[gtk+/wip/garnacho/window-dragging: 1/7] wayland: Thaw the clock if we hide a GdkWindow mid-frame
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/garnacho/window-dragging: 1/7] wayland: Thaw the clock if we hide a GdkWindow mid-frame
- Date: Wed, 25 Feb 2015 19:39:29 +0000 (UTC)
commit bd268bd4d21d01c682b7f1bb59f4e23edb016aac
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Feb 25 14:46:54 2015 +0100
wayland: Thaw the clock if we hide a GdkWindow mid-frame
When a window is hidden, its surface and all its roles are destroyed,
if this happens when we already issued a wl_surface_commit and are
awaiting for a frame callback, the clock will remain frozen for the
next time the window is shown.
To avoid this, keep track of the wl_surface_frame() calls issued,
and ensure the clock is thawed after hiding. If we happen to receive
the frame callback, it is just ignored.
https://bugzilla.gnome.org/show_bug.cgi?id=743427
gdk/wayland/gdkwindow-wayland.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 23d6d08..d10b152 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -107,6 +107,7 @@ struct _GdkWindowImplWayland
unsigned int mapped : 1;
unsigned int use_custom_surface : 1;
unsigned int pending_commit : 1;
+ unsigned int awaiting_frame : 1;
GdkWindowTypeHint hint;
GdkWindow *transient_for;
@@ -320,6 +321,10 @@ frame_callback (void *data,
if (GDK_WINDOW_DESTROYED (window))
return;
+ if (!impl->awaiting_frame)
+ return;
+
+ impl->awaiting_frame = FALSE;
_gdk_frame_clock_thaw (clock);
timings = gdk_frame_clock_get_timings (clock, impl->pending_frame_counter);
@@ -397,6 +402,7 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
impl->pending_commit = FALSE;
impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
+ impl->awaiting_frame = TRUE;
callback = wl_surface_frame (impl->surface);
wl_callback_add_listener (callback, &frame_listener, window);
@@ -1238,6 +1244,12 @@ gdk_wayland_window_hide_surface (GdkWindow *window)
impl->subsurface = NULL;
}
+ if (impl->awaiting_frame)
+ {
+ impl->awaiting_frame = FALSE;
+ _gdk_frame_clock_thaw (gdk_window_get_frame_clock (window));
+ }
+
wl_surface_destroy (impl->surface);
impl->surface = NULL;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]