From ba5ba3b022d6811c886501fb015e99ce8ee80138 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 1 Sep 2010 00:59:56 +0200 Subject: [PATCH] gdk: Ensure flush of surface when cairo_t is destroyed Add an ugly workaround because GTK does not ensure surfaces get flushed before directly accessing the drawable backed by the surface. This is not visible on X11 (where flushing is a no-op), but can be seen on Windows. https://bugzilla.gnome.org/show_bug.cgi?id=628291 --- gdk/gdkcairo.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/gdk/gdkcairo.c b/gdk/gdkcairo.c index ef8ec25627..e1d0dafb54 100644 --- a/gdk/gdkcairo.c +++ b/gdk/gdkcairo.c @@ -23,6 +23,13 @@ #include "gdkregion-generic.h" #include "gdkalias.h" +static void +gdk_ensure_surface_flush (gpointer surface) +{ + cairo_surface_flush (surface); + cairo_surface_destroy (surface); +} + /** * gdk_cairo_create: * @drawable: a #GdkDrawable @@ -43,6 +50,7 @@ cairo_t * gdk_cairo_create (GdkDrawable *drawable) { + static const cairo_user_data_key_t key; cairo_surface_t *surface; cairo_t *cr; @@ -54,7 +62,12 @@ gdk_cairo_create (GdkDrawable *drawable) if (GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip) GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip (drawable, cr); - cairo_surface_destroy (surface); + /* Ugly workaround for GTK not ensuring to flush surfaces before + * directly accessing the drawable backed by the surface. Not visible + * on X11 (where flushing is a no-op). For details, see + * https://bugzilla.gnome.org/show_bug.cgi?id=628291 + */ + cairo_set_user_data (cr, &key, surface, gdk_ensure_surface_flush); return cr; }