dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 3a69c5173cdd24959410870bec2a10a76272e034
parent 439e15d09f6fa9271d3b49ef97194f0c80ebe161
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 11 Jul 2006 11:10:05 +0200

implemented pipe_spawn

Diffstat:
Mconfig.h | 2++
Mevent.c | 6++----
Mmenu.c | 9+++++++++
Mutil.c | 56++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mutil.h | 3++-
Mwm.c | 7++-----
Mwm.h | 2+-
7 files changed, 70 insertions(+), 15 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;