--- org/dwm.c 2008-12-06 19:53:57.000000000 +0100 +++ dwm-5.3/dwm.c 2008-12-06 21:50:55.000000000 +0100 @@ -23,6 +23,7 @@ * * To understand everything else, start reading main(). */ +#define _POSIX_C_SOURCE 2 #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -204,8 +206,10 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void getstatustext(void); /* variables */ +static char sscript[256]; static char stext[256]; static int screen; static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height */ @@ -1184,55 +1188,16 @@ void run(void) { - char *p; - char sbuf[sizeof stext]; - fd_set rd; - int r, xfd; - unsigned int len, offset; + int t,xfd; XEvent ev; /* main event loop, also reads status text from stdin */ XSync(dpy, False); xfd = ConnectionNumber(dpy); - offset = 0; - len = sizeof stext - 1; - sbuf[len] = stext[len] = '\0'; /* 0-terminator is never touched */ + getstatustext(); + t = time(0) + 1; 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(); - } + if ( time(0) >= t ) { t = time(0) + 1; getstatustext(); } while(XPending(dpy)) { XNextEvent(dpy, &ev); if(handler[ev.type]) @@ -1728,13 +1693,42 @@ arrange(); } +void getstatustext(void) +{ + if ( !sscript[0] ) { return; } + FILE *f = popen(sscript,"r"); + if ( !f ) { return; } + fgets(stext,255,f); + stext[255] = 0; + char *i = strstr(stext,"\n"); + if ( i ) { *i = 0; } + pclose(f); + drawbar(); +} + int main(int argc, char *argv[]) { - if(argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION", © 2006-2008 dwm engineers, see LICENSE for details\n"); - else if(argc != 1) - die("usage: dwm [-v]\n"); - + sscript[0] = 0; + int i = 1; + for( ; i < argc ; i++ ) + { + if ( !strcmp("-s",argv[i]) ) + { + i++; + strncpy(sscript,argv[i],254); + sscript[255] = 0; + printf("sscript = %s\n",sscript); + continue; + } + else if ( !strcmp("-v",argv[i]) ) + { + die("dwm-"VERSION", © 2006-2008 dwm engineers, see LICENSE for details\n"); + } + else + { + die("usage: dwm [-v] [-s status_script]\n"); + } + } if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n");