瀏覽代碼

applied Neale Pickett's xprop status reading patch, updated README and dwm.1 accordingly

a@null 17 年之前
父節點
當前提交
0b5dcf229f
共有 4 個文件被更改,包括 31 次插入73 次删除
  1. 1 1
      README
  2. 0 1
      config.def.h
  3. 7 7
      dwm.1
  4. 23 64
      dwm.c

+ 1 - 1
README

@@ -40,7 +40,7 @@ like this in your .xinitrc:
 
 
     while true
     while true
     do
     do
-        echo `date` `uptime | sed 's/.*,//'`
+        xsetroot -name "`date` `uptime | sed 's/.*,//'`"
         sleep 1
         sleep 1
     done | dwm
     done | dwm
 
 

+ 0 - 1
config.def.h

@@ -12,7 +12,6 @@ static unsigned int borderpx        = 1;        /* border pixel of windows */
 static unsigned int snap            = 32;       /* snap pixel */
 static unsigned int snap            = 32;       /* snap pixel */
 static Bool showbar                 = True;     /* False means no bar */
 static Bool showbar                 = True;     /* False means no bar */
 static Bool topbar                  = True;     /* False means bottom bar */
 static Bool topbar                  = True;     /* False means bottom bar */
-static Bool readin                  = True;     /* False means do not read stdin */
 static Bool usegrab                 = False;    /* True means grabbing the X server
 static Bool usegrab                 = False;    /* True means grabbing the X server
                                                    during mouse-based resizals */
                                                    during mouse-based resizals */
 
 

+ 7 - 7
dwm.1

@@ -20,13 +20,13 @@ Windows are grouped by tags. Each window can be tagged with one or multiple
 tags. Selecting certain tags displays all windows with these tags.
 tags. Selecting certain tags displays all windows with these tags.
 .P
 .P
 dwm contains a small status bar which displays all available tags, the layout,
 dwm contains a small status bar which displays all available tags, the layout,
-the title of the focused window, and the text read from standard input. A
-floating window is indicated with an empty square and a maximised
-floating window is indicated with a filled square before the windows
-title.  The selected tags are indicated with a different color. The tags of
-the focused window are indicated with a filled square in the top left
-corner.  The tags which are applied to one or more windows are indicated
-with an empty square in the top left corner.
+the title of the focused window, and the text read from the root window name
+property. A floating window is indicated with an empty square and a maximised
+floating window is indicated with a filled square before the windows title.
+The selected tags are indicated with a different color. The tags of the focused
+window are indicated with a filled square in the top left corner.  The tags
+which are applied to one or more windows are indicated with an empty square in
+the top left corner.
 .P
 .P
 dwm draws a small border around windows to indicate the focus state.
 dwm draws a small border around windows to indicate the focus state.
 .SH OPTIONS
 .SH OPTIONS

+ 23 - 64
dwm.c

@@ -6,12 +6,9 @@
  * events about window (dis-)appearance.  Only one X connection at a time is
  * events about window (dis-)appearance.  Only one X connection at a time is
  * allowed to select for this event mask.
  * allowed to select for this event mask.
  *
  *
- * Calls to fetch an X event from the event queue are blocking.  Due reading
- * status text from standard input, a select()-driven main loop has been
- * implemented which selects for reads on the X connection and STDIN_FILENO to
- * handle all data smoothly. The event handlers of dwm are organized in an
- * array which is accessed whenever a new event has been fetched. This allows
- * event dispatching in O(1) time.
+ * The event handlers of dwm are organized in an array which is accessed
+ * whenever a new event has been fetched. This allows event dispatching
+ * in O(1) time.
  *
  *
  * Each child of the root window is called a client, except windows which have
  * Each child of the root window is called a client, except windows which have
  * set the override_redirect flag.  Clients are organized in a global
  * set the override_redirect flag.  Clients are organized in a global
@@ -30,7 +27,6 @@
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 #include <unistd.h>
 #include <unistd.h>
-#include <sys/select.h>
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/wait.h>
 #include <X11/cursorfont.h>
 #include <X11/cursorfont.h>
@@ -196,6 +192,7 @@ static void updatebar(void);
 static void updategeom(void);
 static void updategeom(void);
 static void updatenumlockmask(void);
 static void updatenumlockmask(void);
 static void updatesizehints(Client *c);
 static void updatesizehints(Client *c);
+static void updatestatus(void);
 static void updatetitle(Client *c);
 static void updatetitle(Client *c);
 static void updatewmhints(Client *c);
 static void updatewmhints(Client *c);
 static void view(const Arg *arg);
 static void view(const Arg *arg);
