comparison draw.c @ 76:4bd49f404f10

proceeded with cleaning up, sorting functions, etc
author Anselm R. Garbe <garbeam@wmii.de>
date Sat, 15 Jul 2006 17:00:56 +0200
parents f08271b7cb20
children 38c8f7f7d401
comparison
equal deleted inserted replaced
75:f08271b7cb20 76:4bd49f404f10
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 }