implemented pipe_spawn
authorAnselm R. Garbe <garbeam@wmii.de>
Tue, 11 Jul 2006 11:10:05 +0200
changeset 6 e0cefb3981c8
parent 5 e5018cae273f
child 7 49e2fc9fb94f
implemented pipe_spawn
config.h
event.c
menu.c
util.c
util.h
wm.c
wm.h
--- a/config.h	Mon Jul 10 22:16:48 2006 +0200
+++ b/config.h	Tue Jul 11 11:10:05 2006 +0200
@@ -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/,//'`"
--- a/event.c	Mon Jul 10 22:16:48 2006 +0200
+++ b/event.c	Tue Jul 11 11:10:05 2006 +0200
@@ -218,7 +218,6 @@
 static void
 maprequest(XEvent *e)
 {
-#if 0
 	XMapRequestEvent *ev = &e->xmaprequest;
 	static XWindowAttributes wa;
 
@@ -231,9 +230,8 @@
 		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
--- a/menu.c	Mon Jul 10 22:16:48 2006 +0200
+++ b/menu.c	Tue Jul 11 11:10:05 2006 +0200
@@ -356,6 +356,15 @@
 	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] == '-')
--- a/util.c	Mon Jul 10 22:16:48 2006 +0200
+++ b/util.c	Tue Jul 11 11:10:05 2006 +0200
@@ -13,6 +13,8 @@
 
 #include "util.h"
 
+static char *shell = NULL;
+
 void
 error(char *errstr, ...) {
 	va_list ap;
@@ -82,19 +84,65 @@
 }
 
 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);
+}
--- a/util.h	Mon Jul 10 22:16:48 2006 +0200
+++ b/util.h	Tue Jul 11 11:10:05 2006 +0200
@@ -14,5 +14,6 @@
 			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);
--- a/wm.c	Mon Jul 10 22:16:48 2006 +0200
+++ b/wm.c	Tue Jul 11 11:10:05 2006 +0200
@@ -21,7 +21,7 @@
 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 @@
 			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 @@
 	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);
--- a/wm.h	Mon Jul 10 22:16:48 2006 +0200
+++ b/wm.h	Tue Jul 11 11:10:05 2006 +0200
@@ -55,7 +55,7 @@
 
 extern int screen, sel_screen;
 extern unsigned int lock_mask, numlock_mask;
-extern char *bartext, *shell;
+extern char *bartext;
 
 extern Brush brush;