Hi folks, I came across this curious behavior for the input status text... I used to run dwm using the following bash script:
while true; do date; sleep 1; done | dwm ... and things used to run fine :). I changed it to: while true; do cat $HOME/.dwm/status_* ; date; sleep 1; done | dwm The status_* files contain text without trailing \n's. Surprisingly , the contents of the statusbar didn't change (only date, no other status text) ... even though the while loop outputs something like <some text> Tue Oct 30 22:46:56 EDT 2007 <some text> Tue Oct 30 22:46:57 EDT 2007 <some text> Tue Oct 30 22:46:58 EDT 2007 ... My guess is that read() reads the status_* text and date in two successive calls causing the date to prevail till sleep 1 is done. I went through the source code and fixed the status input handling code to make sure it flushes the input status text only if in encounters a '\n'. The patch is given... unfortunately it is over my (recently posted) status text patch. I moved the trimming of trailing \n's to another function setstext() (introduced by my status text patch)... however, the relevant code can be moved to the function run(). What do you guys think... did I accidentally break something? _r diff -r a5b57a189379 dwm.c --- a/dwm.c Tue Oct 30 22:17:27 2007 -0400 +++ b/dwm.c Tue Oct 30 22:31:24 2007 -0400 @@ -1295,8 +1295,7 @@ restack(void) { void run(void) { - char *p; - int r, xfd; + int r, pos, xfd; fd_set rd; XEvent ev; @@ -1315,7 +1314,8 @@ run(void) { eprint("select failed\n"); } if(FD_ISSET(STDIN_FILENO, &rd)) { - switch(r = read(STDIN_FILENO, inputtext, sizeof inputtext - 1)) { + pos = inputtext[strlen(inputtext)-1] != '\n' ? strlen(inputtext) : 0; + switch(r = read(STDIN_FILENO, &(inputtext[pos]), sizeof inputtext - 1 - pos)) { case -1: strncpy(inputtext, strerror(errno), sizeof inputtext - 1); inputtext[sizeof inputtext - 1] = '\0'; @@ -1326,10 +1326,7 @@ run(void) { readin = False; break; default: - for(inputtext[r] = '\0', p = inputtext + strlen(inputtext) - 1; p >= inputtext && *p == '\n'; *p-- = '\0'); - for(; p >= inputtext && *p != '\n'; --p); - if(p > inputtext) - strncpy(inputtext, p + 1, sizeof inputtext); + inputtext[pos+r] = '\0' ; } drawbar(); } @@ -1426,6 +1423,9 @@ setstext(void) { stext[0] = '\0'; for(i=0; i<sizeof(statusbar)/sizeof(char*); i++) strncat(stext, statusbar[i], sizeof(stext) - strlen(stext)); + // Trim the trailing \n's + for(i=strlen(stext)-1; stext[i]=='\n'; i--) + stext[i] = '\0'; }