making copyright notice more compact
[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 }