20 } |
20 } |
21 return XTextWidth(dc.font.xfont, text, len); |
21 return XTextWidth(dc.font.xfont, text, len); |
22 } |
22 } |
23 |
23 |
24 static void |
24 static void |
25 drawtext(const char *text, unsigned int colidx, Bool highlight) |
25 drawtext(const char *text, Bool invert, Bool highlight) |
26 { |
26 { |
27 int x, y, w, h; |
27 int x, y, w, h; |
28 static char buf[256]; |
28 static char buf[256]; |
29 unsigned int len, olen; |
29 unsigned int len, olen; |
|
30 XGCValues gcv; |
30 XPoint points[5]; |
31 XPoint points[5]; |
31 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
32 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
32 |
33 |
33 XSetForeground(dpy, dc.gc, dc.bg[colidx]); |
34 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
34 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
35 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
35 points[0].x = dc.x; |
36 points[0].x = dc.x; |
36 points[0].y = dc.y; |
37 points[0].y = dc.y; |
37 points[1].x = dc.w - 1; |
38 points[1].x = dc.w - 1; |
38 points[1].y = 0; |
39 points[1].y = 0; |
40 points[2].y = dc.h - 1; |
41 points[2].y = dc.h - 1; |
41 points[3].x = -(dc.w - 1); |
42 points[3].x = -(dc.w - 1); |
42 points[3].y = 0; |
43 points[3].y = 0; |
43 points[4].x = 0; |
44 points[4].x = 0; |
44 points[4].y = -(dc.h - 1); |
45 points[4].y = -(dc.h - 1); |
45 XSetForeground(dpy, dc.gc, dc.fg[colidx]); |
46 XSetForeground(dpy, dc.gc, dc.border); |
46 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
47 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
47 |
48 |
48 if(!text) |
49 if(!text) |
49 return; |
50 return; |
50 |
51 |
71 buf[len - 3] = '.'; |
72 buf[len - 3] = '.'; |
72 } |
73 } |
73 |
74 |
74 if(w > dc.w) |
75 if(w > dc.w) |
75 return; /* too long */ |
76 return; /* too long */ |
76 if(dc.font.set) |
77 gcv.foreground = invert ? dc.bg : dc.fg; |
|
78 gcv.background = invert ? dc.fg : dc.bg; |
|
79 if(dc.font.set) { |
|
80 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
77 XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); |
81 XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); |
|
82 } |
78 else { |
83 else { |
79 XSetFont(dpy, dc.gc, dc.font.xfont->fid); |
84 gcv.font = dc.font.xfont->fid; |
|
85 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
80 XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
86 XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
81 } |
87 } |
82 if(highlight) { |
88 if(highlight) { |
83 points[0].x = dc.x + 1; |
89 r.x = dc.x + 2; |
84 points[0].y = dc.y + 1; |
90 r.y = dc.y + 2; |
85 points[1].x = dc.w - 3; |
91 r.width = r.height = 3; |
86 points[1].y = 0; |
92 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
87 points[2].x = 0; |
|
88 points[2].y = dc.h - 3; |
|
89 points[3].x = -(dc.w - 3); |
|
90 points[3].y = 0; |
|
91 points[4].x = 0; |
|
92 points[4].y = -(dc.h - 3); |
|
93 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
|
94 } |
93 } |
95 } |
94 } |
96 |
95 |
97 /* extern */ |
96 /* extern */ |
98 |
97 |
112 int i, x; |
111 int i, x; |
113 Bool istile = arrange == dotile; |
112 Bool istile = arrange == dotile; |
114 |
113 |
115 dc.x = dc.y = 0; |
114 dc.x = dc.y = 0; |
116 dc.w = bw; |
115 dc.w = bw; |
117 drawtext(NULL, istile ? 1 : 0, False); |
116 drawtext(NULL, !istile, False); |
118 |
117 |
119 dc.w = 0; |
118 dc.w = 0; |
120 for(i = 0; i < ntags; i++) { |
119 for(i = 0; i < ntags; i++) { |
121 dc.x += dc.w; |
120 dc.x += dc.w; |
122 dc.w = textw(tags[i]); |
121 dc.w = textw(tags[i]); |
123 if(istile) |
122 if(istile) |
124 drawtext(tags[i], seltag[i] ? 0 : 1, sel && sel->tags[i]); |
123 drawtext(tags[i], seltag[i], sel && sel->tags[i]); |
125 else |
124 else |
126 drawtext(tags[i], seltag[i] ? 1 : 0, sel && sel->tags[i]); |
125 drawtext(tags[i], !seltag[i], sel && sel->tags[i]); |
127 } |
126 } |
128 x = dc.x + dc.w; |
127 x = dc.x + dc.w; |
129 dc.w = textw(stext); |
128 dc.w = textw(stext); |
130 dc.x = bx + bw - dc.w; |
129 dc.x = bx + bw - dc.w; |
131 if(dc.x < x) { |
130 if(dc.x < x) { |
132 dc.x = x; |
131 dc.x = x; |
133 dc.w = bw - x; |
132 dc.w = bw - x; |
134 } |
133 } |
135 drawtext(stext, istile ? 1 : 0, False); |
134 drawtext(stext, !istile, False); |
136 |
135 |
137 if(sel && ((dc.w = dc.x - x) > bh)) { |
136 if(sel && ((dc.w = dc.x - x) > bh)) { |
138 dc.x = x; |
137 dc.x = x; |
139 drawtext(sel->name, istile ? 0 : 1, False); |
138 drawtext(sel->name, istile, False); |
140 } |
139 } |
141 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
140 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
142 XSync(dpy, False); |
141 XSync(dpy, False); |
143 } |
142 } |
144 |
143 |
149 Bool istile = arrange == dotile; |
148 Bool istile = arrange == dotile; |
150 |
149 |
151 if(c == sel && issel) { |
150 if(c == sel && issel) { |
152 drawstatus(); |
151 drawstatus(); |
153 XUnmapWindow(dpy, c->twin); |
152 XUnmapWindow(dpy, c->twin); |
154 XSetWindowBorder(dpy, c->win, dc.fg[1]); |
153 XSetWindowBorder(dpy, c->win, dc.fg); |
155 return; |
154 return; |
156 } |
155 } |
157 |
156 |
158 XSetWindowBorder(dpy, c->win, dc.bg[0]); |
157 XSetWindowBorder(dpy, c->win, dc.bg); |
159 XMapWindow(dpy, c->twin); |
158 XMapWindow(dpy, c->twin); |
160 dc.x = dc.y = 0; |
159 dc.x = dc.y = 0; |
161 dc.w = c->tw; |
160 dc.w = c->tw; |
162 drawtext(c->name, istile ? 1 : 0, False); |
161 drawtext(c->name, !istile, False); |
163 XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0); |
162 XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0); |
164 XSync(dpy, False); |
163 XSync(dpy, False); |
165 } |
164 } |
166 |
165 |
167 unsigned long |
166 unsigned long |