alpha: refactoring to support RGBA colour values ref. #264

vertigo
bakkeby 2 years ago
parent 8216da50f8
commit c1744129bd

@ -158,62 +158,9 @@ static const char font[] = "monospace 10";
#else
static const char *fonts[] = { "monospace:size=10" };
#endif // BAR_PANGO_PATCH
static char dmenufont[] = "monospace:size=10";
#if BAR_ALPHA_PATCH
static const unsigned int baralpha = 0xd0;
static const unsigned int borderalpha = OPAQUE;
static const unsigned int alphas[][3] = {
/* fg bg border */
[SchemeNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTitleSel] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeTagsSel] = { OPAQUE, baralpha, borderalpha },
[SchemeHidNorm] = { OPAQUE, baralpha, borderalpha },
[SchemeHidSel] = { OPAQUE, baralpha, borderalpha },
[SchemeUrg] = { OPAQUE, baralpha, borderalpha },
#if RENAMED_SCRATCHPADS_PATCH
[SchemeScratchSel] = { OPAQUE, baralpha, borderalpha },
[SchemeScratchNorm] = { OPAQUE, baralpha, borderalpha },
#endif // RENAMED_SCRATCHPADS_PATCH
#if BAR_FLEXWINTITLE_PATCH
[SchemeFlexActTTB] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActLTR] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActMONO] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActGRID] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActGRD1] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActGRD2] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActGRDM] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActHGRD] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActDWDL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActSPRL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexActFloat] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaTTB] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaLTR] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaMONO] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaGRID] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaGRD1] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaGRD2] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaGRDM] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaHGRD] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaDWDL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaSPRL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexInaFloat] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelTTB] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelLTR] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelMONO] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelGRID] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelGRD1] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelGRD2] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelGRDM] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelHGRD] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelDWDL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelSPRL] = { OPAQUE, baralpha, borderalpha },
[SchemeFlexSelFloat] = { OPAQUE, baralpha, borderalpha },
#endif // BAR_FLEXWINTITLE_PATCH
};
unsigned int default_alphas[] = { OPAQUE, 0xd0U, OPAQUE };
#endif // BAR_ALPHA_PATCH
static char *colors[SchemeLast][5] = {
@ -283,6 +230,7 @@ static char *statuscolors[][ColCount] = {
};
#endif // BAR_POWERLINE_STATUS_PATCH
static char dmenufont[] = "monospace:size=10";
static char dmenunormfgcolor[] = "#bbbbbb";
static char dmenunormbgcolor[] = "#222222";
static char dmenuselfgcolor[] = "#eeeeee";
@ -674,7 +622,6 @@ static const char *xkb_layouts[] = {
#define MODKEY Alt
#if COMBO_PATCH && SWAPTAGS_PATCH && TAGOTHERMONITOR_PATCH
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, comboview, {.ui = 1 << TAG} }, \

23
drw.c

@ -335,9 +335,23 @@ drw_clr_create(
return;
#if BAR_ALPHA_PATCH
char color[20] = {0};
unsigned int rgb, a;
strncpy(color, clrname, 20);
switch(sscanf(clrname, "#%6x%2x", &rgb, &a)) {
case 1:
sprintf(color, "#%.6x", rgb);
break;
case 2:
sprintf(color, "#%.6x", rgb);
alpha = a;
break;
}
if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
clrname, dest))
die("error, cannot allocate color '%s'", clrname);
color, dest))
die("error, cannot allocate color '%s'", &color);
dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
#else
@ -359,7 +373,7 @@ drw_scm_create(
Drw *drw,
char *clrnames[],
#if BAR_ALPHA_PATCH
const unsigned int alphas[],
unsigned int alphas[],
#endif // BAR_ALPHA_PATCH
size_t clrcount
) {
@ -370,12 +384,13 @@ drw_scm_create(
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
return NULL;
for (i = 0; i < clrcount; i++)
for (i = 0; i < clrcount; i++) {
#if BAR_ALPHA_PATCH
drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
#else
drw_clr_create(drw, &ret[i], clrnames[i]);
#endif // BAR_ALPHA_PATCH
}
return ret;
}

@ -76,7 +76,7 @@ Clr *drw_scm_create(
Drw *drw,
char *clrnames[],
#if BAR_ALPHA_PATCH
const unsigned int alphas[],
unsigned int alphas[],
#endif // BAR_ALPHA_PATCH
size_t clrcount
);

@ -3654,7 +3654,7 @@ setup(void)
#if BAR_STATUS2D_PATCH && !BAR_STATUSCOLORS_PATCH
scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
#if BAR_ALPHA_PATCH
scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], alphas[0], ColCount);
scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], default_alphas, ColCount);
#else
scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], ColCount);
#endif // BAR_ALPHA_PATCH
@ -3663,7 +3663,7 @@ setup(void)
#endif // BAR_STATUS2D_PATCH
for (i = 0; i < LENGTH(colors); i++)
#if BAR_ALPHA_PATCH
scheme[i] = drw_scm_create(drw, colors[i], alphas[i], ColCount);
scheme[i] = drw_scm_create(drw, colors[i], default_alphas, ColCount);
#else
scheme[i] = drw_scm_create(drw, colors[i], ColCount);
#endif // BAR_ALPHA_PATCH
@ -3671,7 +3671,7 @@ setup(void)
statusscheme = ecalloc(LENGTH(statuscolors), sizeof(Clr *));
for (i = 0; i < LENGTH(statuscolors); i++)
#if BAR_ALPHA_PATCH
statusscheme[i] = drw_scm_create(drw, statuscolors[i], alphas[0], ColCount);
statusscheme[i] = drw_scm_create(drw, statuscolors[i], default_alphas, ColCount);
#else
statusscheme[i] = drw_scm_create(drw, statuscolors[i], ColCount);
#endif // BAR_ALPHA_PATCH
@ -3682,7 +3682,6 @@ setup(void)
loadxrdb();
#endif // XRDB_PATCH
#if BAR_STATUSPADDING_PATCH
lrpad = drw->fonts->h + horizpadbar;
bh = drw->fonts->h + vertpadbar;

