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, Bool invert) |
25 drawborder() |
26 { |
26 { |
27 int x, y, w, h; |
|
28 static char buf[256]; |
|
29 unsigned int len, olen; |
|
30 XGCValues gcv; |
|
31 XPoint points[5]; |
27 XPoint points[5]; |
32 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
33 |
|
34 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
|
35 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
36 XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); |
|
37 XSetForeground(dpy, dc.gc, dc.border); |
|
38 points[0].x = dc.x; |
28 points[0].x = dc.x; |
39 points[0].y = dc.y; |
29 points[0].y = dc.y; |
40 points[1].x = dc.w - 1; |
30 points[1].x = dc.w - 1; |
41 points[1].y = 0; |
31 points[1].y = 0; |
42 points[2].x = 0; |
32 points[2].x = 0; |
44 points[3].x = -(dc.w - 1); |
34 points[3].x = -(dc.w - 1); |
45 points[3].y = 0; |
35 points[3].y = 0; |
46 points[4].x = 0; |
36 points[4].x = 0; |
47 points[4].y = -(dc.h - 1); |
37 points[4].y = -(dc.h - 1); |
48 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
38 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
|
39 } |
|
40 |
|
41 static void |
|
42 drawtext(const char *text, Bool invert, Bool highlight) |
|
43 { |
|
44 int x, y, w, h; |
|
45 static char buf[256]; |
|
46 unsigned int len, olen; |
|
47 DC tmp; |
|
48 XGCValues gcv; |
|
49 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
50 |
|
51 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
|
52 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
53 XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); |
|
54 XSetForeground(dpy, dc.gc, dc.border); |
|
55 drawborder(); |
49 |
56 |
50 if(!text) |
57 if(!text) |
51 return; |
58 return; |
52 |
59 |
53 w = 0; |
60 w = 0; |
73 buf[len - 3] = '.'; |
80 buf[len - 3] = '.'; |
74 } |
81 } |
75 |
82 |
76 if(w > dc.w) |
83 if(w > dc.w) |
77 return; /* too long */ |
84 return; /* too long */ |
78 |
|
79 gcv.foreground = invert ? dc.bg : dc.fg; |
85 gcv.foreground = invert ? dc.bg : dc.fg; |
80 gcv.background = invert ? dc.fg : dc.bg; |
86 gcv.background = invert ? dc.fg : dc.bg; |
81 if(dc.font.set) { |
87 if(dc.font.set) { |
82 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
88 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
83 XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, |
89 XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); |
84 x, y, buf, len); |
|
85 } |
90 } |
86 else { |
91 else { |
87 gcv.font = dc.font.xfont->fid; |
92 gcv.font = dc.font.xfont->fid; |
88 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
93 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
89 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
94 XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
|
95 } |
|
96 if(highlight) { |
|
97 tmp = dc; |
|
98 dc.x += 2; |
|
99 dc.y += 2; |
|
100 dc.w -= 4; |
|
101 dc.h -= 4; |
|
102 drawborder(); |
|
103 dc = tmp; |
90 } |
104 } |
91 } |
105 } |
92 |
106 |
93 /* extern */ |
107 /* extern */ |
94 |
108 |
108 int i, x; |
122 int i, x; |
109 Bool istile = arrange == dotile; |
123 Bool istile = arrange == dotile; |
110 |
124 |
111 dc.x = dc.y = 0; |
125 dc.x = dc.y = 0; |
112 dc.w = bw; |
126 dc.w = bw; |
113 drawtext(NULL, !istile); |
127 drawtext(NULL, !istile, False); |
114 |
128 |
115 dc.w = 0; |
129 dc.w = 0; |
116 for(i = 0; i < ntags; i++) { |
130 for(i = 0; i < ntags; i++) { |
117 dc.x += dc.w; |
131 dc.x += dc.w; |
118 dc.w = textw(tags[i]); |
132 dc.w = textw(tags[i]); |
119 if(istile) |
133 if(istile) |
120 drawtext(tags[i], seltag[i]); |
134 drawtext(tags[i], seltag[i], sel && sel->tags[i]); |
121 else |
135 else |
122 drawtext(tags[i], !seltag[i]); |
136 drawtext(tags[i], !seltag[i], sel && sel->tags[i]); |
123 } |
137 } |
124 x = dc.x + dc.w; |
138 x = dc.x + dc.w; |
125 dc.w = textw(stext); |
139 dc.w = textw(stext); |
126 dc.x = bx + bw - dc.w; |
140 dc.x = bx + bw - dc.w; |
127 drawtext(stext, !istile); |
141 if(dc.x < x) { |
128 |
142 dc.x = x; |
129 if(sel) { |
143 dc.w = bw - x; |
130 for(i = 0; i < ntags; i++) |
144 } |
131 if(sel->tags[i]) { |
145 drawtext(stext, !istile, False); |
132 dc.w = textw(tags[i]); |
146 |
133 dc.x -= dc.w; |
147 if(sel && ((dc.w = dc.x - x) > bh)) { |
134 if(dc.x < x) |
148 dc.x = x; |
135 break; |
149 drawtext(sel->name, istile, False); |
136 drawtext(tags[i], istile); |
|
137 } |
|
138 if(dc.x > x && (dc.x - x) > bh) { |
|
139 dc.w = dc.x - x; |
|
140 dc.x = x; |
|
141 drawtext(sel->name, istile); |
|
142 } |
|
143 } |
150 } |
144 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
151 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
145 XSync(dpy, False); |
152 XSync(dpy, False); |
146 } |
153 } |
147 |
154 |
151 int i; |
158 int i; |
152 Bool istile = arrange == dotile; |
159 Bool istile = arrange == dotile; |
153 |
160 |
154 if(c == sel && issel) { |
161 if(c == sel && issel) { |
155 drawstatus(); |
162 drawstatus(); |
156 XUnmapWindow(dpy, c->title); |
163 XUnmapWindow(dpy, c->twin); |
157 XSetWindowBorder(dpy, c->win, dc.fg); |
164 XSetWindowBorder(dpy, c->win, dc.fg); |
158 return; |
165 return; |
159 } |
166 } |
160 |
167 |
161 XSetWindowBorder(dpy, c->win, dc.bg); |
168 XSetWindowBorder(dpy, c->win, dc.bg); |
162 XMapWindow(dpy, c->title); |
169 XMapWindow(dpy, c->twin); |
163 |
170 dc.x = dc.y = 0; |
164 dc.y = dc.w = 0; |
171 dc.w = c->tw; |
165 dc.x = c->tw; |
172 drawtext(c->name, !istile, False); |
166 for(i = 0; i < ntags; i++) |
173 XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0); |
167 if(c->tags[i]) { |
|
168 dc.w = textw(tags[i]); |
|
169 dc.x -= dc.w; |
|
170 drawtext(tags[i], !istile); |
|
171 } |
|
172 dc.w = dc.x; |
|
173 dc.x = 0; |
|
174 drawtext(c->name, !istile); |
|
175 XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0); |
|
176 XSync(dpy, False); |
174 XSync(dpy, False); |
177 } |
175 } |
178 |
176 |
179 unsigned long |
177 unsigned long |
180 getcolor(const char *colstr) |
178 getcolor(const char *colstr) |