From a912ad39658bcaef891a3816f9f8d78ef41a82c2 Mon Sep 17 00:00:00 2001 From: Marco Peereboom Date: Wed, 28 Jan 2009 17:46:55 +0000 Subject: [PATCH] open /dev/null on stdin during spawn. pointed out by mcbride and it fixes mplayer when launched from firefox and when firefox was launched from dmenu Also move focus to the bottom of manage_window. --- scrotwm.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/scrotwm.c b/scrotwm.c index 51f73cf..a2116d7 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -176,8 +176,8 @@ char *bar_fonts[] = { /* terminal + args */ char *spawn_term[] = { "xterm", NULL }; char *spawn_screenshot[] = { "screenshot.sh", NULL, NULL }; -char *spawn_menu[] = { "dmenu_run", "-fn", NULL, - "-nb", NULL, "-nf", NULL, "-sb", NULL, "-sf", NULL, NULL }; +char *spawn_menu[] = { "dmenu_run", "-fn", NULL, "-nb", NULL, + "-nf", NULL, "-sb", NULL, "-sf", NULL, NULL }; #define SWM_MENU_FN (2) #define SWM_MENU_NB (4) @@ -804,6 +804,7 @@ void spawn(struct swm_region *r, union arg *args) { char *ret; + int si; DNPRINTF(SWM_D_MISC, "spawn: %s\n", args->argv[0]); /* @@ -824,6 +825,12 @@ spawn(struct swm_region *r, union arg *args) free(ret); } setsid(); + /* kill stdin, mplayer, ssh-add etc. need that */ + si = open("/dev/null", O_RDONLY, 0); + if (si == -1) + err(1, "open /dev/null"); + if (dup2(si, 0) == -1) + err(1, "dup2 /dev/null"); execvp(args->argv[0], args->argv); fprintf(stderr, "execvp failed\n"); perror(" failed"); @@ -1789,9 +1796,6 @@ manage_window(Window id) win->s = r->s; /* this never changes */ TAILQ_INSERT_TAIL(&ws->winlist, win, entry); - /* make new win focused */ - focus_win(win); - XGetTransientForHint(display, win->id, &trans); if (trans) { win->transient = trans; @@ -1836,6 +1840,10 @@ manage_window(Window id) set_win_state(win, NormalState); + /* make new win focused */ + focus_win(win); + + return (win); }