27 points[4].x = 0; |
27 points[4].x = 0; |
28 points[4].y = -(dc.h - 1); |
28 points[4].y = -(dc.h - 1); |
29 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
29 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
30 } |
30 } |
31 |
31 |
|
32 static unsigned int |
|
33 textnw(char *text, unsigned int len) |
|
34 { |
|
35 XRectangle r; |
|
36 if(dc.font.set) { |
|
37 XmbTextExtents(dc.font.set, text, len, NULL, &r); |
|
38 return r.width; |
|
39 } |
|
40 return XTextWidth(dc.font.xfont, text, len); |
|
41 } |
|
42 |
|
43 static void |
|
44 drawtext(const char *text, Bool invert, Bool border) |
|
45 { |
|
46 int x, y, w, h; |
|
47 unsigned int len; |
|
48 static char buf[256]; |
|
49 XGCValues gcv; |
|
50 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
51 |
|
52 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
|
53 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
54 |
|
55 w = 0; |
|
56 if(border) |
|
57 drawborder(); |
|
58 |
|
59 if(!text) |
|
60 return; |
|
61 |
|
62 len = strlen(text); |
|
63 if(len >= sizeof(buf)) |
|
64 len = sizeof(buf) - 1; |
|
65 memcpy(buf, text, len); |
|
66 buf[len] = 0; |
|
67 |
|
68 h = dc.font.ascent + dc.font.descent; |
|
69 y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; |
|
70 x = dc.x + (h / 2); |
|
71 |
|
72 /* shorten text if necessary */ |
|
73 while(len && (w = textnw(buf, len)) > dc.w - h) |
|
74 buf[--len] = 0; |
|
75 |
|
76 if(w > dc.w) |
|
77 return; /* too long */ |
|
78 |
|
79 gcv.foreground = invert ? dc.bg : dc.fg; |
|
80 gcv.background = invert ? dc.fg : dc.bg; |
|
81 if(dc.font.set) { |
|
82 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
|
83 XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, |
|
84 x, y, buf, len); |
|
85 } |
|
86 else { |
|
87 gcv.font = dc.font.xfont->fid; |
|
88 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
|
89 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
|
90 } |
|
91 } |
|
92 |
32 /* extern functions */ |
93 /* extern functions */ |
33 |
94 |
34 void |
95 void |
35 drawall() |
96 drawall() |
36 { |
97 { |
69 dc.x = bx + bw - dc.w; |
130 dc.x = bx + bw - dc.w; |
70 drawtext(stext, !istile, False); |
131 drawtext(stext, !istile, False); |
71 |
132 |
72 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
133 XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
73 XFlush(dpy); |
134 XFlush(dpy); |
74 } |
|
75 |
|
76 void |
|
77 drawtext(const char *text, Bool invert, Bool border) |
|
78 { |
|
79 int x, y, w, h; |
|
80 unsigned int len; |
|
81 static char buf[256]; |
|
82 XGCValues gcv; |
|
83 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
84 |
|
85 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
|
86 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
87 |
|
88 w = 0; |
|
89 if(border) |
|
90 drawborder(); |
|
91 |
|
92 if(!text) |
|
93 return; |
|
94 |
|
95 len = strlen(text); |
|
96 if(len >= sizeof(buf)) |
|
97 len = sizeof(buf) - 1; |
|
98 memcpy(buf, text, len); |
|
99 buf[len] = 0; |
|
100 |
|
101 h = dc.font.ascent + dc.font.descent; |
|
102 y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; |
|
103 x = dc.x + (h / 2); |
|
104 |
|
105 /* shorten text if necessary */ |
|
106 while(len && (w = textnw(buf, len)) > dc.w - h) |
|
107 buf[--len] = 0; |
|
108 |
|
109 if(w > dc.w) |
|
110 return; /* too long */ |
|
111 |
|
112 gcv.foreground = invert ? dc.bg : dc.fg; |
|
113 gcv.background = invert ? dc.fg : dc.bg; |
|
114 if(dc.font.set) { |
|
115 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
|
116 XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, |
|
117 x, y, buf, len); |
|
118 } |
|
119 else { |
|
120 gcv.font = dc.font.xfont->fid; |
|
121 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
|
122 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
|
123 } |
|
124 } |
135 } |
125 |
136 |
126 void |
137 void |
127 drawtitle(Client *c) |
138 drawtitle(Client *c) |
128 { |
139 { |
217 } |
228 } |
218 dc.font.height = dc.font.ascent + dc.font.descent; |
229 dc.font.height = dc.font.ascent + dc.font.descent; |
219 } |
230 } |
220 |
231 |
221 unsigned int |
232 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) |
233 textw(char *text) |
234 { |
234 { |
235 return textnw(text, strlen(text)) + dc.font.height; |
235 return textnw(text, strlen(text)) + dc.font.height; |
236 } |
236 } |