Mercurial > dwm-meillo
changeset 6:e0cefb3981c8
implemented pipe_spawn
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Tue, 11 Jul 2006 11:10:05 +0200 (2006-07-11) |
parents | e5018cae273f |
children | 49e2fc9fb94f |
files | config.h event.c menu.c util.c util.h wm.c wm.h |
diffstat | 7 files changed, 70 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/config.h Mon Jul 10 22:16:48 2006 +0200 +++ b/config.h Tue Jul 11 11:10:05 2006 +0200 @@ -7,3 +7,5 @@ #define BGCOLOR "#000000" #define FGCOLOR "#ffaa00" #define BORDERCOLOR "#000000" +#define STATUSCMD "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \ + " `acpi | awk '{print $4}' | sed 's/,//'`"
--- a/event.c Mon Jul 10 22:16:48 2006 +0200 +++ b/event.c Tue Jul 11 11:10:05 2006 +0200 @@ -218,7 +218,6 @@ static void maprequest(XEvent *e) { -#if 0 XMapRequestEvent *ev = &e->xmaprequest; static XWindowAttributes wa; @@ -231,9 +230,8 @@ return; } - if(!client_of_win(ev->window)) - manage_client(create_client(ev->window, &wa)); -#endif + /*if(!client_of_win(ev->window))*/ + manage(create_client(ev->window, &wa)); } static void
--- a/menu.c Mon Jul 10 22:16:48 2006 +0200 +++ b/menu.c Tue Jul 11 11:10:05 2006 +0200 @@ -356,6 +356,15 @@ char *maxname; XEvent ev; + char buf[256]; + + fputs(STATUSCMD, stdout); + fputs("\n", stdout); + pipe_spawn(buf, sizeof(buf), NULL, STATUSCMD); + fputs(buf, stderr); + + return 0; + /* command line args */ for(i = 1; i < argc; i++) { if (argv[i][0] == '-')
--- a/util.c Mon Jul 10 22:16:48 2006 +0200 +++ b/util.c Tue Jul 11 11:10:05 2006 +0200 @@ -13,6 +13,8 @@ #include "util.h" +static char *shell = NULL; + void error(char *errstr, ...) { va_list ap; @@ -82,19 +84,65 @@ } void -spawn(Display *dpy, const char *shell, const char *cmd) +spawn(Display *dpy, const char *cmd) { - if(!cmd || !shell) + if(!shell && !(shell = getenv("SHELL"))) + shell = "/bin/sh"; + + if(!cmd) return; if(fork() == 0) { if(fork() == 0) { + setsid(); if(dpy) close(ConnectionNumber(dpy)); - execl(shell, shell, "-c", cmd, (const char *)0); - fprintf(stderr, "gridwm: execl %s", shell); + execlp(shell, "shell", "-c", cmd, NULL); + fprintf(stderr, "gridwm: execvp %s", cmd); perror(" failed"); } exit (0); } wait(0); } + +void +pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) +{ + unsigned int l, n; + int pfd[2]; + + if(!shell && !(shell = getenv("SHELL"))) + shell = "/bin/sh"; + + if(!cmd) + return; + + if(pipe(pfd) == -1) { + perror("pipe"); + exit(1); + } + + if(fork() == 0) { + setsid(); + if(dpy) + close(ConnectionNumber(dpy)); + dup2(pfd[1], STDOUT_FILENO); + close(pfd[0]); + close(pfd[1]); + execlp(shell, "shell", "-c", cmd, NULL); + fprintf(stderr, "gridwm: execvp %s", cmd); + perror(" failed"); + } + else { + n = 0; + close(pfd[1]); + while(l > n) { + if((l = read(pfd[0], buf + n, len - n)) < 1) + break; + n += l; + } + close(pfd[0]); + buf[n - 1] = 0; + } + wait(0); +}
--- a/util.h Mon Jul 10 22:16:48 2006 +0200 +++ b/util.h Tue Jul 11 11:10:05 2006 +0200 @@ -14,5 +14,6 @@ failed_assert(#a, __FILE__, __LINE__); \ } while (0) extern void failed_assert(char *a, char *file, int line); +void pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd); +extern void spawn(Display *dpy, const char *cmd); extern void swap(void **p1, void **p2); -extern void spawn(Display *dpy, const char *shell, const char *cmd);
--- a/wm.c Mon Jul 10 22:16:48 2006 +0200 +++ b/wm.c Tue Jul 11 11:10:05 2006 +0200 @@ -21,7 +21,7 @@ XRectangle rect, barrect; Bool running = True; -char *bartext, *shell; +char *bartext; int screen, sel_screen; unsigned int lock_mask, numlock_mask; @@ -56,7 +56,7 @@ if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) continue; if(wa.map_state == IsViewable) - /*manage*/; + manage(create_client(wins[i], &wa)); } } if(wins) @@ -219,9 +219,6 @@ if(other_wm_running) error("gridwm: another window manager is already running\n"); - if(!(shell = getenv("SHELL"))) - shell = "/bin/sh"; - rect.x = rect.y = 0; rect.width = DisplayWidth(dpy, screen); rect.height = DisplayHeight(dpy, screen);