X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/0cf3ba0eab1e3b05515907b29fbb739321a7cbed..0fe52c63ea9382a940afa7573993218ead14c2cf:/main.c

diff --git a/main.c b/main.c
index 86d72fa..16ebbae 100644
--- a/main.c
+++ b/main.c
@@ -4,7 +4,6 @@
  */
 
 #include "dwm.h"
-
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -15,7 +14,6 @@
 #include <X11/Xatom.h>
 #include <X11/Xproto.h>
 
-
 /* static */
 
 static int (*xerrorxlib)(Display *, XErrorEvent *);
@@ -85,8 +83,9 @@ xerrorstart(Display *dsply, XErrorEvent *ee)
 /* extern */
 
 char stext[1024];
-int tsel = DEFTAG;
+Bool *seltag;
 int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
+unsigned int ntags;
 Atom wmatom[WMLast], netatom[NetLast];
 Bool running = True;
 Bool issel = True;
@@ -103,9 +102,10 @@ getproto(Window w)
 	int protos = 0;
 	int i;
 	long res;
-	unsigned char *protocols;
+	Atom *protocols;
 
-	res = win_property(w, wmatom[WMProtocols], XA_ATOM, 20L, &protocols);
+	res = win_property(w, wmatom[WMProtocols], XA_ATOM, 20L,
+			((unsigned char **)&protocols));
 	if(res <= 0) {
 		return protos;
 	}
@@ -162,9 +162,10 @@ xerror(Display *dpy, XErrorEvent *ee)
 int
 main(int argc, char *argv[])
 {
-	int i;
+	int i, xfd;
 	unsigned int mask;
 	fd_set rd;
+	Bool readin = True;
 	Window w;
 	XEvent ev;
 	XSetWindowAttributes wa;
@@ -178,15 +179,15 @@ main(int argc, char *argv[])
 
 	dpy = XOpenDisplay(0);
 	if(!dpy)
-		eprint("dwm: cannot connect X server\n");
+		eprint("dwm: cannot open display\n");
 
+	xfd = ConnectionNumber(dpy);
 	screen = DefaultScreen(dpy);
 	root = RootWindow(dpy, screen);
 
-	/* check if another WM is already running */
 	otherwm = False;
 	XSetErrorHandler(xerrorstart);
-	/* this causes an error if some other WM is running */
+	/* this causes an error if some other window manager is running */
 	XSelectInput(dpy, root, SubstructureRedirectMask);
 	XSync(dpy, False);
 
@@ -210,6 +211,11 @@ main(int argc, char *argv[])
 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
 
 	grabkeys();
+	initrregs();
+
+	for(ntags = 0; tags[ntags]; ntags++);
+	seltag = emallocz(sizeof(Bool) * ntags);
+	seltag[DEFTAG] = True;
 
 	/* style */
 	dc.bg = getcolor(BGCOLOR);
@@ -237,6 +243,8 @@ main(int argc, char *argv[])
 
 	dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
 	dc.gc = XCreateGC(dpy, root, 0, 0);
+
+	strcpy(stext, "dwm-"VERSION);
 	drawstatus();
 
 	issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
@@ -245,33 +253,35 @@ main(int argc, char *argv[])
 	wa.cursor = cursor[CurNormal];
 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
 
-	strcpy(stext, "dwm-"VERSION);
 	scan();
 
-	/* main event loop, reads status text from stdin as well */
+	/* main event loop, also reads status text from stdin */
+	XSync(dpy, False);
 	while(running) {
 		FD_ZERO(&rd);
-		FD_SET(STDIN_FILENO, &rd);
-		FD_SET(ConnectionNumber(dpy), &rd);
+		if(readin)
+			FD_SET(STDIN_FILENO, &rd);
+		FD_SET(xfd, &rd);
 
-		i = select(ConnectionNumber(dpy) + 1, &rd, 0, 0, 0);
+		i = select(xfd + 1, &rd, NULL, NULL, NULL);
 		if(i == -1 && errno == EINTR)
 			continue;
 		if(i < 0)
 			eprint("select failed\n");
 		else if(i > 0) {
-			if(FD_ISSET(ConnectionNumber(dpy), &rd)) {
+			if(FD_ISSET(xfd, &rd)) {
 				while(XPending(dpy)) {
 					XNextEvent(dpy, &ev);
 					if(handler[ev.type])
 						(handler[ev.type])(&ev); /* call handler */
 				}
 			}
-			if(FD_ISSET(STDIN_FILENO, &rd)) {
-				if(!fgets(stext, sizeof(stext), stdin))
-					break;
-				else 
+			if(readin && FD_ISSET(STDIN_FILENO, &rd)) {
+				readin = NULL != fgets(stext, sizeof(stext), stdin);
+				if(readin)
 					stext[strlen(stext) - 1] = 0;
+				else 
+					strcpy(stext, "broken pipe");
 				drawstatus();
 			}
 		}