diff options
author | okan <okan> | 2014-01-24 22:38:02 +0000 |
---|---|---|
committer | okan <okan> | 2014-01-24 22:38:02 +0000 |
commit | 5fd119daea8de1e84f382e7651c996fd861974b9 (patch) | |
tree | de65598674fad017b2c1ea457480a5c7ab7c6be8 /calmwm.c | |
parent | 371902b3c9fc6c7419f8134e96d67c8735726ff2 (diff) | |
parent | 6f103498437d2b2b9eeee66be168a1cc0144bdff (diff) | |
download | cwm-5fd119daea8de1e84f382e7651c996fd861974b9.tar.gz cwm-5fd119daea8de1e84f382e7651c996fd861974b9.tar.xz cwm-5fd119daea8de1e84f382e7651c996fd861974b9.zip |
cvsimport
Diffstat (limited to 'calmwm.c')
-rw-r--r-- | calmwm.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/calmwm.c b/calmwm.c index ed18a6a..71ee1f6 100644 --- a/calmwm.c +++ b/calmwm.c @@ -35,7 +35,6 @@ #include "calmwm.h" -char **cwm_argv; Display *X_Dpy; Time Last_Event_Time = CurrentTime; Atom cwmh[CWMH_NITEMS]; @@ -47,10 +46,12 @@ struct client_ctx_q Clientq = TAILQ_HEAD_INITIALIZER(Clientq); int HasRandr, Randr_ev; struct conf Conf; const char *homedir; +volatile sig_atomic_t cwm_status; static void sigchld_cb(int); static int x_errorhandler(Display *, XErrorEvent *); static void x_init(const char *); +static void x_restart(char **); static void x_teardown(void); static int x_wmerrorhandler(Display *, XErrorEvent *); @@ -59,6 +60,7 @@ main(int argc, char **argv) { const char *conf_file = NULL; char *conf_path, *display_name = NULL; + char **cwm_argv; int ch; struct passwd *pw; @@ -111,8 +113,12 @@ main(int argc, char **argv) free(conf_path); x_init(display_name); - xev_loop(); + cwm_status = CWM_RUNNING; + while (cwm_status == CWM_RUNNING) + xev_process(); x_teardown(); + if (cwm_status == CWM_RESTART) + x_restart(cwm_argv); return (0); } @@ -141,8 +147,34 @@ x_init(const char *dpyname) } static void +x_restart(char **args) +{ + (void)setsid(); + (void)execvp(args[0], args); +} + +static void x_teardown(void) { + struct screen_ctx *sc; + unsigned int i; + + TAILQ_FOREACH(sc, &Screenq, entry) { + for (i = 0; i < CWM_COLOR_NITEMS; i++) + XftColorFree(X_Dpy, sc->visual, sc->colormap, + &sc->xftcolor[i]); + XftDrawDestroy(sc->xftdraw); + XftFontClose(X_Dpy, sc->xftfont); + XUnmapWindow(X_Dpy, sc->menuwin); + XDestroyWindow(X_Dpy, sc->menuwin); + XUngrabKey(X_Dpy, AnyKey, AnyModifier, sc->rootwin); + } + XUngrabPointer(X_Dpy, CurrentTime); + XUngrabKeyboard(X_Dpy, CurrentTime); + for (i = 0; i < CF_NITEMS; i++) + XFreeCursor(X_Dpy, Conf.cursor[i]); + XSync(X_Dpy, False); + XSetInputFocus(X_Dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XCloseDisplay(X_Dpy); } |