forked from mirror/dwm
implemented pipe_spawn
This commit is contained in:
parent
439e15d09f
commit
3a69c5173c
7 changed files with 70 additions and 15 deletions
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);
|
||||
|
|
2
wm.h
2
wm.h
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue