--- dwm-4.4.1/main.c 2007-08-26 12:53:49.000000000 +0200 +++ dwm-4.4.1-new/main.c 2007-09-03 20:37:44.000000000 +0200 @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -13,6 +14,8 @@ #include #include +extern char **environ; + /* extern */ char stext[256]; @@ -36,10 +39,13 @@ Window root, barwin; static int (*xerrorxlib)(Display *, XErrorEvent *); static Bool otherwm, readin; static Bool running = True; +static Bool reload = False; +static char **cargv; static void cleanup(void) { - close(STDIN_FILENO); + if (!reload) + close(STDIN_FILENO); while(stack) { unban(stack); unmanage(stack); @@ -60,6 +66,18 @@ cleanup(void) { free(seltags); } +static void +sigusr1(int notused) { + quit(NULL); + reload = True; +} + +static void +doreload(void) { + execvp(cargv[0], cargv); + eprint("Can't exec: %s\n", strerror(errno)); +} + static unsigned long initcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); @@ -230,6 +248,8 @@ setup(void) { XSetFont(dpy, dc.gc, dc.font.xfont->fid); /* multihead support */ selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); + if (signal(SIGUSR1, sigusr1) == SIG_ERR) + eprint("Can't bind to signal USR1\n"); } /* @@ -307,6 +327,7 @@ main(int argc, char *argv[]) { eprint("dwm-"VERSION", © 2006-2007 A. R. Garbe, S. van Dijk, J. Salmi, P. Hruby, S. Nagy\n"); else if(argc != 1) eprint("usage: dwm [-v]\n"); + cargv = argv; setlocale(LC_CTYPE, ""); if(!(dpy = XOpenDisplay(0))) eprint("dwm: cannot open display\n"); @@ -369,5 +390,6 @@ main(int argc, char *argv[]) { } cleanup(); XCloseDisplay(dpy); + if (reload) doreload(); return 0; }