summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.c15
-rw-r--r--calmwm.h10
-rw-r--r--conf.c4
-rw-r--r--kbfunc.c14
-rw-r--r--xevents.c16
5 files changed, 31 insertions, 28 deletions
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);
 }
@@ -141,6 +147,13 @@ x_init(const char *dpyname)
 }
 
 static void
+x_restart(void)
+{
+	(void)setsid();
+	(void)execvp(cwm_argv[0], cwm_argv);
+}
+
+static void
 x_teardown(void)
 {
 	XCloseDisplay(X_Dpy);
diff --git a/calmwm.h b/calmwm.h
index 408e098..38323e0 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -85,6 +85,10 @@
 
 #define CWM_WIN			0x0001
 
+#define CWM_QUIT		0x0000
+#define CWM_RUNNING		0x0001
+#define CWM_RESTART		0x0002
+
 union arg {
 	char	*c;
 	int	 i;
@@ -327,6 +331,7 @@ extern struct client_ctx_q		 Clientq;
 extern struct conf			 Conf;
 extern const char			*homedir;
 extern int				 HasRandr, Randr_ev;
+extern volatile sig_atomic_t		 cwm_status;
 
 enum {
 	WM_STATE,
@@ -473,11 +478,10 @@ void			 kbfunc_client_search(struct client_ctx *, union arg *);
 void			 kbfunc_client_vmaximize(struct client_ctx *,
 			     union arg *);
 void			 kbfunc_cmdexec(struct client_ctx *, union arg *);
+void			 kbfunc_cwm_status(struct client_ctx *, union arg *);
 void			 kbfunc_exec(struct client_ctx *, union arg *);
 void			 kbfunc_lock(struct client_ctx *, union arg *);
 void			 kbfunc_menu_search(struct client_ctx *, union arg *);
-void			 kbfunc_quit_wm(struct client_ctx *, union arg *);
-void			 kbfunc_restart(struct client_ctx *, union arg *);
 void			 kbfunc_ssh(struct client_ctx *, union arg *);
 void			 kbfunc_term(struct client_ctx *, union arg *);
 void 			 kbfunc_tile(struct client_ctx *, union arg *);
@@ -527,7 +531,7 @@ void			 conf_init(struct conf *);
 void			 conf_ignore(struct conf *, const char *);
 void			 conf_screen(struct screen_ctx *);
 
-void			 xev_loop(void);
+void			 xev_process(void);
 
 void			 xu_btn_grab(Window, int, unsigned int);
 void			 xu_btn_ungrab(Window);
diff --git a/conf.c b/conf.c
index 8f0258f..ffcc979 100644
--- a/conf.c
+++ b/conf.c
@@ -373,8 +373,8 @@ static const struct {
 	{ "vmaximize", kbfunc_client_vmaximize, CWM_WIN, {0} },
 	{ "hmaximize", kbfunc_client_hmaximize, CWM_WIN, {0} },
 	{ "freeze", kbfunc_client_freeze, CWM_WIN, {0} },
-	{ "restart", kbfunc_restart, 0, {0} },
-	{ "quit", kbfunc_quit_wm, 0, {0} },
+	{ "restart", kbfunc_cwm_status, 0, {.i = CWM_RESTART} },
+	{ "quit", kbfunc_cwm_status, 0, {.i = CWM_QUIT} },
 	{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
 	{ "exec_wm", kbfunc_exec, 0, {.i = CWM_EXEC_WM} },
 	{ "ssh", kbfunc_ssh, 0, {0} },
diff --git a/kbfunc.c b/kbfunc.c
index f93acc4..b28e83e 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -35,9 +35,6 @@
 
 #define HASH_MARKER	"|1|"
 
-extern char		**cwm_argv;
-extern sig_atomic_t	xev_quit;
-
 void
 kbfunc_client_lower(struct client_ctx *cc, union arg *arg)
 {
@@ -464,16 +461,9 @@ kbfunc_client_freeze(struct client_ctx *cc, union arg *arg)
 }
 
 void
-kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
-{
-	xev_quit = 1;
-}
-
-void
-kbfunc_restart(struct client_ctx *cc, union arg *arg)
+kbfunc_cwm_status(struct client_ctx *cc, union arg *arg)
 {
-	(void)setsid();
-	(void)execvp(cwm_argv[0], cwm_argv);
+	cwm_status = arg->i;
 }
 
 void
diff --git a/xevents.c b/xevents.c
index c5c1c7e..b01f966 100644
--- a/xevents.c
+++ b/xevents.c
@@ -400,18 +400,14 @@ xev_handle_expose(XEvent *ee)
 		client_draw_border(cc);
 }
 
-volatile sig_atomic_t	xev_quit = 0;
-
 void
-xev_loop(void)
+xev_process(void)
 {
 	XEvent		 e;
 
-	while (xev_quit == 0) {
-		XNextEvent(X_Dpy, &e);
-		if (e.type - Randr_ev == RRScreenChangeNotify)
-			xev_handle_randr(&e);
-		else if (e.type < LASTEvent && xev_handlers[e.type] != NULL)
-			(*xev_handlers[e.type])(&e);
-	}
+	XNextEvent(X_Dpy, &e);
+	if (e.type - Randr_ev == RRScreenChangeNotify)
+		xev_handle_randr(&e);
+	else if (e.type < LASTEvent && xev_handlers[e.type] != NULL)
+		(*xev_handlers[e.type])(&e);
 }