windowmaker-wl/WINGs/wcolor_wl.c

109 lines
2.8 KiB
C

#define WRASTER_NO_XLIB /* Wayland-only file: no libX11 deps */
/*
* wcolor_wl.c - Wayland color backend for WINGs
*
* No X11 dependencies. Colors are just RGBA values with a computed pixel.
* No colormap allocation needed — rendering uses the RGBA components directly.
*/
#include "WINGsP.h"
static void *wl_screen_init(W_Screen *scr)
{
(void)scr;
return scr;
}
static void wl_screen_fini(void *cctx)
{
(void)cctx;
}
static WMColor *wl_alloc_color(void *cctx, W_Screen *scr,
unsigned short r, unsigned short g,
unsigned short b, unsigned short a)
{
WMColor *color;
(void)cctx;
color = wmalloc(sizeof(WMColor));
color->screen = scr;
color->refCount = 1;
color->color.red = r;
color->color.green = g;
color->color.blue = b;
color->color.pixel = ((r >> 8) << 16) | ((g >> 8) << 8) | (b >> 8);
color->alpha = a;
color->flags.exact = 1;
color->gc = NULL;
return color;
}
static WMColor *wl_find_close_color(void *cctx, W_Screen *scr,
unsigned short r, unsigned short g,
unsigned short b, unsigned short a)
{
/* In truecolor (Wayland), all colors are exact */
return wl_alloc_color(cctx, scr, r, g, b, a);
}
static void wl_free_color(void *cctx, WMColor *color)
{
(void)cctx;
(void)color;
/* Nothing to free — no X11 resources */
}
static Bool wl_parse_named(void *cctx, W_Screen *scr, const char *name,
unsigned short *r, unsigned short *g, unsigned short *b)
{
unsigned int rv, gv, bv;
(void)cctx;
(void)scr;
/* Parse #RRGGBB or #RGB format */
if (name[0] == '#') {
int len = strlen(name + 1);
if (len == 6) {
if (sscanf(name + 1, "%2x%2x%2x", &rv, &gv, &bv) == 3) {
*r = rv << 8 | rv;
*g = gv << 8 | gv;
*b = bv << 8 | bv;
return True;
}
} else if (len == 3) {
if (sscanf(name + 1, "%1x%1x%1x", &rv, &gv, &bv) == 3) {
*r = (rv | rv << 4) << 8;
*g = (gv | gv << 4) << 8;
*b = (bv | bv << 4) << 8;
return True;
}
}
}
/* Common named colors used by WindowMaker */
if (strcasecmp(name, "white") == 0) { *r = *g = *b = 0xffff; return True; }
if (strcasecmp(name, "black") == 0) { *r = *g = *b = 0; return True; }
if (strcasecmp(name, "red") == 0) { *r = 0xffff; *g = *b = 0; return True; }
if (strcasecmp(name, "green") == 0) { *r = 0; *g = 0xffff; *b = 0; return True; }
if (strcasecmp(name, "blue") == 0) { *r = *g = 0; *b = 0xffff; return True; }
if (strcasecmp(name, "gray") == 0 || strcasecmp(name, "grey") == 0) {
*r = *g = *b = 0xbebe; return True;
}
/* Fallback: treat unknown names as gray */
*r = *g = *b = 0x8080;
return True;
}
const W_ColorBackend W_ColorBackendWL = {
.screen_init = wl_screen_init,
.screen_fini = wl_screen_fini,
.alloc_color = wl_alloc_color,
.find_close_color = wl_find_close_color,
.free_color = wl_free_color,
.parse_named = wl_parse_named,
};