Xinqi Bao's Git

Fix grouping in dmenu_path.
[dmenu.git] / draw.c
1 /* © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
2 * © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
3 * See LICENSE file for license details. */
4 #include "dmenu.h"
5 #include <string.h>
6
7 /* extern */
8
9 void
10 drawtext(const char *text, unsigned long col[ColLast]) {
11 int x, y, w, h;
12 static char buf[256];
13 unsigned int len, olen;
14 XRectangle r = { dc.x, dc.y, dc.w, dc.h };
15
16 XSetForeground(dpy, dc.gc, col[ColBG]);
17 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
18 if(!text)
19 return;
20 w = 0;
21 olen = len = strlen(text);
22 if(len >= sizeof buf)
23 len = sizeof buf - 1;
24 memcpy(buf, text, len);
25 buf[len] = 0;
26 h = dc.font.ascent + dc.font.descent;
27 y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
28 x = dc.x + (h / 2);
29 /* shorten text if necessary */
30 while(len && (w = textnw(buf, len)) > dc.w - h)
31 buf[--len] = 0;
32 if(len < olen) {
33 if(len > 1)
34 buf[len - 1] = '.';
35 if(len > 2)
36 buf[len - 2] = '.';
37 if(len > 3)
38 buf[len - 3] = '.';
39 }
40 if(w > dc.w)
41 return; /* too long */
42 XSetForeground(dpy, dc.gc, col[ColFG]);
43 if(dc.font.set)
44 XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
45 else
46 XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
47 }
48
49 unsigned int
50 textw(const char *text) {
51 return textnw(text, strlen(text)) + dc.font.height;
52 }
53
54 unsigned int
55 textnw(const char *text, unsigned int len) {
56 XRectangle r;
57
58 if(dc.font.set) {
59 XmbTextExtents(dc.font.set, text, len, NULL, &r);
60 return r.width;
61 }
62 return XTextWidth(dc.font.xfont, text, len);
63 }