109 lines
2.8 KiB
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,
|
|
};
|