[gtk+] Only update surface spec when there is no spec change pending
- From: William Hua <williamhua src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Only update surface spec when there is no spec change pending
- Date: Wed, 10 Aug 2016 18:00:56 +0000 (UTC)
commit 6dfb554558baf34b321fbdc8ff941297c8eb323a
Author: Andreas Pokorny <andreas pokorny canonical com>
Date: Tue Jul 19 14:53:22 2016 +0200
Only update surface spec when there is no spec change pending
gdk/mir/gdkmirwindowimpl.c | 36 +++++++++++++++++++++++++++++++-----
1 files changed, 31 insertions(+), 5 deletions(-)
---
diff --git a/gdk/mir/gdkmirwindowimpl.c b/gdk/mir/gdkmirwindowimpl.c
index 791cb45..3164773 100644
--- a/gdk/mir/gdkmirwindowimpl.c
+++ b/gdk/mir/gdkmirwindowimpl.c
@@ -86,6 +86,7 @@ struct _GdkMirWindowImpl
/* TRUE if cursor is inside this window */
gboolean cursor_inside;
+ gboolean pending_spec_update;
gint output_scale;
};
@@ -117,6 +118,8 @@ _gdk_mir_window_impl_new (GdkDisplay *display, GdkWindow *window, GdkWindowAttr
if (attributes && attributes_mask & GDK_WA_TYPE_HINT)
impl->type_hint = attributes->type_hint;
+ impl->pending_spec_update = TRUE;
+
return (GdkWindowImpl *) impl;
}
@@ -174,12 +177,18 @@ static void
set_surface_state (GdkMirWindowImpl *impl,
MirSurfaceState state)
{
+ MirConnection *connection = gdk_mir_display_get_mir_connection (impl->display);
if (impl->surface_state == state)
return;
impl->surface_state = state;
- if (impl->surface)
- mir_surface_set_state (impl->surface, state);
+ if (impl->surface && !impl->pending_spec_update)
+ {
+ MirSurfaceSpec *spec = mir_connection_create_spec_for_changes (connection);
+ mir_surface_spec_set_state (spec, state);
+ mir_surface_apply_spec (impl->surface, spec);
+ mir_surface_spec_release (spec);
+ }
}
static void
@@ -328,6 +337,7 @@ update_surface_spec (GdkWindow *window)
mir_surface_apply_spec (impl->surface, spec);
mir_surface_spec_release (spec);
+ impl->pending_spec_update = FALSE;
impl->buffer_stream = mir_surface_get_buffer_stream (impl->surface);
}
@@ -385,7 +395,11 @@ ensure_surface_full (GdkWindow *window,
MirSurfaceSpec *spec;
if (impl->surface)
- return;
+ {
+ if (impl->pending_spec_update)
+ update_surface_spec(window);
+ return;
+ }
/* no destroy notify -- we must leak for now
* https://bugs.launchpad.net/mir/+bug/1324100
@@ -398,6 +412,8 @@ ensure_surface_full (GdkWindow *window,
impl->surface = mir_surface_create_sync (spec);
mir_surface_spec_release(spec);
+
+ impl->pending_spec_update = FALSE;
impl->buffer_stream = mir_surface_get_buffer_stream (impl->surface);
/* FIXME: can't make an initial resize event */
@@ -470,6 +486,10 @@ send_buffer (GdkWindow *window)
/* The Cairo context is no longer valid */
g_clear_pointer (&impl->cairo_surface, cairo_surface_destroy);
+ if (impl->pending_spec_update)
+ update_surface_spec (window);
+
+ impl->pending_spec_update = FALSE;
}
static cairo_surface_t *
@@ -689,6 +709,7 @@ gdk_mir_window_impl_move_resize (GdkWindow *window,
/* We accept any resize */
window->width = width;
window->height = height;
+ impl->pending_spec_update = TRUE;
}
/* Transient windows can move wherever they want */
@@ -699,7 +720,8 @@ gdk_mir_window_impl_move_resize (GdkWindow *window,
impl->has_rect = FALSE;
impl->transient_x = x;
impl->transient_y = y;
- update_surface_spec (window);
+ if (!impl->pending_spec_update && impl->surface)
+ update_surface_spec (window);
}
}
}
@@ -973,7 +995,8 @@ gdk_mir_window_impl_set_type_hint (GdkWindow *window,
if (hint != impl->type_hint)
{
impl->type_hint = hint;
- update_surface_spec (window);
+ if (impl->surface && !impl->pending_spec_update)
+ update_surface_spec (window);
}
}
@@ -1056,6 +1079,9 @@ gdk_mir_window_impl_set_transient_for (GdkWindow *window,
/* Link this window to the parent */
impl->transient_for = parent;
+
+ if (impl->surface && !impl->pending_spec_update)
+ update_surface_spec (window);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]