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 - dwm - dynamic window manager
 (HTM) git clone https://git.parazyd.org/dwm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 0e98090d653457488d74103dc44a1e2aba071895
 (DIR) parent af4667a85a11a1c001e60894a7ec7458c208bc0d
 (HTM) 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:
         M dwm.c                               |      34 ++++++++++++++++++++++++-------
       
       1 file changed, 27 insertions(+), 7 deletions(-)
       ---
 (DIR) 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)) {