applied Julian's enum approach, 33a74489
however renamed theme into scheme resp. Theme into ClrScheme
Anselm R Garbe · 2013-06-19 19:35 3 file(s) · +37 −40
drw.c +10 −12
109 109
110 110
void
111 111
drw_clr_free(Clr *clr) {
112 -
	if(!clr)
113 -
		return;
114 -
	free(clr);
112 +
	if(clr)
113 +
		free(clr);
115 114
}
116 115
117 116
void
121 120
}
122 121
123 122
void
124 -
drw_settheme(Drw *drw, Theme *theme) {
125 -
	if(!drw || !theme) 
126 -
		return;
127 -
	drw->theme = theme;
123 +
drw_setscheme(Drw *drw, ClrScheme *scheme) {
124 +
	if(drw && scheme) 
125 +
		drw->scheme = scheme;
128 126
}
129 127
130 128
void
131 129
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert) {
132 130
	int dx;
133 131
134 -
	if(!drw || !drw->font || !drw->theme)
132 +
	if(!drw || !drw->font || !drw->scheme)
135 133
		return;
136 -
	XSetForeground(drw->dpy, drw->gc, invert ? drw->theme->bg->rgb : drw->theme->fg->rgb);
134 +
	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
137 135
	dx = (drw->font->ascent + drw->font->descent + 2) / 4;
138 136
	if(filled)
139 137
		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx+1, dx+1);
147 145
	int i, tx, ty, th, len, olen;
148 146
	Extnts tex;
149 147
150 -
	if(!drw || !drw->theme)
148 +
	if(!drw || !drw->scheme)
151 149
		return;
152 -
	XSetForeground(drw->dpy, drw->gc, invert ? drw->theme->fg->rgb : drw->theme->bg->rgb);
150 +
	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->rgb : drw->scheme->bg->rgb);
153 151
	XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
154 152
	if(!text || !drw->font)
155 153
		return;
166 164
	memcpy(buf, text, len);
167 165
	if(len < olen)
168 166
		for(i = len; i && i > len - 3; buf[--i] = '.');
169 -
	XSetForeground(drw->dpy, drw->gc, invert ? drw->theme->bg->rgb : drw->theme->fg->rgb);
167 +
	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
170 168
	if(drw->font->set)
171 169
		XmbDrawString(drw->dpy, drw->drawable, drw->font->set, drw->gc, tx, ty, buf, len);
172 170
	else
drw.h +3 −3
20 20
	Clr *fg;
21 21
	Clr *bg;
22 22
	Clr *border;
23 -
} Theme;
23 +
} ClrScheme;
24 24
25 25
typedef struct {
26 26
	unsigned int w, h;
29 29
	Window root;
30 30
	Drawable drawable;
31 31
	GC gc;
32 -
	Theme *theme;
32 +
	ClrScheme *scheme;
33 33
	Fnt *font;
34 34
} Drw;
35 35
59 59
60 60
/* Drawing context manipulation */
61 61
void drw_setfont(Drw *drw, Fnt *font);
62 -
void drw_settheme(Drw *drw, Theme *theme);
62 +
void drw_setscheme(Drw *drw, ClrScheme *scheme);
63 63
64 64
/* Drawing functions */
65 65
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert);
dwm.c +24 −25
57 57
#define TEXTW(X)                (drw_font_getexts_width(drw->font, X, strlen(X)) + drw->font->h)
58 58
59 59
/* enums */
60 -
enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
61 -
enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
60 +
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
61 +
enum { SchemeNorm, SchemeSel, SchemeLast }; /* color schemes */
62 62
enum { NetSupported, NetWMName, NetWMState,
63 63
       NetWMFullscreen, NetActiveWindow, NetWMWindowType,
64 -
       NetWMWindowTypeDialog, NetClientList, NetLast };     /* EWMH atoms */
64 +
       NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
65 65
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
66 66
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
67 -
       ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
67 +
       ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
