implemented pipe_spawn
This commit is contained in:
		
							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