diff options
| author | Anselm R. Garbe <garbeam@wmii.de> | 2006-07-11 11:10:05 +0200 | 
|---|---|---|
| committer | Anselm R. Garbe <garbeam@wmii.de> | 2006-07-11 11:10:05 +0200 | 
| commit | 3a69c5173cdd24959410870bec2a10a76272e034 (patch) | |
| tree | 993f2fb75b1c44213d0c95a4da8b3a18daa739fe | |
| parent | 439e15d09f6fa9271d3b49ef97194f0c80ebe161 (diff) | |
implemented pipe_spawn
| -rw-r--r-- | config.h | 2 | ||||
| -rw-r--r-- | event.c | 6 | ||||
| -rw-r--r-- | menu.c | 9 | ||||
| -rw-r--r-- | util.c | 56 | ||||
| -rw-r--r-- | util.h | 3 | ||||
| -rw-r--r-- | wm.c | 7 | ||||
| -rw-r--r-- | wm.h | 2 | 
7 files changed, 70 insertions, 15 deletions
| @@ -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/,//'`" @@ -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 @@ -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] == '-') @@ -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); +} @@ -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); @@ -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); @@ -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; | 
