JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
implemented pipe_spawn
authorAnselm R. Garbe <garbeam@wmii.de>
Tue, 11 Jul 2006 09:10:05 +0000 (11:10 +0200)
committerAnselm R. Garbe <garbeam@wmii.de>
Tue, 11 Jul 2006 09:10:05 +0000 (11:10 +0200)
config.h
event.c
menu.c
util.c
util.h
wm.c
wm.h

index ca05aa2..58ed8ea 100644 (file)
--- a/config.h
+++ b/config.h
@@ -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 --git a/event.c b/event.c
index d6977d3..b31c94f 100644 (file)
--- a/event.c
+++ b/event.c
@@ -218,7 +218,6 @@ keymapnotify(XEvent *e)
 static void
 maprequest(XEvent *e)
 {
-#if 0
        XMapRequestEvent *ev = &e->xmaprequest;
        static XWindowAttributes wa;
 
@@ -231,9 +230,8 @@ maprequest(XEvent *e)
                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 --git a/menu.c b/menu.c
index 7c84305..d2e50ec 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -356,6 +356,15 @@ main(int argc, char *argv[])
        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 --git a/util.c b/util.c
index 435069f..de4df98 100644 (file)
--- a/util.c
+++ b/util.c
@@ -13,6 +13,8 @@
 
 #include "util.h"
 
+static char *shell = NULL;
+
 void
 error(char *errstr, ...) {
        va_list ap;
@@ -82,19 +84,65 @@ swap(void **p1, void **p2)
 }
 
 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 --git a/util.h b/util.h
index cac3df0..4b82cef 100644 (file)
--- a/util.h
+++ b/util.h
@@ -14,5 +14,6 @@ extern char *estrdup(const char *str);
                        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 --git a/wm.c b/wm.c
index b8b3053..843aaac 100644 (file)
--- a/wm.c
+++ b/wm.c
@@ -21,7 +21,7 @@ Cursor cursor[CurLast];
 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 @@ scan_wins()
                        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 @@ main(int argc, char *argv[])
        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 --git a/wm.h b/wm.h
index 038078f..c4d65ea 100644 (file)
--- a/wm.h
+++ b/wm.h
@@ -55,7 +55,7 @@ extern void (*handler[LASTEvent]) (XEvent *);
 
 extern int screen, sel_screen;
 extern unsigned int lock_mask, numlock_mask;
-extern char *bartext, *shell;
+extern char *bartext;
 
 extern Brush brush;