aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorokan2014-01-22 21:48:27 +0000
committerokan2014-01-22 21:48:27 +0000
commitd86dc240a824ab0c88be47a7c951517b8a07fdde (patch)
tree817269e43357f67bfcbaab33f728076e706d9484
parent129338185f898dfe060a3de1b5b7aba429161b81 (diff)
downloadcwm-d86dc240a824ab0c88be47a7c951517b8a07fdde.tar.gz
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.
-rw-r--r--calmwm.c17
-rw-r--r--calmwm.h12
-rw-r--r--conf.c6
-rw-r--r--kbfunc.c16
-rw-r--r--xevents.c18
5 files changed, 36 insertions, 33 deletions
diff --git a/calmwm.c b/calmwm.c
index 8734866..d476aa0 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.c,v 1.83 2014/01/21 15:42:44 okan Exp $
+ * $OpenBSD: calmwm.c,v 1.84 2014/01/22 21:48:27 okan Exp $
*/
#include <sys/param.h>
@@ -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 e9c8065..9cc96bc 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.h,v 1.246 2014/01/21 15:42:44 okan Exp $
+ * $OpenBSD: calmwm.h,v 1.247 2014/01/22 21:48:27 okan Exp $
*/
#ifndef _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 cc7f417..b38f2c4 100644
--- a/conf.c
+++ b/conf.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: conf.c,v 1.160 2014/01/21 15:42:44 okan Exp $
+ * $OpenBSD: conf.c,v 1.161 2014/01/22 21:48:27 okan Exp $
*/
#include <sys/param.h>
@@ -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 4ad5db3..f0b3608 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: kbfunc.c,v 1.90 2014/01/21 15:42:45 okan Exp $
+ * $OpenBSD: kbfunc.c,v 1.91 2014/01/22 21:48:27 okan Exp $
*/
#include <sys/param.h>
@@ -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 6f6a2d6..58a2a9c 100644
--- a/xevents.c
+++ b/xevents.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: xevents.c,v 1.105 2014/01/20 23:03:51 okan Exp $
+ * $OpenBSD: xevents.c,v 1.106 2014/01/22 21:48:27 okan Exp $
*/
/*
@@ -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);
}