Align compile-time color options with X resource colors

Two colors are more than enough!
This commit is contained in:
Bert Münnich 2019-01-23 21:18:12 +01:00
parent 9d244da512
commit 919ada1123
5 changed files with 37 additions and 32 deletions

View file

@ -14,11 +14,8 @@ static const char * const BAR_FONT = "monospace:size=8";
/* colors: /* colors:
* (see X(7) section "COLOR NAMES" for valid values) * (see X(7) section "COLOR NAMES" for valid values)
*/ */
static const char * const WIN_BG_COLOR = "#555555"; static const char * const BG_COLOR = "#555555";
static const char * const WIN_FS_COLOR = "#000000"; static const char * const FG_COLOR = "#EEEEEE";
static const char * const SEL_COLOR = "#EEEEEE";
static const char * const BAR_BG_COLOR = "#222222";
static const char * const BAR_FG_COLOR = "#EEEEEE";
#endif #endif
#ifdef _IMAGE_CONFIG #ifdef _IMAGE_CONFIG

View file

@ -497,7 +497,7 @@ void img_render(img_t *img)
} }
imlib_image_put_back_data(data); imlib_image_put_back_data(data);
} else { } else {
c = win->fullscreen ? win->fscol.pixel : win->bgcol.pixel; c = win->fullscreen ? win->black.pixel : win->bg.pixel;
imlib_context_set_color(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF, 0xFF); imlib_context_set_color(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF, 0xFF);
imlib_image_fill_rectangle(0, 0, dw, dh); imlib_image_fill_rectangle(0, 0, dw, dh);
} }

9
sxiv.h
View file

@ -408,9 +408,10 @@ struct win {
Window xwin; Window xwin;
win_env_t env; win_env_t env;
XftColor bgcol; bool light; /* bg is lighter than fg */
XftColor fscol; XftColor bg;
XftColor selcol; XftColor fg;
XftColor black;
int x; int x;
int y; int y;
@ -430,8 +431,6 @@ struct win {
unsigned int h; unsigned int h;
win_bar_t l; win_bar_t l;
win_bar_t r; win_bar_t r;
XftColor bgcol;
XftColor fgcol;
} bar; } bar;
}; };

View file

