From 0c7e237a7570a5499e56bbbd94c87fca443b5202 Mon Sep 17 00:00:00 2001 From: Bernd Busse Date: Thu, 24 Jun 2021 18:56:23 +0200 Subject: [PATCH] backend: xrender: Force 32-bit ARGB visual for alpha target pixmaps Force a 32-bit ARGB visual when cloning pixmaps for `IMAGE_OP_APPLY_ALPHA`. Fixes non-transparent frames for 24-bit windows (without alpha-channel) even when using `frame-opacity != 1`. fixes: #342 --- src/backend/xrender/xrender.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/xrender/xrender.c b/src/backend/xrender/xrender.c index d28f4fb..32ddabf 100644 --- a/src/backend/xrender/xrender.c +++ b/src/backend/xrender/xrender.c @@ -512,8 +512,12 @@ static bool decouple_image(backend_t *base, struct backend_image *img, const reg return true; } auto inner = (struct _xrender_image_data_inner *)img->inner; - auto inner2 = - new_inner(base, inner->width, inner->height, inner->visual, inner->depth); + // Force new pixmap to a 32-bit ARGB visual to allow for transparent frames around + // non-transparent windows + auto visual = (inner->depth == 32) + ? inner->visual + : x_get_visual_for_standard(base->c, XCB_PICT_STANDARD_ARGB_32); + auto inner2 = new_inner(base, inner->width, inner->height, visual, 32); if (!inner2) { return false; }