68 68
69 69
typedef union {
70 70
	int i;
260 260
static Atom wmatom[WMLast], netatom[NetLast];
261 261
static Bool running = True;
262 262
static Cur *cursor[CurLast];
263 -
static Theme thmnorm[ColLast];
264 -
static Theme thmsel[ColLast];
263 +
static ClrScheme scheme[SchemeLast];
265 264
static Display *dpy;
266 265
static Drw *drw;
267 266
static Fnt *fnt;
476 475
	drw_cur_free(drw, cursor[CurResize]);
477 476
	drw_cur_free(drw, cursor[CurMove]);
478 477
	drw_font_free(dpy, fnt);
479 -
	drw_clr_free(thmnorm->border);
480 -
	drw_clr_free(thmnorm->bg);
481 -
	drw_clr_free(thmnorm->fg);
482 -
	drw_clr_free(thmsel->border);
483 -
	drw_clr_free(thmsel->bg);
484 -
	drw_clr_free(thmsel->fg);
478 +
	drw_clr_free(scheme[SchemeNorm].border);
479 +
	drw_clr_free(scheme[SchemeNorm].bg);
480 +
	drw_clr_free(scheme[SchemeNorm].fg);
481 +
	drw_clr_free(scheme[SchemeSel].border);
482 +
	drw_clr_free(scheme[SchemeSel].bg);
483 +
	drw_clr_free(scheme[SchemeSel].fg);
485 484
	drw_free(drw);
486 485
	XSync(dpy, False);
487 486
	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
705 704
	x = 0;
706 705
	for(i = 0; i < LENGTH(tags); i++) {
707 706
		w = TEXTW(tags[i]);
708 -
		drw_settheme(drw, m->tagset[m->seltags] & 1 << i ? thmsel : thmnorm);
707 +
		drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
709 708
		drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i);
710 709
		drw_rect(drw, x, 0, w, bh, m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
711 710
		           occ & 1 << i, urg & 1 << i);
712 711
		x += w;
713 712
	}
714 713
	w = blw = TEXTW(m->ltsymbol);
715 -
	drw_settheme(drw, thmnorm);
714 +
	drw_setscheme(drw, &scheme[SchemeNorm]);
716 715
	drw_text(drw, x, 0, w, bh, m->ltsymbol, 0);
717 716
	x += w;
718 717
	xx = x;
730 729
	if((w = x - xx) > bh) {
731 730
		x = xx;
732 731
		if(m->sel) {
733 -
			drw_settheme(drw, m == selmon ? thmsel : thmnorm);
732 +
			drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
734 733
			drw_text(drw, x, 0, w, bh, m->sel->name, 0);
735 734
			drw_rect(drw, x, 0, w, bh, m->sel->isfixed, m->sel->isfloating, 0);
736 735
		}
737 736
		else {
738 -
			drw_settheme(drw, thmnorm);
737 +
			drw_setscheme(drw, &scheme[SchemeNorm]);
739 738
			drw_text(drw, x, 0, w, bh, NULL, 0);
740 739
		}
741 740
	}
793 792
		detachstack(c);
794 793
		attachstack(c);
795 794
		grabbuttons(c, True);
796 -
		XSetWindowBorder(dpy, c->win, thmsel->border->rgb);
795 +
		XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->rgb);
797 796
		setfocus(c);
798 797
	}
799 798
	else {
1041 1040
1042 1041
	wc.border_width = c->bw;
1043 1042
	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
1044 -
	XSetWindowBorder(dpy, w, thmnorm->border->rgb);
1043 +
	XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->rgb);
1045 1044
	configure(c); /* propagates border_width, if size doesn't change */
1046 1045
	updatewindowtype(c);
1047 1046
	updatesizehints(c);
1523 1522
	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
1524 1523
	cursor[CurMove] = drw_cur_create(drw, XC_fleur);
1525 1524
	/* init appearance */
1526 -
	thmnorm->border = drw_clr_create(drw, normbordercolor);
1527 -
	thmnorm->bg = drw_clr_create(drw, normbgcolor);
1528 -
	thmnorm->fg = drw_clr_create(drw, normfgcolor);
1529 -
	thmsel->border = drw_clr_create(drw, selbordercolor);
1530 -
	thmsel->bg = drw_clr_create(drw, selbgcolor);
1531 -
	thmsel->fg = drw_clr_create(drw, selfgcolor);
1525 +
	scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor);
1526 +
	scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor);
1527 +
	scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor);
1528 +
	scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor);
1529 +
	scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor);
1530 +
	scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor);
1532 1531
	/* init bars */
1533 1532
	updatebars();
1534 1533
	updatestatus();
1674 1673
	if(!c)
1675 1674
		return;
1676 1675
	grabbuttons(c, False);
1677 -
	XSetWindowBorder(dpy, c->win, thmnorm->border->rgb);
1676 +
	XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->rgb);
1678 1677
	if(setfocus) {
1679 1678
		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
1680 1679
		XDeleteProperty(dpy, root, netatom[NetActiveWindow]);