implemented pipe_spawn
							parent
							
								
									439e15d09f
								
							
						
					
					
						commit
						3a69c5173c
					
				
							
								
								
									
										2
									
								
								config.h
								
								
								
								
							
							
						
						
									
										2
									
								
								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/,//'`" | ||||
|  |  | |||
							
								
								
									
										6
									
								
								event.c
								
								
								
								
							
							
						
						
									
										6
									
								
								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 | ||||
|  |  | |||
							
								
								
									
										9
									
								
								menu.c
								
								
								
								
							
							
						
						
									
										9
									
								
								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] == '-') | ||||
|  |  | |||
							
								
								
									
										56
									
								
								util.c
								
								
								
								
							
							
						
						
									
										56
									
								
								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); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										3
									
								
								util.h
								
								
								
								
							
							
						
						
									
										3
									
								
								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); | ||||
|  |  | |||
							
								
								
									
										7
									
								
								wm.c
								
								
								
								
							
							
						
						
									
										7
									
								
								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); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue