gdkwindow: Avoid re-setting the opaque region if it doesn't change
authorRui Matos <tiagomatos@gmail.com>
Fri, 18 Aug 2017 10:01:54 +0000 (12:01 +0200)
committerRui Matos <tiagomatos@gmail.com>
Fri, 18 Aug 2017 16:58:19 +0000 (18:58 +0200)
This avoids, at least, needless chatter with the compositor and the X
server in X11's case.

https://bugzilla.gnome.org/show_bug.cgi?id=786469

gdk/gdkinternals.h
gdk/gdkwindow.c

index 8949daecb8fff2d403e5f8fee68ec2fd5563242c..47d340b5eb5cfda1ffa0601ead4658eb5ca0a2f6 100644 (file)
@@ -386,6 +386,8 @@ struct _GdkWindow
   GdkWindowInvalidateHandlerFunc invalidate_handler;
 
   GdkDrawingContext *drawing_context;
+
+  cairo_region_t *opaque_region;
 };
 
 #define GDK_WINDOW_TYPE(d) ((((GdkWindow *)(d)))->window_type)
index 1c7ea5340cc0c8ea62bc8fad33fcccf7eed489ad..c0e0a7d4b2b7bd3e01d2d39722eec64f38c77677 100644 (file)
@@ -588,6 +588,9 @@ gdk_window_finalize (GObject *object)
   if (window->devices_inside)
     g_list_free (window->devices_inside);
 
+  if (window->opaque_region)
+    cairo_region_destroy (window->opaque_region);
+
   G_OBJECT_CLASS (gdk_window_parent_class)->finalize (object);
 }
 
@@ -11879,6 +11882,14 @@ gdk_window_set_opaque_region (GdkWindow      *window,
   g_return_if_fail (GDK_IS_WINDOW (window));
   g_return_if_fail (!GDK_WINDOW_DESTROYED (window));
 
+  if (cairo_region_equal (window->opaque_region, region))
+    return;
+
+  g_clear_pointer (&window->opaque_region, cairo_region_destroy);
+
+  if (region != NULL)
+    window->opaque_region = cairo_region_reference (region);
+
   impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
 
   if (impl_class->set_opaque_region)