draw.c
changeset 77 38c8f7f7d401
parent 76 4bd49f404f10
child 79 aabebd6e61f3
equal deleted inserted replaced
76:4bd49f404f10 77:38c8f7f7d401
    27 	points[4].x = 0;
    27 	points[4].x = 0;
    28 	points[4].y = -(dc.h - 1);
    28 	points[4].y = -(dc.h - 1);
    29 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    29 	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
    30 }
    30 }
    31 
    31 
       
    32 static unsigned int
       
    33 textnw(char *text, unsigned int len)
       
    34 {
       
    35 	XRectangle r;
       
    36 	if(dc.font.set) {
       
    37 		XmbTextExtents(dc.font.set, text, len, NULL, &r);
       
    38 		return r.width;
       
    39 	}
       
    40 	return XTextWidth(dc.font.xfont, text, len);
       
    41 }
       
    42 
       
    43 static void
       
    44 drawtext(const char *text, Bool invert, Bool border)
       
    45 {
       
    46 	int x, y, w, h;
       
    47 	unsigned int len;
       
    48 	static char buf[256];
       
    49 	XGCValues gcv;
       
    50 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       
    51 
       
    52 	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
       
    53 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
    54 
       
    55 	w = 0;
       
    56 	if(border)
       
    57 		drawborder();
       
    58 
       
    59 	if(!text)
       
    60 		return;
       
    61 
       
    62 	len = strlen(text);
       
    63 	if(len >= sizeof(buf))
       
    64 		len = sizeof(buf) - 1;
       
    65 	memcpy(buf, text, len);
       
    66 	buf[len] = 0;
       
    67 
       
    68 	h = dc.font.ascent + dc.font.descent;
       
    69 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
       
    70 	x = dc.x + (h / 2);
       
    71 
       
    72 	/* shorten text if necessary */
       
    73 	while(len && (w = textnw(buf, len)) > dc.w - h)
       
    74 		buf[--len] = 0;
       
    75 
       
    76 	if(w > dc.w)
       
    77 		return; /* too long */
       
    78 
       
    79 	gcv.foreground = invert ? dc.bg : dc.fg;
       
    80 	gcv.background = invert ? dc.fg : dc.bg;
       
    81 	if(dc.font.set) {
       
    82 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
       
    83 		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
       
    84 				x, y, buf, len);
       
    85 	}
       
    86 	else {
       
    87 		gcv.font = dc.font.xfont->fid;
       
    88 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
       
    89 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       
    90 	}
       
    91 }
       
    92 
    32 /* extern functions */
    93 /* extern functions */
    33 
    94 
    34 void
    95 void
    35 drawall()
    96 drawall()
    36 {
    97 {
    69 	dc.x = bx + bw - dc.w;
   130 	dc.x = bx + bw - dc.w;
    70 	drawtext(stext, !istile, False);
   131 	drawtext(stext, !istile, False);
    71 
   132 
    72 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
   133 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
    73 	XFlush(dpy);
   134 	XFlush(dpy);
    74 }
       
    75 
       
    76 void
       
    77 drawtext(const char *text, Bool invert, Bool border)
       
    78 {
       
    79 	int x, y, w, h;
       
    80 	unsigned int len;
       
    81 	static char buf[256];
       
    82 	XGCValues gcv;
       
    83 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       
    84 
       
    85 	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
       
    86 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
    87 
       
    88 	w = 0;
       
    89 	if(border)
       
    90 		drawborder();
       
    91 
       
    92 	if(!text)
       
    93 		return;
       
    94 
       
    95 	len = strlen(text);
       
    96 	if(len >= sizeof(buf))
       
    97 		len = sizeof(buf) - 1;
       
    98 	memcpy(buf, text, len);
       
    99 	buf[len] = 0;
       
   100 
       
   101 	h = dc.font.ascent + dc.font.descent;
       
   102 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
       
   103 	x = dc.x + (h / 2);
       
   104 
       
   105 	/* shorten text if necessary */
       
   106 	while(len && (w = textnw(buf, len)) > dc.w - h)
       
   107 		buf[--len] = 0;
       
   108 
       
   109 	if(w > dc.w)
       
   110 		return; /* too long */
       
   111 
       
   112 	gcv.foreground = invert ? dc.bg : dc.fg;
       
   113 	gcv.background = invert ? dc.fg : dc.bg;
       
   114 	if(dc.font.set) {
       
   115 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
       
   116 		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
       
   117 				x, y, buf, len);
       
   118 	}
       
   119 	else {
       
   120 		gcv.font = dc.font.xfont->fid;
       
   121 		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
       
   122 		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       
   123 	}
       
   124 }
   135 }
   125 
   136 
   126 void
   137 void
   127 drawtitle(Client *c)
   138 drawtitle(Client *c)
   128 {
   139 {
   217 	}
   228 	}
   218 	dc.font.height = dc.font.ascent + dc.font.descent;
   229 	dc.font.height = dc.font.ascent + dc.font.descent;
   219 }
   230 }
   220 
   231 
   221 unsigned int
   232 unsigned int
   222 textnw(char *text, unsigned int len)
       
   223 {
       
   224 	XRectangle r;
       
   225 	if(dc.font.set) {
       
   226 		XmbTextExtents(dc.font.set, text, len, NULL, &r);
       
   227 		return r.width;
       
   228 	}
       
   229 	return XTextWidth(dc.font.xfont, text, len);
       
   230 }
       
   231 
       
   232 unsigned int
       
   233 textw(char *text)
   233 textw(char *text)
   234 {
   234 {
   235 	return textnw(text, strlen(text)) + dc.font.height;
   235 	return textnw(text, strlen(text)) + dc.font.height;
   236 }
   236 }