about summary refs log tree commit diff stats
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/dwm.c b/dwm.c
index 266dd15..044177d 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1145,6 +1145,7 @@ quit(const char *arg) {
 	readin = running = False;
 }
 
+
 void
 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
 	XWindowChanges wc;
@@ -1280,15 +1281,19 @@ restack(void) {
 
 void
 run(void) {
+	char *p;
 	fd_set rd;
-	int xfd;
+	int r, xfd;
+	unsigned int len, offset;
 	XEvent ev;
 
 	/* main event loop, also reads status text from stdin */
 	XSync(dpy, False);
 	xfd = ConnectionNumber(dpy);
 	readin = True;
-	stext[sizeof stext - 1] = '\0'; /* 0-terminator is never touched */
+	offset = 0;
+	len = sizeof stext - 1;
+	stext[len] = '\0'; /* 0-terminator is never touched */
 	while(running) {
 		FD_ZERO(&rd);
 		if(readin)
@@ -1300,12 +1305,27 @@ run(void) {
 			eprint("select failed\n");
 		}
 		if(FD_ISSET(STDIN_FILENO, &rd)) {
-			if((readin = (stext == fgets(stext, sizeof stext - 1, stdin))))
-				stext[strlen(stext) - 1] = '\0'; /* remove tailing '\n' */
-			else if(feof(stdin))
+			switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
+			case -1:
+				strncpy(stext, strerror(errno), len);
+				readin = False;
+				break;
+			case 0:
 				strncpy(stext, "EOF", 4);
-			else /* error occured */
-				strncpy(stext, strerror(errno), sizeof stext - 1);
+				readin = False;
+				break;
+			default:
+				stext[offset + r] = '\0';
+				for(p = stext; *p && *p != '\n'; p++);
+				if(*p == '\n') {
+					*p = '\0';
+					offset = 0;
+				}
+				else if(offset + r < len - 1)
+					offset += r;
+				else
+					offset = 0;
+			}
 			drawbar();
 		}
 		while(XPending(dpy)) {