draw.c
changeset 237 7f8f7f14e9cd
parent 236 ebecb98a1c29
child 239 e5390f8e06b9
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