wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 4044a4c1677915ec675ddfd68e4e1c142ceb8f9d
parent aa10cbc01b331118e7dce49403469d1e90d873f2
Author: Kris Maglione <jg@suckless.org>
Date:   Sun, 18 Feb 2007 12:11:00 -0500

Cleanup on some signals. Fork process to fix mouse focus on exit.


Diffstat:
main.c | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 60 insertions(+), 8 deletions(-)

diff --git a/main.c b/main.c @@ -23,6 +23,7 @@ Bool starting; static Bool check_other_wm; static int (*x_error_handler) (Display *, XErrorEvent *); static char version[] = "wmiiwm - " VERSION ", (C)opyright MMIV-MMVI Anselm R. Garbe\n"; +static struct sigaction sa; static void usage() { @@ -30,13 +31,6 @@ usage() { } static void -sigchld_handler(int sig) { - int ret; - /* We only spawn one child */ - wait(&ret); -} - -static void scan_wins() { int i; uint num; @@ -182,10 +176,66 @@ cleanup() { for(c=client; c; c=c->next) reparent_client(c, blz.root, c->sel->rect.x, c->sel->rect.y); - XSetInputFocus(blz.dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSync(blz.dpy, False); } +static void +cleanup_handler(int signal) { + sa.sa_handler = SIG_DFL; + sigaction(signal, &sa, nil); + switch(signal) { + case SIGINT: + srv.running = False; + break; + default: + cleanup(); + XCloseDisplay(blz.dpy); + raise(signal); + break; + } +} + +static void +sigchld_handler(int sig) { + int ret; + /* We only spawn one child */ + wait(&ret); +} + +static void +init_traps() { + char buf[1]; + int fd[2]; + + if(pipe(fd) != 0) + fatal("Can't pipe(): %s\n", strerror(errno));; + + switch(fork()) { + case -1: + fatal("Can't fork(): %s\n", strerror(errno));; + default: + close(fd[0]); + sa.sa_flags = 0; + sa.sa_handler = cleanup_handler; + sigaction(SIGINT, &sa, nil); + sigaction(SIGTERM, &sa, nil); + sigaction(SIGQUIT, &sa, nil); + sigaction(SIGHUP, &sa, nil); + break; + case 0: + close(fd[1]); + close(ConnectionNumber(blz.dpy)); + setsid(); + blz.dpy = XOpenDisplay(0); + if(!blz.dpy) + fatal("wmiiwm: cannot open display\n"); + read(fd[0], buf, 1); + XSetInputFocus(blz.dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XCloseDisplay(blz.dpy); + exit(0); + } +} + int main(int argc, char *argv[]) { int i; @@ -240,6 +290,8 @@ main(int argc, char *argv[]) { XSync(blz.dpy, False); check_other_wm = False; + init_traps(); + /* Check namespace permissions */ if(!strncmp(address, "unix!", 5)) { struct stat st;