summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h1
-rw-r--r--client.c12
-rw-r--r--xevents.c26
3 files changed, 23 insertions, 16 deletions
diff --git a/calmwm.h b/calmwm.h
index 85141bb..95dceda 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -307,6 +307,7 @@ __dead void		 usage(void);
 void			 client_applysizehints(struct client_ctx *);
 struct client_ctx	*client_current(void);
 void			 client_cycle(struct screen_ctx *, int);
+void			 client_cycle_leave(struct screen_ctx *, struct client_ctx *);
 void			 client_delete(struct client_ctx *);
 void			 client_draw_border(struct client_ctx *);
 struct client_ctx	*client_find(Window);
diff --git a/client.c b/client.c
index 713ee1d..5fe7aaf 100644
--- a/client.c
+++ b/client.c
@@ -644,6 +644,18 @@ client_cycle(struct screen_ctx *sc, int flags)
 	client_ptrwarp(newcc);
 }
 
+void
+client_cycle_leave(struct screen_ctx *sc, struct client_ctx *cc) 
+{
+	sc->cycling = 0;
+
+	client_mtf(NULL);
+	if (cc) {
+		group_sticky_toggle_exit(cc);
+		XUngrabKeyboard(X_Dpy, CurrentTime);
+	}
+}
+
 static struct client_ctx *
 client_mrunext(struct client_ctx *cc)
 {
diff --git a/xevents.c b/xevents.c
index 14c8f2d..90304c4 100644
--- a/xevents.c
+++ b/xevents.c
@@ -70,6 +70,9 @@ void		(*xev_handlers[LASTEvent])(XEvent *) = {
 			[MappingNotify] = xev_handle_mappingnotify,
 };
 
+static KeySym modkeys[] = { XK_Alt_L, XK_Alt_R, XK_Super_L, XK_Super_R,
+			    XK_Control_L, XK_Control_R };
+
 static void
 xev_handle_maprequest(XEvent *ee)
 {
@@ -314,7 +317,7 @@ xev_handle_keypress(XEvent *ee)
 }
 
 /*
- * This is only used for the alt suppression detection.
+ * This is only used for the modifier suppression detection.
  */
 static void
 xev_handle_keyrelease(XEvent *ee)
@@ -322,26 +325,17 @@ xev_handle_keyrelease(XEvent *ee)
 	XKeyEvent		*e = &ee->xkey;
 	struct screen_ctx	*sc;
 	struct client_ctx	*cc;
-	int			 keysym;
+	int			 i, keysym;
 
 	sc = screen_fromroot(e->root);
 	cc = client_current();
 
 	keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0);
-	if (keysym != XK_Alt_L && keysym != XK_Alt_R)
-		return;
-
-	sc->cycling = 0;
-
-	/*
-	 * XXX - better interface... xevents should not know about
-	 * how/when to mtf.
-	 */
-	client_mtf(NULL);
-
-	if (cc != NULL) {
-		group_sticky_toggle_exit(cc);
-		XUngrabKeyboard(X_Dpy, CurrentTime);
+	for (i = 0; i < nitems(modkeys); i++) {
+		if (keysym == modkeys[i]) {
+			client_cycle_leave(sc, cc);
+			break;
+		}
 	}
 }