implemented pipe_spawn

This commit is contained in:
Anselm R. Garbe 2006-07-11 11:10:05 +02:00
parent 439e15d09f
commit 3a69c5173c
7 changed files with 70 additions and 15 deletions

View File

@ -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/,//'`"

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);

2
wm.h
View File

@ -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;