@ -468,14 +468,14 @@ void tns_mark(tns_t *tns, int n, bool mark)
if (n >= 0 && n < *tns->cnt && tns->thumbs[n].im != NULL) { if (n >= 0 && n < *tns->cnt && tns->thumbs[n].im != NULL) {
win_t *win = tns->win; win_t *win = tns->win;
thumb_t *t = &tns->thumbs[n]; thumb_t *t = &tns->thumbs[n];
unsigned long col = win->fullscreen ? win->fscol.pixel : win->bgcol.pixel; unsigned long col = win->fullscreen ? win->black.pixel : win->bg.pixel;
int x = t->x + t->w, y = t->y + t->h; int x = t->x + t->w, y = t->y + t->h;
win_draw_rect(win, x - 1, y + 1, 1, tns->bw, true, 1, col); win_draw_rect(win, x - 1, y + 1, 1, tns->bw, true, 1, col);
win_draw_rect(win, x + 1, y - 1, tns->bw, 1, true, 1, col); win_draw_rect(win, x + 1, y - 1, tns->bw, 1, true, 1, col);
if (mark) if (mark)
col = win->selcol.pixel; col = win->fullscreen && win->light ? win->bg.pixel : win->fg.pixel;
win_draw_rect(win, x, y, tns->bw + 2, tns->bw + 2, true, 1, col); win_draw_rect(win, x, y, tns->bw + 2, tns->bw + 2, true, 1, col);
@ -493,9 +493,9 @@ void tns_highlight(tns_t *tns, int n, bool hl)
int oxy = (tns->bw + 1) / 2 + 1, owh = tns->bw + 2; int oxy = (tns->bw + 1) / 2 + 1, owh = tns->bw + 2;
if (hl) if (hl)
col = win->selcol.pixel; col = win->fullscreen && win->light ? win->bg.pixel : win->fg.pixel;
else else
col = win->fullscreen ? win->fscol.pixel : win->bgcol.pixel; col = win->fullscreen ? win->black.pixel : win->bg.pixel;
win_draw_rect(win, t->x - oxy, t->y - oxy, t->w + owh, t->h + owh, win_draw_rect(win, t->x - oxy, t->y - oxy, t->w + owh, t->h + owh,
false, tns->bw, col); false, tns->bw, col);

View file

@ -121,12 +121,18 @@ const char* win_res(Display *dpy, const char *name, const char *def)
} }
} }
unsigned int win_luminance(const XftColor *col)
{
return (col->color.red + col->color.green + col->color.blue) / 3;
}
#define INIT_ATOM_(atom) \ #define INIT_ATOM_(atom) \
atoms[ATOM_##atom] = XInternAtom(e->dpy, #atom, False); atoms[ATOM_##atom] = XInternAtom(e->dpy, #atom, False);
void win_init(win_t *win) void win_init(win_t *win)
{ {
win_env_t *e; win_env_t *e;
const char *bg, *fg;
memset(win, 0, sizeof(win_t)); memset(win, 0, sizeof(win_t));
@ -146,15 +152,12 @@ void win_init(win_t *win)
win_init_font(e, BAR_FONT); win_init_font(e, BAR_FONT);
win_alloc_color(e, win_res(e->dpy, RES_CLASS ".background", WIN_BG_COLOR), bg = win_res(e->dpy, RES_CLASS ".background", BG_COLOR);
&win->bgcol); fg = win_res(e->dpy, RES_CLASS ".foreground", FG_COLOR);
win_alloc_color(e, WIN_FS_COLOR, &win->fscol); win_alloc_color(e, bg, &win->bg);
win_alloc_color(e, win_res(e->dpy, RES_CLASS ".foreground", SEL_COLOR), win_alloc_color(e, fg, &win->fg);
&win->selcol); win_alloc_color(e, "black", &win->black);
win_alloc_color(e, win_res(e->dpy, RES_CLASS ".foreground", BAR_BG_COLOR), win->light = win_luminance(&win->bg) > win_luminance(&win->fg);
&win->bar.bgcol);
win_alloc_color(e, win_res(e->dpy, RES_CLASS ".background", BAR_FG_COLOR),
&win->bar.fgcol);
win->bar.l.size = BAR_L_LEN; win->bar.l.size = BAR_L_LEN;
win->bar.r.size = BAR_R_LEN; win->bar.r.size = BAR_R_LEN;
@ -294,7 +297,7 @@ void win_open(win_t *win)
win->buf.h = e->scrh; win->buf.h = e->scrh;
win->buf.pm = XCreatePixmap(e->dpy, win->xwin, win->buf.pm = XCreatePixmap(e->dpy, win->xwin,
win->buf.w, win->buf.h, e->depth); win->buf.w, win->buf.h, e->depth);
XSetForeground(e->dpy, gc, fullscreen ? win->fscol.pixel : win->bgcol.pixel); XSetForeground(e->dpy, gc, fullscreen ? win->black.pixel : win->bg.pixel);
XFillRectangle(e->dpy, win->buf.pm, gc, 0, 0, win->buf.w, win->buf.h); XFillRectangle(e->dpy, win->buf.pm, gc, 0, 0, win->buf.w, win->buf.h);
XSetWindowBackgroundPixmap(e->dpy, win->xwin, win->buf.pm); XSetWindowBackgroundPixmap(e->dpy, win->xwin, win->buf.pm);
@ -386,14 +389,14 @@ void win_clear(win_t *win)
win->buf.pm = XCreatePixmap(e->dpy, win->xwin, win->buf.pm = XCreatePixmap(e->dpy, win->xwin,
win->buf.w, win->buf.h, e->depth); win->buf.w, win->buf.h, e->depth);
} }
XSetForeground(e->dpy, gc, win->fullscreen ? win->fscol.pixel : win->bgcol.pixel); XSetForeground(e->dpy, gc, win->fullscreen ? win->black.pixel : win->bg.pixel);
XFillRectangle(e->dpy, win->buf.pm, gc, 0, 0, win->buf.w, win->buf.h); XFillRectangle(e->dpy, win->buf.pm, gc, 0, 0, win->buf.w, win->buf.h);
} }
#define TEXTWIDTH(win, text, len) \ #define TEXTWIDTH(win, text, len) \
win_draw_text(win, NULL, NULL, 0, 0, text, len, 0) win_draw_text(win, NULL, NULL, 0, 0, text, len, 0)
int win_draw_text(win_t *win, XftDraw *d, XftColor *color, int x, int y, int win_draw_text(win_t *win, XftDraw *d, const XftColor *color, int x, int y,
char *text, int len, int w) char *text, int len, int w)
{ {
int err, tw = 0; int err, tw = 0;
@ -432,6 +435,7 @@ void win_draw_bar(win_t *win)
win_env_t *e; win_env_t *e;
win_bar_t *l, *r; win_bar_t *l, *r;
XftDraw *d; XftDraw *d;
const XftColor *bg, *fg;
if ((l = &win->bar.l)->buf == NULL || (r = &win->bar.r)->buf == NULL) if ((l = &win->bar.l)->buf == NULL || (r = &win->bar.r)->buf == NULL)
return; return;
@ -442,23 +446,28 @@ void win_draw_bar(win_t *win)
d = XftDrawCreate(e->dpy, win->buf.pm, DefaultVisual(e->dpy, e->scr), d = XftDrawCreate(e->dpy, win->buf.pm, DefaultVisual(e->dpy, e->scr),
DefaultColormap(e->dpy, e->scr)); DefaultColormap(e->dpy, e->scr));
XSetForeground(e->dpy, gc, win->bar.bgcol.pixel); if (win->fullscreen && !win->light)
bg = &win->bg, fg = &win->fg;
else
bg = &win->fg, fg = &win->bg;
XSetForeground(e->dpy, gc, bg->pixel);
XFillRectangle(e->dpy, win->buf.pm, gc, 0, win->h, win->w, win->bar.h); XFillRectangle(e->dpy, win->buf.pm, gc, 0, win->h, win->w, win->bar.h);
XSetForeground(e->dpy, gc, win->bar.fgcol.pixel); XSetForeground(e->dpy, gc, fg->pixel);
XSetBackground(e->dpy, gc, win->bar.bgcol.pixel); XSetBackground(e->dpy, gc, bg->pixel);
if ((len = strlen(r->buf)) > 0) { if ((len = strlen(r->buf)) > 0) {
if ((tw = TEXTWIDTH(win, r->buf, len)) > w) if ((tw = TEXTWIDTH(win, r->buf, len)) > w)
return; return;
x = win->w - tw - H_TEXT_PAD; x = win->w - tw - H_TEXT_PAD;
w -= tw; w -= tw;
win_draw_text(win, d, &win->bar.fgcol, x, y, r->buf, len, tw); win_draw_text(win, d, fg, x, y, r->buf, len, tw);
} }
if ((len = strlen(l->buf)) > 0) { if ((len = strlen(l->buf)) > 0) {
x = H_TEXT_PAD; x = H_TEXT_PAD;
w -= 2 * H_TEXT_PAD; /* gap between left and right parts */ w -= 2 * H_TEXT_PAD; /* gap between left and right parts */
win_draw_text(win, d, &win->bar.fgcol, x, y, l->buf, len, w); win_draw_text(win, d, fg, x, y, l->buf, len, w);
} }
XftDrawDestroy(d); XftDrawDestroy(d);
} }