From 77aa5ac45b06b4afa392e21d55e3318913b0347b Mon Sep 17 00:00:00 2001 From: okan Date: Wed, 22 Jan 2014 21:48:27 +0000 Subject: Somewhat streamline event loop/restart/quit handling; most notable change allows a restart to trigger proper teardown first, even though teardown is not (yet) complete. After some discussion with oga@nicotinebsd.org regarding a more complicated version/idea. --- calmwm.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'calmwm.c') diff --git a/calmwm.c b/calmwm.c index 75bb675..9e76d34 100644 --- a/calmwm.c +++ b/calmwm.c @@ -47,10 +47,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(void); static void x_teardown(void); static int x_wmerrorhandler(Display *, XErrorEvent *); @@ -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(); return (0); } @@ -140,6 +146,13 @@ x_init(const char *dpyname) screen_init(i); } +static void +x_restart(void) +{ + (void)setsid(); + (void)execvp(cwm_argv[0], cwm_argv); +} + static void x_teardown(void) { -- cgit 1.4.1