From 75a8299d18064b1601107698e7ea867885ff1a4f Mon Sep 17 00:00:00 2001 From: David Maciejak Date: Wed, 18 Feb 2026 21:26:56 -0500 Subject: [PATCH] wmaker: set the color pixel for TrueColor display As mentioned in commit 67e2f5e1ca9847e2093e5122363b5bbcf91c3e59, for TrueColor display it's not necessary to allocate a color but it is required to set the pixel property of the XColor. --- src/resources.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/resources.c b/src/resources.c index ee427915..61ed48a6 100644 --- a/src/resources.c +++ b/src/resources.c @@ -35,20 +35,41 @@ #include "resources.h" #include "screen.h" +static unsigned long scale_color_component(unsigned short value, unsigned long mask) +{ + unsigned long m = mask; + int shift = 0, bits = 0; + + if (!m) + return 0; + + while (!(m & 1)) { + shift++; + m >>= 1; + } + while (m) { + bits++; + m >>= 1; + } + + return ((unsigned long)(value >> (16 - bits)) & ((1UL << bits) - 1)) << shift; +} + int wGetColorForColormap(WScreen *scr, Colormap colormap, const char *color_name, XColor *color) { - if (scr->w_visual->class == TrueColor) { - XColor dummy_exact; - if (!XLookupColor(dpy, colormap, color_name, &dummy_exact, color)) { - wwarning(_("could not lookup color \"%s\""), color_name); - return False; - } - return True; - } if (!XParseColor(dpy, colormap, color_name, color)) { wwarning(_("could not parse color \"%s\""), color_name); return False; } + + if (scr->w_visual->class == TrueColor) { + /* Compute pixel directly from RGB components using the visual's channel masks */ + color->pixel = scale_color_component(color->red, scr->w_visual->red_mask) + | scale_color_component(color->green, scr->w_visual->green_mask) + | scale_color_component(color->blue, scr->w_visual->blue_mask); + return True; + } + if (!XAllocColor(dpy, colormap, color)) { wwarning(_("could not allocate color \"%s\""), color_name); return False;