comparison draw.c @ 3:e969f3575b7a

several new changes, made gridmenu working
author Anselm R. Garbe <garbeam@wmii.de>
date Mon, 10 Jul 2006 19:46:24 +0200
parents a79188fe4a40
children e5018cae273f
comparison
equal deleted inserted replaced
2:a79188fe4a40 3:e969f3575b7a
12 static void 12 static void
13 drawborder(Display *dpy, Brush *b) 13 drawborder(Display *dpy, Brush *b)
14 { 14 {
15 XPoint points[5]; 15 XPoint points[5];
16 XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter); 16 XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter);
17 XSetForeground(dpy, b->gc, b->color.border); 17 XSetForeground(dpy, b->gc, b->border);
18 points[0].x = b->rect.x; 18 points[0].x = b->rect.x;
19 points[0].y = b->rect.y; 19 points[0].y = b->rect.y;
20 points[1].x = b->rect.width - 1; 20 points[1].x = b->rect.width - 1;
21 points[1].y = 0; 21 points[1].y = 0;
22 points[2].x = 0; 22 points[2].x = 0;
27 points[4].y = -(b->rect.height - 1); 27 points[4].y = -(b->rect.height - 1);
28 XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious); 28 XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious);
29 } 29 }
30 30
31 void 31 void
32 draw(Display *dpy, Brush *b) 32 draw(Display *dpy, Brush *b, Bool border, const char *text)
33 { 33 {
34 unsigned int x, y, w, h, len; 34 unsigned int x, y, w, h, len;
35 static char buf[256]; 35 static char buf[256];
36 XGCValues gcv; 36 XGCValues gcv;
37 37
38 XSetForeground(dpy, b->gc, b->color.bg); 38 XSetForeground(dpy, b->gc, b->bg);
39 XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1); 39 XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1);
40 40
41 if(b->border) 41 if(border)
42 drawborder(dpy, b); 42 drawborder(dpy, b);
43 43
44 if(!b->text) 44 if(!text)
45 return; 45 return;
46 46
47 len = strlen(b->text); 47 len = strlen(text);
48 if(len >= sizeof(buf)) 48 if(len >= sizeof(buf))
49 len = sizeof(buf) - 1; 49 len = sizeof(buf) - 1;
50 memcpy(buf, b->text, len); 50 memcpy(buf, text, len);
51 buf[len] = 0; 51 buf[len] = 0;
52 52
53 h = b->font->ascent + b->font->descent; 53 h = b->font.ascent + b->font.descent;
54 y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font->ascent; 54 y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font.ascent;
55 x = b->rect.x + (h / 2); 55 x = b->rect.x + (h / 2);
56 56
57 /* shorten text if necessary */ 57 /* shorten text if necessary */
58 while(len && (w = textwidth_l(b->font, buf, len)) > b->rect.width - h) 58 while(len && (w = textwidth_l(&b->font, buf, len)) > b->rect.width - h)
59 buf[--len] = 0; 59 buf[--len] = 0;
60 60
61 if(w > b->rect.width) 61 if(w > b->rect.width)
62 return; /* too long */ 62 return; /* too long */
63 63
64 gcv.foreground = b->color.fg; 64 gcv.foreground = b->fg;
65 gcv.background = b->color.bg; 65 gcv.background = b->bg;
66 if(b->font->set) { 66 if(b->font.set) {
67 XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv); 67 XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv);
68 XmbDrawImageString(dpy, b->drawable, b->font->set, b->gc, 68 XmbDrawImageString(dpy, b->drawable, b->font.set, b->gc,
69 x, y, buf, len); 69 x, y, buf, len);
70 } 70 }
71 else { 71 else {
72 gcv.font = b->font->xfont->fid; 72 gcv.font = b->font.xfont->fid;
73 XChangeGC(dpy, b->gc, GCForeground | GCBackground | GCFont, &gcv); 73 XChangeGC(dpy, b->gc, GCForeground | GCBackground | GCFont, &gcv);
74 XDrawImageString(dpy, b->drawable, b->gc, x, y, buf, len); 74 XDrawImageString(dpy, b->drawable, b->gc, x, y, buf, len);
75 } 75 }
76 } 76 }
77 77
78 static unsigned long 78 static unsigned long
79 xloadcolor(Display *dpy, Colormap cmap, const char *colstr) 79 xloadcolors(Display *dpy, Colormap cmap, const char *colstr)
80 { 80 {
81 XColor color; 81 XColor color;
82 XAllocNamedColor(dpy, cmap, colstr, &color, &color); 82 XAllocNamedColor(dpy, cmap, colstr, &color, &color);
83 return color.pixel; 83 return color.pixel;
84 } 84 }
85 85
86 void 86 void
87 loadcolor(Display *dpy, int screen, Color *c, 87 loadcolors(Display *dpy, int screen, Brush *b,
88 const char *bg, const char *fg, const char *border) 88 const char *bg, const char *fg, const char *border)
89 { 89 {
90 Colormap cmap = DefaultColormap(dpy, screen); 90 Colormap cmap = DefaultColormap(dpy, screen);
91 c->bg = xloadcolor(dpy, cmap, bg); 91 b->bg = xloadcolors(dpy, cmap, bg);
92 c->fg = xloadcolor(dpy, cmap, fg); 92 b->fg = xloadcolors(dpy, cmap, fg);
93 c->border = xloadcolor(dpy, cmap, border); 93 b->border = xloadcolors(dpy, cmap, border);
94 } 94 }
95 95
96 unsigned int 96 unsigned int
97 textwidth_l(Fnt *font, char *text, unsigned int len) 97 textwidth_l(Fnt *font, char *text, unsigned int len)
98 { 98 {
158 if (!font->xfont) 158 if (!font->xfont)
159 error("error, cannot load 'fixed' font\n"); 159 error("error, cannot load 'fixed' font\n");
160 font->ascent = font->xfont->ascent; 160 font->ascent = font->xfont->ascent;
161 font->descent = font->xfont->descent; 161 font->descent = font->xfont->descent;
162 } 162 }
163 font->height = font->ascent + font->descent;
163 } 164 }