about summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2013-05-23 16:52:39 +0000
committerokan <okan>2013-05-23 16:52:39 +0000
commitbe1a7a3f5c7c0777ba86d40c49425e97fbae62a1 (patch)
tree6caf5a6701ccfa50641a56cd616770e993ffa822
parent7cc1c7344fe74b91e528ea6792318d7af0d833ef (diff)
downloadcwm-be1a7a3f5c7c0777ba86d40c49425e97fbae62a1.tar.gz
cwm-be1a7a3f5c7c0777ba86d40c49425e97fbae62a1.tar.xz
cwm-be1a7a3f5c7c0777ba86d40c49425e97fbae62a1.zip
alter conf_grab(_kbd) to first ungrab AnyKey/AnyModifier, then proceed
to grab keys in keybindingq.  we don't need to ungrab/grab on every
addition to the queue, just once with a complete keybindingq; simplify
grabbing keys per screen (during init) and during a MappingNotify.

while here, change conf_grab_{kbd,mouse} to require only a Window.
-rw-r--r--calmwm.h6
-rw-r--r--client.c2
-rw-r--r--conf.c54
-rw-r--r--xevents.c12
-rw-r--r--xutil.c15
5 files changed, 23 insertions, 66 deletions
diff --git a/calmwm.h b/calmwm.h
index 16901b3..25eae87 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -435,13 +435,12 @@ void			 conf_bindname(struct conf *, char *, char *);
 void			 conf_clear(struct conf *);
 void			 conf_client(struct client_ctx *);
 void			 conf_cmd_add(struct conf *, char *, char *);
-void			 conf_grab(struct conf *, struct keybinding *);
-void			 conf_grab_mouse(struct client_ctx *);
+void			 conf_grab_kbd(Window);
+void			 conf_grab_mouse(Window);
 void			 conf_init(struct conf *);
 void			 conf_ignore(struct conf *, char *);
 int			 conf_mousebind(struct conf *, char *, char *);
 void			 conf_screen(struct screen_ctx *);
-void			 conf_ungrab(struct conf *, struct keybinding *);
 
 void			 xev_loop(void);
 
@@ -453,7 +452,6 @@ int			 xu_getprop(Window, Atom, Atom, long, u_char **);
 int			 xu_get_wm_state(Window, int *);
 int			 xu_getstrprop(Window, Atom, char **);
 void			 xu_key_grab(Window, u_int, KeySym);
-void			 xu_key_ungrab(Window, u_int, KeySym);
 void			 xu_ptr_getpos(Window, int *, int *);
 int			 xu_ptr_grab(Window, u_int, Cursor);
 int			 xu_ptr_regrab(u_int, Cursor);
diff --git a/client.c b/client.c
index 605c2a4..650dbaa 100644
--- a/client.c
+++ b/client.c
@@ -213,7 +213,7 @@ client_setactive(struct client_ctx *cc, int fg)
 		XInstallColormap(X_Dpy, cc->colormap);
 		XSetInputFocus(X_Dpy, cc->win,
 		    RevertToPointerRoot, CurrentTime);
-		conf_grab_mouse(cc);
+		conf_grab_mouse(cc->win);
 		/*
 		 * If we're in the middle of alt-tabbing, don't change
 		 * the order please.
diff --git a/conf.c b/conf.c
index 5d005c1..763e364 100644
--- a/conf.c
+++ b/conf.c
@@ -98,7 +98,6 @@ static char *color_binds[CWM_COLOR_MAX] = {
 void
 conf_screen(struct screen_ctx *sc)
 {
-	struct keybinding	*kb;
 	int			 i;
 	XftColor		 xc;
 
@@ -141,8 +140,7 @@ conf_screen(struct screen_ctx *sc)
 	if (sc->xftdraw == NULL)
 		errx(1, "XftDrawCreate");
 
-	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
-		xu_key_grab(sc->rootwin, kb->modmask, kb->keysym);
+	conf_grab_kbd(sc->rootwin);
 }
 
 static struct {
@@ -436,37 +434,6 @@ static struct {
 	    {.i = CWM_TILE_VERT } },
 };
 
-/*
- * 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);
-}
-
 static struct {
 	char	chr;
 	int	mask;
@@ -656,17 +623,26 @@ conf_mouseunbind(struct conf *c, struct mousebinding *unbind)
 	}
 }
 
-/*
- * Grab the mouse buttons that we need for bindings for this client
- */
 void
-conf_grab_mouse(struct client_ctx *cc)
+conf_grab_mouse(Window win)
 {
 	struct mousebinding	*mb;
 
 	TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
 		if (mb->context != MOUSEBIND_CTX_WIN)
 			continue;
-		xu_btn_grab(cc->win, mb->modmask, mb->button);
+		xu_btn_grab(win, mb->modmask, mb->button);
 	}
 }
+
+void
+conf_grab_kbd(Window win)
+{
+	struct keybinding	*kb;
+
+	XUngrabKey(X_Dpy, AnyKey, AnyModifier, win);
+
+	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
+		xu_key_grab(win, kb->modmask, kb->keysym);
+}
+
diff --git a/xevents.c b/xevents.c
index 1c6ffaf..0a8dc9a 100644
--- a/xevents.c
+++ b/xevents.c
@@ -389,15 +389,13 @@ static void
 xev_handle_mappingnotify(XEvent *ee)
 {
 	XMappingEvent		*e = &ee->xmapping;
-	struct keybinding	*kb;
-
-	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
-		conf_ungrab(&Conf, kb);
+	struct screen_ctx	*sc;
 
 	XRefreshKeyboardMapping(e);
-
-	TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
-		conf_grab(&Conf, kb);
+	if (e->request == MappingKeyboard) {
+		TAILQ_FOREACH(sc, &Screenq, entry)
+			conf_grab_kbd(sc->rootwin);
+	}
 }
 
 static void
diff --git a/xutil.c b/xutil.c
index 2c678dd..37d7e24 100644
--- a/xutil.c
+++ b/xutil.c
@@ -106,21 +106,6 @@ xu_key_grab(Window win, u_int mask, KeySym keysym)
 }
 
 void
-xu_key_ungrab(Window win, u_int mask, KeySym keysym)
-{
-	KeyCode	 code;
-	u_int	 i;
-
-	code = XKeysymToKeycode(X_Dpy, keysym);
-	if ((XkbKeycodeToKeysym(X_Dpy, code, 0, 0) != keysym) &&
-	    (XkbKeycodeToKeysym(X_Dpy, code, 0, 1) == keysym))
-		mask |= ShiftMask;
-
-	for (i = 0; i < nitems(ign_mods); i++)
-		XUngrabKey(X_Dpy, code, (mask | ign_mods[i]), win);
-}
-
-void
 xu_configure(struct client_ctx *cc)
 {
 	XConfigureEvent	 ce;