commit 3a69c5173cdd24959410870bec2a10a76272e034
parent 439e15d09f6fa9271d3b49ef97194f0c80ebe161
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Tue, 11 Jul 2006 11:10:05 +0200
implemented pipe_spawn
Diffstat:
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;