From fba09dbfc723c5434c3e238b2e1bf374c91b9e61 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Sun, 12 Feb 2023 19:18:00 +0000 Subject: [PATCH] Mark surface as dirty before flushing it If we're trying to read back the contents of a GdkWindow that was created from a foreign windowing system surface, we are going to forcibly mark it as dirty before flushing the Cairo state. To avoid regressing any further in the future of the 3.x branch, let's leave a comment. Fixes: #5482 --- gdk/gdkpixbuf-drawable.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c index e63c3a8713..ee88abe3b3 100644 --- a/gdk/gdkpixbuf-drawable.c +++ b/gdk/gdkpixbuf-drawable.c @@ -102,8 +102,17 @@ gdk_pixbuf_get_from_window (GdkWindow *src, /* We do not know what happened to this surface outside of GDK. * Especially for foreign windows, they will have been modified * by external applications. + * * So be on the safe side and: + * - mark the surface as dirty, in case the GdkWindow was + * created from a foreign X11 surface + * - flush the Cairo state + * + * For reference, see: + * - https://bugzilla.gnome.org/show_bug.cgi?id=754952 + * - https://gitlab.gnome.org/GNOME/gtk/-/issues/4456 */ + cairo_surface_mark_dirty (surface); cairo_surface_flush (surface); if (cairo_surface_get_content (surface) & CAIRO_CONTENT_ALPHA)