@ -1,24 +1,28 @@
int
loadxrdbcolor(XrmDatabase xrdb, char **dest, char *resource)
loadxrdbcolor(XrmDatabase xrdb, char **dest, unsigned int *alpha, char *resource)
{
XrmValue value;
char *type;
if (XrmGetResource(xrdb, resource, NULL, &type, &value) == True) {
if (value.addr != NULL && strnlen(value.addr, 8) == 7 && value.addr[0] == '#') {
int i = 1;
for (; i <= 6; i++) {
if (value.addr[i] < 48) break;
if (value.addr[i] > 57 && value.addr[i] < 65) break;
if (value.addr[i] > 70 && value.addr[i] < 97) break;
if (value.addr[i] > 102) break;
}
if (i == 7) {
strncpy(*dest, value.addr, 7);
return 1;
}
}
unsigned int rgb, a;
if (XrmGetResource(xrdb, resource, NULL, &type, &value) != True)
return 0;
if (value.addr == NULL)
return 0;
strcpy(*dest, value.addr);
switch(sscanf(value.addr, "#%6x%2x", &rgb, &a)) {
case 1:
sprintf(*dest, "#%.6x", rgb);
*alpha = 0xFF;
return 1;
case 2:
sprintf(*dest, "#%.6x", rgb);
*alpha = a;
return 1;
}
return 0;
return 1;
}
void
@ -64,14 +68,16 @@ loadxrdb()
XrmDatabase xrdb;
const ResourcePref *p;
int s;
int s, c;
char resource[40];
char *pattern = "dwm.%s%scolor";
char fg[] = "#000000";
char bg[] = "#000000";
char bd[] = "#000000";
char fg[20] = "#00000000";
char bg[20] = "#00000000";
char bd[20] = "#00000000";
char *clrnames[] = { fg, bg, bd };
unsigned int alphas[] = { 0, 0, 0 };
const char *columns[] = { "fg", "bg", "border" };
display = XOpenDisplay(NULL);
@ -88,22 +94,18 @@ loadxrdb()
/* Skip schemes that do not specify a resource string */
if (colors[s][ColCount][0] == '\0')
continue;
sprintf(resource, pattern, colors[s][ColCount], "fg");
if (!loadxrdbcolor(xrdb, &clrnames[ColFg], resource))
strcpy(clrnames[ColFg], colors[s][ColFg]);
sprintf(resource, pattern, colors[s][ColCount], "bg");
if (!loadxrdbcolor(xrdb, &clrnames[ColBg], resource))
strcpy(clrnames[ColBg], colors[s][ColBg]);
sprintf(resource, pattern, colors[s][ColCount], "border");
if (!loadxrdbcolor(xrdb, &clrnames[ColBorder], resource))
strcpy(clrnames[ColBorder], colors[s][ColBorder]);
for (c = 0; c < LENGTH(columns); c++) {
#if BAR_ALPHA_PATCH
alphas[c] = default_alphas[c];
#endif // BAR_ALPHA_PATCH
sprintf(resource, pattern, colors[s][ColCount], columns[c]);
if (!loadxrdbcolor(xrdb, &clrnames[c], &alphas[c], resource))
strcpy(clrnames[c], colors[s][c]);
}
free(scheme[s]);
#if BAR_ALPHA_PATCH
scheme[s] = drw_scm_create(drw, clrnames, alphas[s], ColCount);
scheme[s] = drw_scm_create(drw, clrnames, alphas, ColCount);
#else
scheme[s] = drw_scm_create(drw, clrnames, ColCount);
#endif // BAR_ALPHA_PATCH

@ -14,6 +14,6 @@ typedef struct {
} ResourcePref;
static void loadxrdb(void);
static int loadxrdbcolor(XrmDatabase xrdb, char **dest, char *resource);
static int loadxrdbcolor(XrmDatabase xrdb, char **dest, unsigned int *alpha, char *resource);
static void loadxrdbconfig(XrmDatabase xrdb, char *name, enum resource_type rtype, void *dst);
static void xrdb(const Arg *arg);

Loading…
Cancel
Save