The obvious solution: just check for every possible modifier.

diff --git a/calmwm.h b/calmwm.h
index 9ac93b0..2de9578 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -202,7 +202,7 @@ struct screen_ctx {
        Window                   menuwin;
        struct color             color[CWM_COLOR_MAX];
        GC                       gc;
-       int                      altpersist;
+       int                      cycling;
        int                      xmax;
        int                      ymax;
        struct gap               gap;
@@ -306,6 +306,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 a53ccb0..74bb2e2 100644
--- a/client.c
+++ b/client.c
@@ -228,7 +228,7 @@ client_setactive(struct client_ctx *cc, int fg)
                 * If we're in the middle of alt-tabbing, don't change
                 * the order please.
                 */
-               if (!sc->altpersist)
+               if (!sc->cycling)
                        client_mtf(cc);
        } else
                client_leave(cc);
@@ -637,12 +637,23 @@ client_cycle(struct screen_ctx *sc, int flags)
                }
        }
 
-       /* reset when alt is released. XXX I hate this hack */
-       sc->altpersist = 1;
+       /* reset when modkey is released. XXX I hate this hack */
+       sc->cycling = 1;
        client_ptrsave(oldcc);
        client_ptrwarp(newcc);
 }
 
+void
+client_cycle_leave(struct screen_ctx *sc, struct client_ctx *cc) 
+{
+       sc->cycling = 0;
+
+       client_mtf(NULL);
+
+       if (cc != NULL)
+               group_sticky_toggle_exit(cc);
+}
+
 struct client_ctx *
 client_mrusearch(struct screen_ctx *sc, struct group_ctx *gc) 
 {
diff --git a/xevents.c b/xevents.c
index ce4378a..ad000f8 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,19 @@ 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 = XKeycodeToKeysym(X_Dpy, e->keycode, 0);
-       if (keysym != XK_Alt_L && keysym != XK_Alt_R)
-               return;
-
-       sc->altpersist = 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 < sizeof(modkeys)/sizeof(modkeys[0]); i++) {
+               if (keysym == modkeys[i]) {
+                       client_cycle_leave(sc, cc);
+                       if (cc)
+                               XUngrabKeyboard(X_Dpy, CurrentTime);
+                       break;
+               }
        }
 }
 
-- 
1.7.6

Reply via email to