Advertisement
Guest User

Untitled

a guest
May 30th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.80 KB | None | 0 0
  1. this is broken
  2.  
  3. diff --git a/config.def.h b/config.def.h
  4. index eaae8f3..6f150cf 100644
  5. --- a/config.def.h
  6. +++ b/config.def.h
  7. @@ -7,12 +7,12 @@ static const char *fonts[] = {
  8. "WenQuanYi Micro Hei:size=10.5",
  9. };
  10. static const char dmenufont[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
  11. -static const char normbordercolor[] = "#444444";
  12. -static const char normbgcolor[] = "#222222";
  13. -static const char normfgcolor[] = "#bbbbbb";
  14. -static const char selbordercolor[] = "#005577";
  15. -static const char selbgcolor[] = "#005577";
  16. -static const char selfgcolor[] = "#eeeeee";
  17. +static const char schemes[NUMSCHEMES][ColLast][8] = {
  18. + /* border background foreground */
  19. + { "#444444", "#222222", "#bbbbbb" }, /* 1 = normal */
  20. + { "#005577", "#005577", "#eeeeee" }, /* 2 = selected */
  21. + { "#aa4444", "#222222", "#aa4444" }, /* 3 = urgent */
  22. +};
  23. static const unsigned int borderpx = 1; /* border pixel of windows */
  24. static const unsigned int snap = 32; /* snap pixel */
  25. static const Bool showbar = True; /* False means no bar */
  26. @@ -56,7 +56,7 @@ static const Layout layouts[] = {
  27.  
  28. /* commands */
  29. static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
  30. -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
  31. +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", schemes[0][ColBG], "-nf", schemes[0][ColFG], "-sb", schemes[1][ColBG], "-sf", schemes[1][ColFG], NULL };
  32. static const char *termcmd[] = { "st", NULL };
  33.  
  34. static Key keys[] = {
  35. diff --git a/drw.c b/drw.c
  36. index eb3b3c3..8e36470 100644
  37. --- a/drw.c
  38. +++ b/drw.c
  39. @@ -203,12 +203,12 @@ drw_setscheme(Drw *drw, ClrScheme *scheme) {
  40. }
  41.  
  42. void
  43. -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert) {
  44. +drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty) {
  45. int dx;
  46.  
  47. if(!drw || !drw->fontcount || !drw->scheme)
  48. return;
  49. - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->pix : drw->scheme->fg->pix);
  50. + XSetForeground(drw->dpy, drw->gc, drw->scheme->fg->pix);
  51. dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4;
  52. if(filled)
  53. XFillRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx+1, dx+1);
  54. @@ -217,7 +217,7 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int
  55. }
  56.  
  57. int
  58. -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int invert) {
  59. +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int pad) {
  60. char buf[1024];
  61. int tx, ty, th;
  62. Extnts tex;
  63. @@ -242,7 +242,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *tex
  64. if (!drw || !drw->scheme) {
  65. return 0;
  66. } else if (render) {
  67. - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->pix : drw->scheme->bg->pix);
  68. + XSetForeground(drw->dpy, drw->gc, drw->scheme->bg->pix);
  69. XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
  70. }
  71.  
  72. @@ -294,10 +294,10 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *tex
  73. for(i = len; i && i > len - 3; buf[--i] = '.');
  74.  
  75. if (render) {
  76. - th = curfont->ascent + curfont->descent;
  77. + th = pad ? (curfont->ascent + curfont->descent) : 0;
  78. ty = y + (h / 2) - (th / 2) + curfont->ascent;
  79. tx = x + (h / 2);
  80. - XftDrawStringUtf8(d, invert ? &drw->scheme->bg->rgb : &drw->scheme->fg->rgb, curfont->xfont, tx, ty, (XftChar8 *)buf, len);
  81. + XftDrawStringUtf8(d, &drw->scheme->fg->rgb, curfont->xfont, tx, ty, (XftChar8 *)buf, len);
  82. }
  83.  
  84. x += tex.w;
  85. @@ -373,11 +373,23 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) {
  86.  
  87. void
  88. drw_font_getexts(Fnt *font, const char *text, unsigned int len, Extnts *tex) {
  89. + /* remove non-printing color codes before calculating width */
  90. + char *ptr = (char *) text;
  91. + unsigned int i, ibuf;
  92. + char buf[len + 1];
  93. XGlyphInfo ext;
  94.  
  95. + for(i = 0, ibuf = 0; *ptr && i < len; i++, ptr++) {
  96. + if(!(*ptr <= NUMSCHEMES && *ptr > 0)) {
  97. + buf[ibuf] = *ptr;
  98. + ibuf++;
  99. + }
  100. + }
  101. + buf[ibuf] = 0;
  102. +
  103. if(!font || !text)
  104. return;
  105. - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
  106. + XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)buf, ibuf, &ext);
  107. tex->h = font->h;
  108. tex->w = ext.xOff;
  109. }
  110. diff --git a/drw.h b/drw.h
  111. index 536171b..855b4e9 100644
  112. --- a/drw.h
  113. +++ b/drw.h
  114. @@ -1,6 +1,8 @@
  115. /* See LICENSE file for copyright and license details. */
  116. #define DRW_FONT_CACHE_SIZE 32
  117.  
  118. +#define NUMSCHEMES 3
  119. +
  120. typedef struct {
  121. unsigned long pix;
  122. XftColor rgb;
  123. @@ -67,8 +69,8 @@ void drw_setfont(Drw *drw, Fnt *font);
  124. void drw_setscheme(Drw *drw, ClrScheme *scheme);
  125.  
  126. /* Drawing functions */
  127. -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert);
  128. -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int invert);
  129. +void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty);
  130. +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int pad);
  131.  
  132. /* Map functions */
  133. void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
  134. diff --git a/dwm.c b/dwm.c
  135. index 169adcb..a8fd1c0 100644
  136. --- a/dwm.c
  137. +++ b/dwm.c
  138. @@ -60,6 +60,7 @@
  139. /* enums */
  140. enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
  141. enum { SchemeNorm, SchemeSel, SchemeLast }; /* color schemes */
  142. +enum { ColBorder, ColBG, ColFG, ColLast }; /* scheme elements */
  143. enum { NetSupported, NetWMName, NetWMState,
  144. NetWMFullscreen, NetActiveWindow, NetWMWindowType,
  145. NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
  146. @@ -164,6 +165,7 @@ static void detachstack(Client *c);
  147. static Monitor *dirtomon(int dir);
  148. static void drawbar(Monitor *m);
  149. static void drawbars(void);
  150. +static void drawcoloredtext(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text);
  151. static void enternotify(XEvent *e);
  152. static void expose(XEvent *e);
  153. static void focus(Client *c);
  154. @@ -261,7 +263,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
  155. static Atom wmatom[WMLast], netatom[NetLast];
  156. static Bool running = True;
  157. static Cur *cursor[CurLast];
  158. -static ClrScheme scheme[SchemeLast];
  159. +static ClrScheme scheme[NUMSCHEMES];
  160. static Display *dpy;
  161. static Drw *drw;
  162. static Monitor *mons, *selmon;
  163. @@ -690,6 +692,32 @@ dirtomon(int dir) {
  164. }
  165.  
  166. void
  167. +drawcoloredtext(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text) {
  168. + char *buf = (char *)text, *ptr = buf, c = 1;
  169. + ClrScheme col = scheme[SchemeNorm];
  170. + int i, ox = x;
  171. +
  172. + while(*ptr) {
  173. + for(i = 0; *ptr < 0 || *ptr > NUMSCHEMES; i++, ptr++);
  174. + if(!*ptr) break;
  175. + c = *ptr;
  176. + *ptr = 0;
  177. + if(i) {
  178. + w = selmon->ww - x;
  179. + drw_setscheme(drw, &col);
  180. + drw_text(drw, x, 0, w, bh, buf, 1);
  181. + x += drw_font_getexts_width(drw->fonts[0], buf, i);
  182. + }
  183. + *ptr = c;
  184. + col = scheme[c - 1];
  185. + buf = ++ptr;
  186. + }
  187. + drw_setscheme(drw, &col);
  188. + drw_text(drw, x, 0, w, bh, buf, 1);
  189. + x = ox;
  190. +}
  191. +
  192. +void
  193. drawbar(Monitor *m) {
  194. int x, xx, w;
  195. unsigned int i, occ = 0, urg = 0;
  196. @@ -703,15 +731,15 @@ drawbar(Monitor *m) {
  197. x = 0;
  198. for(i = 0; i < LENGTH(tags); i++) {
  199. w = TEXTW(tags[i]);
  200. - drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
  201. - drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i);
  202. + drw_setscheme(drw, &scheme[(m->tagset[m->seltags] & 1 << i) ? 1 : (urg & 1 << i ? 2:0)]);
  203. + drw_text(drw, x, 0, w, bh, tags[i], 1);
  204. drw_rect(drw, x, 0, w, bh, m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
  205. - occ & 1 << i, urg & 1 << i);
  206. + occ & 1 << i);
  207. x += w;
  208. }
  209. w = blw = TEXTW(m->ltsymbol);
  210. drw_setscheme(drw, &scheme[SchemeNorm]);
  211. - drw_text(drw, x, 0, w, bh, m->ltsymbol, 0);
  212. + drw_text(drw, x, 0, w, bh, m->ltsymbol, 1);
  213. x += w;
  214. xx = x;
  215. if(m == selmon) { /* status is only drawn on selected monitor */
  216. @@ -721,16 +749,16 @@ drawbar(Monitor *m) {
  217. x = xx;
  218. w = m->ww - xx;
  219. }
  220. - drw_text(drw, x, 0, w, bh, stext, 0);
  221. + drawcoloredtext(drw, x, 0, w, bh, stext);
  222. }
  223. else
  224. x = m->ww;
  225. if((w = x - xx) > bh) {
  226. x = xx;
  227. if(m->sel) {
  228. - drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
  229. - drw_text(drw, x, 0, w, bh, m->sel->name, 0);
  230. - drw_rect(drw, x, 0, w, bh, m->sel->isfixed, m->sel->isfloating, 0);
  231. + drw_setscheme(drw, &scheme[m == selmon ? SchemeSel : SchemeNorm]);
  232. + drw_text(drw, x, 0, w, bh, m->sel->name, 1);
  233. + drw_rect(drw, x, 0, w, bh, m->sel->isfixed, m->sel->isfloating);
  234. }
  235. else {
  236. drw_setscheme(drw, &scheme[SchemeNorm]);
  237. @@ -1531,12 +1559,11 @@ setup(void) {
  238. cursor[CurResize] = drw_cur_create(drw, XC_sizing);
  239. cursor[CurMove] = drw_cur_create(drw, XC_fleur);
  240. /* init appearance */
  241. - scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor);
  242. - scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor);
  243. - scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor);
  244. - scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor);
  245. - scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor);
  246. - scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor);
  247. + for(int i = 0; i < NUMSCHEMES; i++) {
  248. + scheme[i].border = drw_clr_create(drw, schemes[i][ColBorder]);
  249. + scheme[i].bg = drw_clr_create(drw, schemes[i][ColBG]);
  250. + scheme[i].fg = drw_clr_create(drw, schemes[i][ColFG]);
  251. + }
  252. /* init bars */
  253. updatebars();
  254. updatestatus();
  255. @@ -1957,8 +1984,11 @@ updatewmhints(Client *c) {
  256. wmh->flags &= ~XUrgencyHint;
  257. XSetWMHints(dpy, c->win, wmh);
  258. }
  259. - else
  260. + else {
  261. c->isurgent = (wmh->flags & XUrgencyHint) ? True : False;
  262. + if(c->isurgent)
  263. + XSetWindowBorder(dpy, c->win, scheme[SchemeLast].border->pix);
  264. + }
  265. if(wmh->flags & InputHint)
  266. c->neverfocus = !wmh->input;
  267. else
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement