From 789d2027202b5824cfa35556d739ff2b886e32bc Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Sun, 26 Mar 2023 15:57:56 +0100 Subject: [PATCH 1/2] gdk: Swap Cairo calls when reading back from a GdkWindow First we flush the surface, then we mark it dirty. Don't look at me: this makes sense in Cairo, apparently. Fixes: #5691 --- gdk/gdkpixbuf-drawable.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c index ee88abe3b3..e6fda26880 100644 --- a/gdk/gdkpixbuf-drawable.c +++ b/gdk/gdkpixbuf-drawable.c @@ -104,16 +104,19 @@ gdk_pixbuf_get_from_window (GdkWindow *src, * by external applications. * * So be on the safe side and: + * - flush the Cairo state * - mark the surface as dirty, in case the GdkWindow was * created from a foreign X11 surface - * - flush the Cairo state + * + * THE ORDER IS IMPORTANT. DO NOT CHANGE IT. * * For reference, see: * - https://bugzilla.gnome.org/show_bug.cgi?id=754952 * - https://gitlab.gnome.org/GNOME/gtk/-/issues/4456 + * - https://gitlab.gnome.org/GNOME/gtk/-/issues/5691 */ - cairo_surface_mark_dirty (surface); cairo_surface_flush (surface); + cairo_surface_mark_dirty (surface); if (cairo_surface_get_content (surface) & CAIRO_CONTENT_ALPHA) copy = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width * scale, height * scale); From bda80c4e41ec7d7d9a8fc89371757c8967ab4d95 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Sun, 26 Mar 2023 15:59:14 +0100 Subject: [PATCH 2/2] docs: Try to steer people away from gdk_pixbuf_get_from_window() It's a bad function, and people should feel bad about using it. --- gdk/gdkpixbuf-drawable.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/gdk/gdkpixbuf-drawable.c b/gdk/gdkpixbuf-drawable.c index e6fda26880..f3ce3d948a 100644 --- a/gdk/gdkpixbuf-drawable.c +++ b/gdk/gdkpixbuf-drawable.c @@ -51,9 +51,11 @@ * @height: Height in pixels of region to get * * Transfers image data from a #GdkWindow and converts it to an RGB(A) - * representation inside a #GdkPixbuf. In other words, copies - * image data from a server-side drawable to a client-side RGB(A) buffer. - * This allows you to efficiently read individual pixels on the client side. + * representation inside a #GdkPixbuf. + * + * In other words, copies image data from a server-side drawable to a + * client-side RGB(A) buffer. This allows you to efficiently read + * individual pixels on the client side. * * This function will create an RGB pixbuf with 8 bits per channel with * the size specified by the @width and @height arguments scaled by the @@ -62,7 +64,8 @@ * * If the window is off the screen, then there is no image data in the * obscured/offscreen regions to be placed in the pixbuf. The contents of - * portions of the pixbuf corresponding to the offscreen region are undefined. + * portions of the pixbuf corresponding to the offscreen region are + * undefined. * * If the window you’re obtaining data from is partially obscured by * other windows, then the contents of the pixbuf areas corresponding @@ -74,11 +77,13 @@ * If memory can’t be allocated for the return value, %NULL will be returned * instead. * - * (In short, there are several ways this function can fail, and if it fails - * it returns %NULL; so check the return value.) + * In short, there are several ways this function can fail, and if it fails + * it returns %NULL; so check the return value. + * + * You should rarely, if ever, need to call this function. * * Returns: (nullable) (transfer full): A newly-created pixbuf with a - * reference count of 1, or %NULL on error + * reference count of 1, or %NULL on error */ GdkPixbuf * gdk_pixbuf_get_from_window (GdkWindow *src,