[gtk+] Only update surface spec when there is no spec change pending



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]