applied Julian's enum approach,
33a74489
however renamed theme into scheme resp. Theme into ClrScheme
3 file(s) · +37 −40
however renamed theme into scheme resp. Theme into ClrScheme
| 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 |
|
| 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); |
|
| 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]); |
|