@@ -998,9 +995,11 @@ propertynotify(XEvent *e) {
 	Window trans;
 	Window trans;
 	XPropertyEvent *ev = &e->xproperty;
 	XPropertyEvent *ev = &e->xproperty;
 
 
-	if(ev->state == PropertyDelete)
+	if((ev->window == root) && (ev->atom = XA_WM_NAME))
+		updatestatus();
+	else if(ev->state == PropertyDelete)
 		return; /* ignore */
 		return; /* ignore */
-	if((c = getclient(ev->window))) {
+	else if((c = getclient(ev->window))) {
 		switch (ev->atom) {
 		switch (ev->atom) {
 		default: break;
 		default: break;
 		case XA_WM_TRANSIENT_FOR:
 		case XA_WM_TRANSIENT_FOR:
@@ -1026,7 +1025,7 @@ propertynotify(XEvent *e) {
 
 
 void
 void
 quit(const Arg *arg) {
 quit(const Arg *arg) {
-	readin = running = False;
+	running = False;
 }
 }
 
 
 void
 void
@@ -1180,60 +1179,13 @@ restack(void) {
 
 
 void
 void
 run(void) {
 run(void) {
-	char *p;
-	char sbuf[sizeof stext];
-	fd_set rd;
-	int r, xfd;
-	unsigned int len, offset;
 	XEvent ev;
 	XEvent ev;
 
 
-	/* main event loop, also reads status text from stdin */
+	/* main event loop */
 	XSync(dpy, False);
 	XSync(dpy, False);
-	xfd = ConnectionNumber(dpy);
-	offset = 0;
-	len = sizeof stext - 1;
-	sbuf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
-	while(running) {
-		FD_ZERO(&rd);
-		if(readin)
-			FD_SET(STDIN_FILENO, &rd);
-		FD_SET(xfd, &rd);
-		if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
-			if(errno == EINTR)
-				continue;
-			die("select failed\n");
-		}
-		if(FD_ISSET(STDIN_FILENO, &rd)) {
-			switch((r = read(STDIN_FILENO, sbuf + offset, len - offset))) {
-			case -1:
-				strncpy(stext, strerror(errno), len);
-				readin = False;
-				break;
-			case 0:
-				strncpy(stext, "EOF", 4);
-				readin = False;
-				break;
-			default:
-				for(p = sbuf + offset; r > 0; p++, r--, offset++)
-					if(*p == '\n' || *p == '\0') {
-						*p = '\0';
-						strncpy(stext, sbuf, len);
-						p += r - 1; /* p is sbuf + offset + r - 1 */
-						for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
-						offset = r;
-						if(r)
-							memmove(sbuf, p - r + 1, r);
-						break;
-					}
-				break;
-			}
-			drawbar();
-		}
-		while(XPending(dpy)) {
-			XNextEvent(dpy, &ev);
-			if(handler[ev.type])
-				(handler[ev.type])(&ev); /* call handler */
-		}
+	while(running && !XNextEvent(dpy, &ev)) {
+		if(handler[ev.type])
+			(handler[ev.type])(&ev); /* call handler */
 	}
 	}
 }
 }
 
 
@@ -1356,8 +1308,7 @@ setup(void) {
 			CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
 			CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
 	XDefineCursor(dpy, barwin, cursor[CurNormal]);
 	XDefineCursor(dpy, barwin, cursor[CurNormal]);
 	XMapRaised(dpy, barwin);
 	XMapRaised(dpy, barwin);
-	strcpy(stext, "dwm-"VERSION);
-	drawbar();
+	updatestatus();
 
 
 	/* EWMH support per view */
 	/* EWMH support per view */
 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
@@ -1365,7 +1316,8 @@ setup(void) {
 
 
 	/* select for events */
 	/* select for events */
 	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
 	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
-			|EnterWindowMask|LeaveWindowMask|StructureNotifyMask;
+			|EnterWindowMask|LeaveWindowMask|StructureNotifyMask
+			|PropertyChangeMask;
 	XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
 	XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
 	XSelectInput(dpy, root, wa.event_mask);
 	XSelectInput(dpy, root, wa.event_mask);
 
 
@@ -1646,6 +1598,13 @@ updatetitle(Client *c) {
 		gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name);
 		gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name);
 }
 }
 
 
+void
+updatestatus() {
+	if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
+		strcpy(stext, "dwm-"VERSION);
+	drawbar();
+}
+
 void
 void
 updatewmhints(Client *c) {
 updatewmhints(Client *c) {
 	XWMHints *wmh;
 	XWMHints *wmh;