diff options
author | Ray Strode <rstrode@redhat.com> | 2019-08-05 14:39:21 -0400 |
---|---|---|
committer | Jonas Ã…dahl <jadahl@gmail.com> | 2019-08-27 18:47:41 +0300 |
commit | 556e7694de0144ee940f4d7144dfaca5141ed6d5 (patch) | |
tree | b220fa330b6de14de91f0f02d633221346703786 | |
parent | 1a5cba5df52bd4fb780cf637811e238941033b63 (diff) | |
download | mutter-556e7694de0144ee940f4d7144dfaca5141ed6d5.tar.gz |
iconcache: Avoid xrender picture formats when creating cairo surface
If an application provides its window icon via wmhints, then mutter
loads the pixmap specified by the application into a cairo xlib surface. When
creating the surface it specifies the visual, indirectly, via an XRender
picture format.
This is suboptimal, since XRender picture formats don't have a way to specify
16bpp depth, which an application may be using.
In particular, applications are likely to use 16bpp depth pixmaps for their
icons, if the video card offers a 16bpp framebuffer/root window.
This commit drops the XRender middleman, and just tells cairo a visual to use
directly.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/715
-rw-r--r-- | src/x11/iconcache.c | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/src/x11/iconcache.c b/src/x11/iconcache.c index 15d72da65..941cf2075 100644 --- a/src/x11/iconcache.c +++ b/src/x11/iconcache.c @@ -288,34 +288,12 @@ get_pixmap_geometry (MetaX11Display *x11_display, *d = depth; } -static int -standard_pict_format_for_depth (int depth) -{ - switch (depth) - { - case 1: - return PictStandardA1; - case 24: - return PictStandardRGB24; - case 32: - return PictStandardARGB32; - default: - g_assert_not_reached (); - } - return 0; -} - -static XRenderPictFormat * -pict_format_for_depth (Display *xdisplay, int depth) -{ - return XRenderFindStandardFormat (xdisplay, standard_pict_format_for_depth (depth)); -} - static cairo_surface_t * surface_from_pixmap (Display *xdisplay, Pixmap xpixmap, int width, int height) { Window root_return; + XVisualInfo visual_info; int x_ret, y_ret; unsigned int w_ret, h_ret, bw_ret, depth_ret; @@ -323,8 +301,12 @@ surface_from_pixmap (Display *xdisplay, Pixmap xpixmap, &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) return NULL; - return cairo_xlib_surface_create_with_xrender_format (xdisplay, xpixmap, DefaultScreenOfDisplay (xdisplay), - pict_format_for_depth (xdisplay, depth_ret), w_ret, h_ret); + if (!XMatchVisualInfo (xdisplay, DefaultScreen (xdisplay), + depth_ret, TrueColor, &visual_info)) + return NULL; + + return cairo_xlib_surface_create (xdisplay, xpixmap, visual_info.visual, + w_ret, h_ret); } static gboolean |