dwm-fancybar-5.6.1.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-fancybar-5.6.1.diff (2771B)
---
1 diff -r e47a47bd3ed4 dwm.c
2 --- a/dwm.c Tue Jul 21 10:57:54 2009 +0100
3 +++ b/dwm.c Mon Aug 24 18:28:57 2009 +0200
4 @@ -169,6 +169,7 @@
5 static Monitor *dirtomon(int dir);
6 static void drawbar(Monitor *m);
7 static void drawbars(void);
8 +static void drawvline(unsigned long col[ColLast]);
9 static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
10 static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
11 static void enternotify(XEvent *e);
12 @@ -648,10 +649,11 @@
13
14 void
15 drawbar(Monitor *m) {
16 - int x;
17 + int x, ow, mw = 0, extra, tw;
18 unsigned int i, n = 0, occ = 0, urg = 0;
19 unsigned long *col;
20 - Client *c;
21 + Client *c, *firstvis, *lastvis = NULL;
22 + DC seldc;
23
24 for(c = m->clients; c; c = c->next) {
25 if(ISVISIBLE(c))
26 @@ -689,16 +691,62 @@
27 }
28 else
29 dc.x = m->ww;
30 - if((dc.w = dc.x - x) > bh) {
31 - dc.x = x;
32 - if(m->sel) {
33 - col = m == selmon ? dc.sel : dc.norm;
34 - drawtext(m->sel->name, col, False);
35 - drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
36 +
37 + for(c = m->clients; c && !ISVISIBLE(c); c = c->next);
38 + firstvis = c;
39 +
40 + col = m == selmon ? dc.sel : dc.norm;
41 + dc.w = dc.x - x;
42 + dc.x = x;
43 +
44 + if(n > 0) {
45 + mw = dc.w / n;
46 + extra = 0;
47 + seldc = dc;
48 + i = 0;
49 +
50 + while(c) {
51 + lastvis = c;
52 + tw = TEXTW(c->name);
53 + if(tw < mw) extra += (mw - tw); else i++;
54 + for(c = c->next; c && !ISVISIBLE(c); c = c->next);
55 }
56 - else
57 +
58 + if(i > 0) mw += extra / i;
59 +
60 + c = firstvis;
61 + x = dc.x;
62 + }
63 +
64 + while(dc.w > bh) {
65 + if(c) {
66 + ow = dc.w;
67 + tw = TEXTW(c->name);
68 + dc.w = MIN(ow, tw);
69 +
70 + if(dc.w > mw) dc.w = mw;
71 + if(m->sel == c) seldc = dc;
72 + if(c == lastvis) dc.w = ow;
73 +
74 + drawtext(c->name, col, False);
75 + if(c != firstvis) drawvline(col);
76 + drawsquare(c->isfixed, c->isfloating, False, col);
77 +
78 + dc.x += dc.w;
79 + dc.w = ow - dc.w;
80 + for(c = c->next; c && !ISVISIBLE(c); c = c->next);
81 + } else {
82 drawtext(NULL, dc.norm, False);
83 + break;
84 + }
85 }
86 +
87 + if(m == selmon && m->sel && ISVISIBLE(m->sel)) {
88 + dc = seldc;
89 + drawtext(m->sel->name, col, True);
90 + drawsquare(m->sel->isfixed, m->sel->isfloating, True, col);
91 + }
92 +
93 XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
94 XSync(dpy, False);
95 }
96 @@ -709,6 +757,15 @@
97
98 for(m = mons; m; m = m->next)
99 drawbar(m);
100 +}
101 +
102 +void
103 +drawvline(unsigned long col[ColLast]) {
104 + XGCValues gcv;
105 +
106 + gcv.foreground = col[ColFG];
107 + XChangeGC(dpy, dc.gc, GCForeground, &gcv);
108 + XDrawLine(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.x, dc.y + (dc.font.ascent + dc.font.descent + 2));
109 }
110
111 void
112 @@ -1235,8 +1292,7 @@
113 }
114 if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
115 updatetitle(c);
116 - if(c == selmon->sel)
117 - drawbars();
118 + drawbars();
119 }
120 }
121 }