Mercurial > aewl
comparison draw.c @ 237:7f8f7f14e9cd
readded border color, this sucks least
author | Anselm R.Garbe <arg@10ksloc.org> |
---|---|
date | Thu, 10 Aug 2006 11:12:15 +0200 |
parents | ebecb98a1c29 |
children | e5390f8e06b9 |
comparison
equal
deleted
inserted
replaced
236:ebecb98a1c29 | 237:7f8f7f14e9cd |
---|---|
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 |