# HG changeset patch # User Anselm R. Garbe # Date 1152609005 -7200 # Node ID e0cefb3981c85fadbd03f6fb3d173a69f0ddaf79 # Parent e5018cae273f28ac6f72ebb7b4979997c7fa7750 implemented pipe_spawn diff -r e5018cae273f -r e0cefb3981c8 config.h --- 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/,//'`" diff -r e5018cae273f -r e0cefb3981c8 event.c --- 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 diff -r e5018cae273f -r e0cefb3981c8 menu.c --- 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] == '-') diff -r e5018cae273f -r e0cefb3981c8 util.c --- 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); +} diff -r e5018cae273f -r e0cefb3981c8 util.h --- 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); diff -r e5018cae273f -r e0cefb3981c8 wm.c --- 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); diff -r e5018cae273f -r e0cefb3981c8 wm.h --- a/wm.h Mon Jul 10 22:16:48 2006 +0200 +++ b/wm.h Tue Jul 11 11:10:05 2006 +0200 @@ -55,7 +55,7 @@ extern int screen, sel_screen; extern unsigned int lock_mask, numlock_mask; -extern char *bartext, *shell; +extern char *bartext; extern Brush brush;