about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAnselm R. Garbe <garbeam@wmii.de>2006-07-11 11:10:05 +0200
committerAnselm R. Garbe <garbeam@wmii.de>2006-07-11 11:10:05 +0200
commit3a69c5173cdd24959410870bec2a10a76272e034 (patch)
tree993f2fb75b1c44213d0c95a4da8b3a18daa739fe
parent439e15d09f6fa9271d3b49ef97194f0c80ebe161 (diff)
downloaddwm-3a69c5173cdd24959410870bec2a10a76272e034.tar.gz
implemented pipe_spawn
-rw-r--r--config.h2
-rw-r--r--event.c6
-rw-r--r--menu.c9
-rw-r--r--util.c56
-rw-r--r--util.h3
-rw-r--r--wm.c7
-rw-r--r--wm.h2
7 files changed, 70 insertions, 15 deletions
diff --git a/config.h b/config.h
index ca05aa2..58ed8ea 100644
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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;