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;