From: Rui Matos Date: Fri, 18 Aug 2017 10:01:54 +0000 (+0200) Subject: gdkwindow: Avoid re-setting the opaque region if it doesn't change X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~39^2~359 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=d17aeec08cb1ae633583c79f3015e635c943981b;p=gtk%2B3.0.git gdkwindow: Avoid re-setting the opaque region if it doesn't change 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 --- diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 8949daecb8..47d340b5eb 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -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) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 1c7ea5340c..c0e0a7d4b2 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -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)