7 #include <string.h> |
7 #include <string.h> |
8 #include <X11/Xlocale.h> |
8 #include <X11/Xlocale.h> |
9 |
9 |
10 /* static */ |
10 /* static */ |
11 |
11 |
12 static unsigned int |
|
13 textnw(const char *text, unsigned int len) |
|
14 { |
|
15 XRectangle r; |
|
16 |
|
17 if(dc.font.set) { |
|
18 XmbTextExtents(dc.font.set, text, len, NULL, &r); |
|
19 return r.width; |
|
20 } |
|
21 return XTextWidth(dc.font.xfont, text, len); |
|
22 } |
|
23 |
|
24 static void |
12 static void |
25 drawtext(const char *text, Bool invert) |
13 drawborder(void) |
26 { |
14 { |
27 int x, y, w, h; |
|
28 static char buf[256]; |
|
29 unsigned int len; |
|
30 XGCValues gcv; |
|
31 XPoint points[5]; |
15 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 if(!text) |
|
37 return; |
|
38 |
|
39 w = 0; |
|
40 len = strlen(text); |
|
41 if(len >= sizeof(buf)) |
|
42 len = sizeof(buf) - 1; |
|
43 memcpy(buf, text, len); |
|
44 buf[len] = 0; |
|
45 |
|
46 h = dc.font.ascent + dc.font.descent; |
|
47 y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; |
|
48 x = dc.x + (h / 2); |
|
49 |
|
50 /* shorten text if necessary */ |
|
51 while(len && (w = textnw(buf, len)) > dc.w - h) |
|
52 buf[--len] = 0; |
|
53 |
|
54 if(w > dc.w) |
|
55 return; /* too long */ |
|
56 |
|
57 gcv.foreground = invert ? dc.bg : dc.fg; |
|
58 gcv.background = invert ? dc.fg : dc.bg; |
|
59 if(dc.font.set) { |
|
60 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
|
61 XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, |
|
62 x, y, buf, len); |
|
63 } |
|
64 else { |
|
65 gcv.font = dc.font.xfont->fid; |
|
66 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
|
67 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
|
68 } |
|
69 |
16 |
70 XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); |
17 XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); |
|
18 XSetForeground(dpy, dc.gc, dc.border); |
71 points[0].x = dc.x; |
19 points[0].x = dc.x; |
72 points[0].y = dc.y; |
20 points[0].y = dc.y; |
73 points[1].x = dc.w - 1; |
21 points[1].x = dc.w - 1; |
74 points[1].y = 0; |
22 points[1].y = 0; |
75 points[2].x = 0; |
23 points[2].x = 0; |
77 points[3].x = -(dc.w - 1); |
25 points[3].x = -(dc.w - 1); |
78 points[3].y = 0; |
26 points[3].y = 0; |
79 points[4].x = 0; |
27 points[4].x = 0; |
80 points[4].y = -(dc.h - 1); |
28 points[4].y = -(dc.h - 1); |
81 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
29 XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); |
|
30 } |
|
31 |
|
32 static unsigned int |
|
33 textnw(const char *text, unsigned int len) |
|
34 { |
|
35 XRectangle r; |
|
36 |
|
37 if(dc.font.set) { |
|
38 XmbTextExtents(dc.font.set, text, len, NULL, &r); |
|
39 return r.width; |
|
40 } |
|
41 return XTextWidth(dc.font.xfont, text, len); |
|
42 } |
|
43 |
|
44 static void |
|
45 drawtext(const char *text, Bool invert) |
|
46 { |
|
47 int x, y, w, h; |
|
48 static char buf[256]; |
|
49 unsigned int len; |
|
50 XGCValues gcv; |
|
51 XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
52 |
|
53 XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); |
|
54 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
55 drawborder(); |
|
56 |
|
57 if(!text) |
|
58 return; |
|
59 |
|
60 w = 0; |
|
61 len = strlen(text); |
|
62 if(len >= sizeof(buf)) |
|
63 len = sizeof(buf) - 1; |
|
64 memcpy(buf, text, len); |
|
65 buf[len] = 0; |
|
66 |
|
67 h = dc.font.ascent + dc.font.descent; |
|
68 y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; |
|
69 x = dc.x + (h / 2); |
|
70 |
|
71 /* shorten text if necessary */ |
|
72 while(len && (w = textnw(buf, len)) > dc.w - h) |
|
73 buf[--len] = 0; |
|
74 |
|
75 if(w > dc.w) |
|
76 return; /* too long */ |
|
77 |
|
78 gcv.foreground = invert ? dc.bg : dc.fg; |
|
79 gcv.background = invert ? dc.fg : dc.bg; |
|
80 if(dc.font.set) { |
|
81 XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); |
|
82 XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, |
|
83 x, y, buf, len); |
|
84 } |
|
85 else { |
|
86 gcv.font = dc.font.xfont->fid; |
|
87 XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); |
|
88 XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); |
|
89 } |
82 } |
90 } |
83 |
91 |
84 /* extern */ |
92 /* extern */ |
85 |
93 |
86 void |
94 void |