dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 0e98090d653457488d74103dc44a1e2aba071895
parent af4667a85a11a1c001e60894a7ec7458c208bc0d
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Sat,  3 Nov 2007 20:43:12 +0100

removed fgets usage, increment offset until a line is read, dwm will drop all lines read in one call, except the first!!! one (previously it preferred the last) - but the current approach is simplier and works better for general purpose in conjunction with the offset handling
Diffstat:
Mdwm.c | 34+++++++++++++++++++++++++++-------
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git 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)) {