1 /* |
1 /* |
2 * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> |
2 * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> |
3 * See LICENSE file for license details. |
3 * See LICENSE file for license details. |
4 */ |
4 */ |
|
5 #include "dwm.h" |
5 |
6 |
6 #include <stdio.h> |
7 #include <stdio.h> |
7 #include <string.h> |
8 #include <string.h> |
8 |
|
9 #include <X11/Xlocale.h> |
9 #include <X11/Xlocale.h> |
10 |
10 |
11 #include "dwm.h" |
11 /* static functions */ |
12 |
|
13 void |
|
14 drawall() |
|
15 { |
|
16 Client *c; |
|
17 |
|
18 for(c = clients; c; c = getnext(c->next)) |
|
19 drawtitle(c); |
|
20 drawstatus(); |
|
21 } |
|
22 |
|
23 void |
|
24 drawstatus() |
|
25 { |
|
26 int i; |
|
27 Bool istile = arrange == dotile; |
|
28 |
|
29 dc.x = dc.y = 0; |
|
30 dc.w = bw; |
|
31 drawtext(NULL, !istile, False); |
|
32 |
|
33 dc.w = 0; |
|
34 for(i = 0; i < TLast; i++) { |
|
35 dc.x += dc.w; |
|
36 dc.w = textw(tags[i]); |
|
37 if(istile) |
|
38 drawtext(tags[i], (i == tsel), True); |
|
39 else |
|
40 drawtext(tags[i], (i != tsel), True); |
|
41 } |
|
42 if(sel) { |
|
43 dc.x += dc.w; |
|
44 dc.w = textw(sel->name); |
|
45 drawtext(sel->name, istile, True); |
|
46 } |
|
47 dc.w = textw(stext); |
|
48 dc.x = bx + bw - dc.w; |
|
49 drawtext(stext, !istile, False); |
|
50 |
|
51 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
|
52 XFlush(dpy); |
|
53 } |
|
54 |
|
55 void |
|
56 drawtitle(Client *c) |
|
57 { |
|
58 int i; |
|
59 Bool istile = arrange == dotile; |
|
60 |
|
61 if(c == sel) { |
|
62 drawstatus(); |
|
63 XUnmapWindow(dpy, c->title); |
|
64 XSetWindowBorder(dpy, c->win, dc.fg); |
|
65 return; |
|
66 } |
|
67 |
|
68 XSetWindowBorder(dpy, c->win, dc.bg); |
|
69 XMapWindow(dpy, c->title); |
|
70 |
|
71 dc.x = dc.y = 0; |
|
72 |
|
73 dc.w = 0; |
|
74 for(i = 0; i < TLast; i++) { |
|
75 if(c->tags[i]) { |
|
76 dc.x += dc.w; |
|
77 dc.w = textw(c->tags[i]); |
|
78 drawtext(c->tags[i], !istile, True); |
|
79 } |
|
80 } |
|
81 dc.x += dc.w; |
|
82 dc.w = textw(c->name); |
|
83 drawtext(c->name, !istile, True); |
|
84 XCopyArea(dpy, dc.drawable, c->title, dc.gc, |
|
85 0, 0, c->tw, c->th, 0, 0); |
|
86 XFlush(dpy); |
|
87 } |
|
88 |
12 |
89 static void |
13 static void |
90 drawborder(void) |
14 drawborder(void) |
91 { |
15 { |
92 XPoint points[5]; |
16 XPoint points[5]; |
103 points[4].x = 0; |
27 points[4].x = 0; |
104 points[4].y = -(dc.h - 1); |
28 points[4].y = -(dc.h - 1); |
105 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
29 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
106 } |
30 } |
107 |
31 |
|
32 /* extern functions */ |
|
33 |
|
34 void |
|
35 drawall() |
|
36 { |
|
37 Client *c; |
|
38 |
|
39 for(c = clients; c; c = getnext(c->next)) |
|
40 drawtitle(c); |
|
41 drawstatus(); |
|
42 } |
|
43 |
|
44 void |
|
45 drawstatus() |
|
46 { |
|
47 int i; |
|
48 Bool istile = arrange == dotile; |
|
49 |
|
50 dc.x = dc.y = 0; |
|
51 dc.w = bw; |
|
52 drawtext(NULL, !istile, False); |
|
53 |
|
54 dc.w = 0; |
|
55 for(i = 0; i < TLast; i++) { |
|
56 dc.x += dc.w; |
|
57 dc.w = textw(tags[i]); |
|
58 if(istile) |
|
59 drawtext(tags[i], (i == tsel), True); |
|
60 else |
|
61 drawtext(tags[i], (i != tsel), True); |
|
62 } |
|
63 if(sel) { |
|
64 dc.x += dc.w; |
|
65 dc.w = textw(sel->name); |
|
66 drawtext(sel->name, istile, True); |
|
67 } |
|
68 dc.w = textw(stext); |
|
69 dc.x = bx + bw - dc.w; |
|
70 drawtext(stext, !istile, False); |
|
71 |
|
72 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
|
73 XFlush(dpy); |
|
74 } |
|
75 |
108 void |
76 void |
109 drawtext(const char *text, Bool invert, Bool border) |
77 drawtext(const char *text, Bool invert, Bool border) |
110 { |
78 { |
111 int x, y, w, h; |
79 int x, y, w, h; |
112 unsigned int len; |
80 unsigned int len; |
153 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
121 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
154 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
122 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
155 } |
123 } |
156 } |
124 } |
157 |
125 |
|
126 void |
|
127 drawtitle(Client *c) |
|
128 { |
|
129 int i; |
|
130 Bool istile = arrange == dotile; |
|
131 |
|
132 if(c == sel) { |
|
133 drawstatus(); |
|
134 XUnmapWindow(dpy, c->title); |
|
135 XSetWindowBorder(dpy, c->win, dc.fg); |
|
136 return; |
|
137 } |
|
138 |
|
139 XSetWindowBorder(dpy, c->win, dc.bg); |
|
140 XMapWindow(dpy, c->title); |
|
141 |
|
142 dc.x = dc.y = 0; |
|
143 |
|
144 dc.w = 0; |
|
145 for(i = 0; i < TLast; i++) { |
|
146 if(c->tags[i]) { |
|
147 dc.x += dc.w; |
|
148 dc.w = textw(c->tags[i]); |
|
149 drawtext(c->tags[i], !istile, True); |
|
150 } |
|
151 } |
|
152 dc.x += dc.w; |
|
153 dc.w = textw(c->name); |
|
154 drawtext(c->name, !istile, True); |
|
155 XCopyArea(dpy, dc.drawable, c->title, dc.gc, |
|
156 0, 0, c->tw, c->th, 0, 0); |
|
157 XFlush(dpy); |
|
158 } |
|
159 |
158 unsigned long |
160 unsigned long |
159 getcolor(const char *colstr) |
161 getcolor(const char *colstr) |
160 { |
162 { |
161 XColor color; |
163 XColor color; |
162 Colormap cmap = DefaultColormap(dpy, screen); |
164 Colormap cmap = DefaultColormap(dpy, screen); |
163 |
165 |
164 XAllocNamedColor(dpy, cmap, colstr, &color, &color); |
166 XAllocNamedColor(dpy, cmap, colstr, &color, &color); |
165 return color.pixel; |
167 return color.pixel; |
166 } |
|
167 |
|
168 unsigned int |
|
169 textnw(char *text, unsigned int len) |
|
170 { |
|
171 XRectangle r; |
|
172 if(dc.font.set) { |
|
173 XmbTextExtents(dc.font.set, text, len, NULL, &r); |
|
174 return r.width; |
|
175 } |
|
176 return XTextWidth(dc.font.xfont, text, len); |
|
177 } |
|
178 |
|
179 unsigned int |
|
180 textw(char *text) |
|
181 { |
|
182 return textnw(text, strlen(text)) + dc.font.height; |
|
183 } |
168 } |
184 |
169 |
185 void |
170 void |
186 setfont(const char *fontstr) |
171 setfont(const char *fontstr) |
187 { |
172 { |
230 dc.font.ascent = dc.font.xfont->ascent; |
215 dc.font.ascent = dc.font.xfont->ascent; |
231 dc.font.descent = dc.font.xfont->descent; |
216 dc.font.descent = dc.font.xfont->descent; |
232 } |
217 } |
233 dc.font.height = dc.font.ascent + dc.font.descent; |
218 dc.font.height = dc.font.ascent + dc.font.descent; |
234 } |
219 } |
|
220 |
|
221 unsigned int |
|
222 textnw(char *text, unsigned int len) |
|
223 { |
|
224 XRectangle r; |
|
225 if(dc.font.set) { |
|
226 XmbTextExtents(dc.font.set, text, len, NULL, &r); |
|
227 return r.width; |
|
228 } |
|
229 return XTextWidth(dc.font.xfont, text, len); |
|
230 } |
|
231 |
|
232 unsigned int |
|
233 textw(char *text) |
|
234 { |
|
235 return textnw(text, strlen(text)) + dc.font.height; |
|
236 } |