timplemented pipe_spawn - dwm - [fork] customized build of dwm, the dynamic win… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3a69c5173cdd24959410870bec2a10a76272e034 | |
parent 439e15d09f6fa9271d3b49ef97194f0c80ebe161 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Tue, 11 Jul 2006 11:10:05 +0200 | |
implemented pipe_spawn | |
Diffstat: | |
M config.h | 2 ++ | |
M event.c | 6 ++---- | |
M menu.c | 9 +++++++++ | |
M util.c | 56 ++++++++++++++++++++++++++++-… | |
M util.h | 3 ++- | |
M wm.c | 7 ++----- | |
M wm.h | 2 +- | |
7 files changed, 70 insertions(+), 15 deletions(-) | |
--- | |
diff --git a/config.h b/config.h | |
t@@ -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 | |
t@@ -218,7 +218,6 @@ keymapnotify(XEvent *e) | |
static void | |
maprequest(XEvent *e) | |
{ | |
-#if 0 | |
XMapRequestEvent *ev = &e->xmaprequest; | |
static XWindowAttributes wa; | |
t@@ -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 | |
t@@ -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 | |
t@@ -13,6 +13,8 @@ | |
#include "util.h" | |
+static char *shell = NULL; | |
+ | |
void | |
error(char *errstr, ...) { | |
va_list ap; | |
t@@ -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 | |
t@@ -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 | |
t@@ -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; | |
t@@ -56,7 +56,7 @@ scan_wins() | |
if(wa.override_redirect || XGetTransientForHint(dpy, w… | |
continue; | |
if(wa.map_state == IsViewable) | |
- /*manage*/; | |
+ manage(create_client(wins[i], &wa)); | |
} | |
} | |
if(wins) | |
t@@ -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 | |
t@@ -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; | |