X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/dba23062bad40afb1a90f60b6897cf9e1ca5035b..b1697e8d5fc9e7c81967cdbb5391b1587a23f310:/draw.c

diff --git a/draw.c b/draw.c
index 4c47c1a..de4bdb0 100644
--- a/draw.c
+++ b/draw.c
@@ -2,20 +2,102 @@
  * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
  * See LICENSE file for license details.
  */
+#include "dwm.h"
 
 #include <stdio.h>
 #include <string.h>
-
 #include <X11/Xlocale.h>
 
-#include "dwm.h"
+/* static */
+
+static void
+drawborder(void)
+{
+	XPoint points[5];
+	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+	XSetForeground(dpy, dc.gc, dc.border);
+	points[0].x = dc.x;
+	points[0].y = dc.y;
+	points[1].x = dc.w - 1;
+	points[1].y = 0;
+	points[2].x = 0;
+	points[2].y = dc.h - 1;
+	points[3].x = -(dc.w - 1);
+	points[3].y = 0;
+	points[4].x = 0;
+	points[4].y = -(dc.h - 1);
+	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
+}
+
+static unsigned int
+textnw(char *text, unsigned int len)
+{
+	XRectangle r;
+	if(dc.font.set) {
+		XmbTextExtents(dc.font.set, text, len, NULL, &r);
+		return r.width;
+	}
+	return XTextWidth(dc.font.xfont, text, len);
+}
+
+static void
+drawtext(const char *text, Bool invert, Bool border)
+{
+	int x, y, w, h;
+	unsigned int len;
+	static char buf[256];
+	XGCValues gcv;
+	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+
+	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
+	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
+
+	w = 0;
+	if(border)
+		drawborder();
+
+	if(!text)
+		return;
+
+	len = strlen(text);
+	if(len >= sizeof(buf))
+		len = sizeof(buf) - 1;
+	memcpy(buf, text, len);
+	buf[len] = 0;
+
+	h = dc.font.ascent + dc.font.descent;
+	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
+	x = dc.x + (h / 2);
+
+	/* shorten text if necessary */
+	while(len && (w = textnw(buf, len)) > dc.w - h)
+		buf[--len] = 0;
+
+	if(w > dc.w)
+		return; /* too long */
+
+	gcv.foreground = invert ? dc.bg : dc.fg;
+	gcv.background = invert ? dc.fg : dc.bg;
+	if(dc.font.set) {
+		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
+		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
+				x, y, buf, len);
+	}
+	else {
+		gcv.font = dc.font.xfont->fid;
+		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
+		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
+	}
+}
+
+/* extern */
 
 void
 drawall()
 {
 	Client *c;
 
-	for(c = clients; c; c = getnext(c->next))
+	for(c = clients; c; c = getnext(c->next, tsel))
 		drawtitle(c);
 	drawstatus();
 }
@@ -49,7 +131,7 @@ drawstatus()
 	drawtext(stext, !istile, False);
 
 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
-	XFlush(dpy);
+	XSync(dpy, False);
 }
 
 void
@@ -81,78 +163,8 @@ drawtitle(Client *c)
 	dc.x += dc.w;
 	dc.w = textw(c->name);
 	drawtext(c->name, !istile, True);
-	XCopyArea(dpy, dc.drawable, c->title, dc.gc,
-			0, 0, c->tw, c->th, 0, 0);
-	XFlush(dpy);
-}
-
-static void
-drawborder(void)
-{
-	XPoint points[5];
-	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
-	XSetForeground(dpy, dc.gc, dc.border);
-	points[0].x = dc.x;
-	points[0].y = dc.y;
-	points[1].x = dc.w - 1;
-	points[1].y = 0;
-	points[2].x = 0;
-	points[2].y = dc.h - 1;
-	points[3].x = -(dc.w - 1);
-	points[3].y = 0;
-	points[4].x = 0;
-	points[4].y = -(dc.h - 1);
-	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
-}
-
-void
-drawtext(const char *text, Bool invert, Bool border)
-{
-	int x, y, w, h;
-	unsigned int len;
-	static char buf[256];
-	XGCValues gcv;
-	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
-
-	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
-	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
-
-	w = 0;
-	if(border)
-		drawborder();
-
-	if(!text)
-		return;
-
-	len = strlen(text);
-	if(len >= sizeof(buf))
-		len = sizeof(buf) - 1;
-	memcpy(buf, text, len);
-	buf[len] = 0;
-
-	h = dc.font.ascent + dc.font.descent;
-	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
-	x = dc.x + (h / 2);
-
-	/* shorten text if necessary */
-	while(len && (w = textnw(buf, len)) > dc.w - h)
-		buf[--len] = 0;
-
-	if(w > dc.w)
-		return; /* too long */
-
-	gcv.foreground = invert ? dc.bg : dc.fg;
-	gcv.background = invert ? dc.fg : dc.bg;
-	if(dc.font.set) {
-		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
-		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
-				x, y, buf, len);
-	}
-	else {
-		gcv.font = dc.font.xfont->fid;
-		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
-		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
-	}
+	XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0);
+	XSync(dpy, False);
 }
 
 unsigned long
@@ -165,23 +177,6 @@ getcolor(const char *colstr)
 	return color.pixel;
 }
 
-unsigned int
-textnw(char *text, unsigned int len)
-{
-	XRectangle r;
-	if(dc.font.set) {
-		XmbTextExtents(dc.font.set, text, len, NULL, &r);
-		return r.width;
-	}
-	return XTextWidth(dc.font.xfont, text, len);
-}
-
-unsigned int
-textw(char *text)
-{
-	return textnw(text, strlen(text)) + dc.font.height;
-}
-
 void
 setfont(const char *fontstr)
 {
@@ -232,3 +227,9 @@ setfont(const char *fontstr)
 	}
 	dc.font.height = dc.font.ascent + dc.font.descent;
 }
+
+unsigned int
+textw(char *text)
+{
+	return textnw(text, strlen(text)) + dc.font.height;
+}