summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.c13
-rw-r--r--calmwm.h2
-rw-r--r--conf.c38
3 files changed, 48 insertions, 5 deletions
diff --git a/calmwm.c b/calmwm.c
index 419585d..2ef2c8b 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -127,6 +127,7 @@ void
 x_setup(void)
 {
 	struct screen_ctx	*sc;
+	struct keybinding	*kb;
 	int			 i;
 
 	Nscreens = ScreenCount(X_Dpy);
@@ -136,6 +137,14 @@ x_setup(void)
 		TAILQ_INSERT_TAIL(&Screenq, sc, entry);
 	}
 
+	/*
+	 * XXX key grabs weren't done before, since Screenq was empty,
+	 * do them here for now (this needs changing).
+	 */
+	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
+		conf_grab(&Conf, kb);
+
+
 	Cursor_move = XCreateFontCursor(X_Dpy, XC_fleur);
 	Cursor_resize = XCreateFontCursor(X_Dpy, XC_bottom_right_corner);
 	Cursor_select = XCreateFontCursor(X_Dpy, XC_hand1);
@@ -151,7 +160,6 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
 	Window			*wins, w0, w1;
 	XWindowAttributes	 winattr;
 	XSetWindowAttributes	 rootattr;
-	struct keybinding	*kb;
 	u_int			 nwins, i;
 
 	Curscreen = sc;
@@ -178,9 +186,6 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
 	XAllocNamedColor(X_Dpy, DefaultColormap(X_Dpy, which),
 	    "black", &sc->blackcolor, &tmp);
 
-	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
-		xu_key_grab(sc->rootwin, kb->modmask, kb->keysym);
-
 	sc->blackpixl = BlackPixel(X_Dpy, sc->which);
 	sc->whitepixl = WhitePixel(X_Dpy, sc->which);
 	sc->bluepixl = sc->fccolor.pixel;
diff --git a/calmwm.h b/calmwm.h
index 91cce4b..7433f56 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -419,6 +419,8 @@ void			 screen_updatestackingorder(void);
 
 void			 conf_setup(struct conf *, const char *);
 void			 conf_client(struct client_ctx *);
+void			 conf_grab(struct conf *, struct keybinding *);
+void			 conf_ungrab(struct conf *, struct keybinding *);
 void			 conf_bindname(struct conf *, char *, char *);
 void			 conf_unbind(struct conf *, struct keybinding *);
 void			 conf_mousebind(struct conf *, char *, char *);
diff --git a/conf.c b/conf.c
index b824c4f..be80de9 100644
--- a/conf.c
+++ b/conf.c
@@ -290,6 +290,38 @@ struct {
 	{ NULL, NULL, 0, 0},
 };
 
+/*
+ * The following two functions are used when grabbing and ungrabbing keys for
+ * bindings
+ */
+
+/*
+ * Grab key combination on all screens and add to the global queue
+ */
+void
+conf_grab(struct conf *c, struct keybinding *kb)
+{
+	extern struct screen_ctx_q	 Screenq;
+	struct screen_ctx		*sc;
+
+	TAILQ_FOREACH(sc, &Screenq, entry)
+		xu_key_grab(sc->rootwin, kb->modmask, kb->keysym);
+
+}
+
+/*
+ * Ungrab key combination from all screens and remove from global queue
+ */
+void
+conf_ungrab(struct conf *c, struct keybinding *kb)
+{
+	extern struct screen_ctx_q	 Screenq;
+	struct screen_ctx		*sc;
+
+	TAILQ_FOREACH(sc, &Screenq, entry)
+		xu_key_ungrab(sc->rootwin, kb->modmask, kb->keysym);
+}
+
 void
 conf_bindname(struct conf *c, char *name, char *binding)
 {
@@ -349,6 +381,7 @@ conf_bindname(struct conf *c, char *name, char *binding)
 		current_binding->callback = name_to_kbfunc[iter].handler;
 		current_binding->flags = name_to_kbfunc[iter].flags;
 		current_binding->argument = name_to_kbfunc[iter].argument;
+		conf_grab(c, current_binding);
 		TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry);
 		return;
 	}
@@ -356,11 +389,13 @@ conf_bindname(struct conf *c, char *name, char *binding)
 	current_binding->callback = kbfunc_cmdexec;
 	current_binding->argument = xstrdup(binding);
 	current_binding->flags = 0;
+	conf_grab(c, current_binding);
 	TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry);
 	return;
 }
 
-void conf_unbind(struct conf *c, struct keybinding *unbind)
+void
+conf_unbind(struct conf *c, struct keybinding *unbind)
 {
 	struct keybinding	*key = NULL, *keynxt;
 
@@ -374,6 +409,7 @@ void conf_unbind(struct conf *c, struct keybinding *unbind)
 		if ((key->keycode != 0 && key->keysym == NoSymbol &&
 		    key->keycode == unbind->keycode) ||
 		    key->keysym == unbind->keysym) {
+			conf_ungrab(c, key);
 			TAILQ_REMOVE(&c->keybindingq, key, entry);
 			xfree(key);
 		}