Don't parse named colors. Expand #rgb format.
This commit is contained in:
parent
1585d7257d
commit
38422c5014
|
@ -47,7 +47,7 @@ Sets the underline width in pixels. The default is 1.
|
||||||
|
|
||||||
=item B<-B> I<color>
|
=item B<-B> I<color>
|
||||||
|
|
||||||
Set the background color of the bar. I<color> might be either in hex format (#aarrggbb) or in the symbolic name format (eg. white, indianred, darkgray). If no compositor such as compton or xcompmgr is running the alpha channel is silently ignored.
|
Set the background color of the bar. I<color> must be specified in the hex format (#aarrggbb, #rrggbb, #rgb). If no compositor such as compton or xcompmgr is running the alpha channel is silently ignored.
|
||||||
|
|
||||||
=item B<-F> I<color>
|
=item B<-F> I<color>
|
||||||
|
|
||||||
|
|
54
lemonbar.c
54
lemonbar.c
|
@ -233,9 +233,7 @@ draw_char (monitor_t *mon, font_t *cur_font, int x, int align, uint16_t ch)
|
||||||
rgba_t
|
rgba_t
|
||||||
parse_color (const char *str, char **end, const rgba_t def)
|
parse_color (const char *str, char **end, const rgba_t def)
|
||||||
{
|
{
|
||||||
xcb_alloc_named_color_reply_t *nc_reply;
|
|
||||||
int string_len;
|
int string_len;
|
||||||
rgba_t ret;
|
|
||||||
char *ep;
|
char *ep;
|
||||||
|
|
||||||
if (!str)
|
if (!str)
|
||||||
|
@ -250,7 +248,14 @@ parse_color (const char *str, char **end, const rgba_t def)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hex representation
|
// Hex representation
|
||||||
if (str[0] == '#') {
|
if (str[0] != '#') {
|
||||||
|
if (end)
|
||||||
|
*end = (char *)str;
|
||||||
|
|
||||||
|
fprintf(stderr, "Invalid color specified\n");
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
rgba_t tmp = (rgba_t)(uint32_t)strtoul(str + 1, &ep, 16);
|
rgba_t tmp = (rgba_t)(uint32_t)strtoul(str + 1, &ep, 16);
|
||||||
|
|
||||||
|
@ -265,9 +270,24 @@ parse_color (const char *str, char **end, const rgba_t def)
|
||||||
|
|
||||||
string_len = ep - (str + 1);
|
string_len = ep - (str + 1);
|
||||||
|
|
||||||
|
switch (string_len) {
|
||||||
|
case 3:
|
||||||
|
// Expand the #rgb format into #rrggbb (aa is set to 0xff)
|
||||||
|
tmp.v = (tmp.v & 0xf00) * 0x1100
|
||||||
|
| (tmp.v & 0x0f0) * 0x0110
|
||||||
|
| (tmp.v & 0x00f) * 0x0011;
|
||||||
|
case 6:
|
||||||
// If the code is in #rrggbb form then assume it's opaque
|
// If the code is in #rrggbb form then assume it's opaque
|
||||||
if (string_len <= 6)
|
|
||||||
tmp.a = 255;
|
tmp.a = 255;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
// Colors in #aarrggbb format, those need no adjustments
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Invalid color specified\n");
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
// Premultiply the alpha in
|
// Premultiply the alpha in
|
||||||
if (tmp.a) {
|
if (tmp.a) {
|
||||||
|
@ -281,30 +301,8 @@ parse_color (const char *str, char **end, const rgba_t def)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (rgba_t)0U;
|
return (rgba_t)0U;
|
||||||
}
|
|
||||||
|
|
||||||
// Actual color name, resolve it
|
|
||||||
for (string_len = 0; isalpha(str[string_len]); string_len++)
|
|
||||||
;
|
|
||||||
|
|
||||||
nc_reply = xcb_alloc_named_color_reply(c, xcb_alloc_named_color(c, colormap, string_len, str), NULL);
|
|
||||||
|
|
||||||
if (!nc_reply)
|
|
||||||
fprintf(stderr, "Could not allocate the color \"%.*s\"\n", string_len, str);
|
|
||||||
|
|
||||||
ret = nc_reply?
|
|
||||||
(rgba_t)nc_reply->pixel:
|
|
||||||
def;
|
|
||||||
|
|
||||||
free(nc_reply);
|
|
||||||
|
|
||||||
if (end)
|
|
||||||
*end = (char *)str + string_len;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
set_attribute (const char modifier, const char attribute)
|
set_attribute (const char modifier, const char attribute)
|
||||||
{
|
{
|
||||||
|
@ -1229,8 +1227,8 @@ main (int argc, char **argv)
|
||||||
xconn();
|
xconn();
|
||||||
|
|
||||||
// B/W combo
|
// B/W combo
|
||||||
dbgc = bgc = parse_color("black", NULL, (rgba_t)scr->black_pixel);
|
dbgc = bgc = (rgba_t)scr->black_pixel;
|
||||||
dfgc = fgc = parse_color("white", NULL, (rgba_t)scr->white_pixel);
|
dfgc = fgc = (rgba_t)scr->white_pixel;
|
||||||
|
|
||||||
ugc = fgc;
|
ugc = fgc;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user