aboutsummaryrefslogtreecommitdiff
path: root/src/key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/key.c')
-rw-r--r--src/key.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/key.c b/src/key.c
index d5c6b4f..f14ad62 100644
--- a/src/key.c
+++ b/src/key.c
@@ -455,3 +455,77 @@ void ValidateKeys() {
}
+/** Return true if the key event matches any switching key or its modifiers. */
+int Switching(const XKeyEvent *event) {
+ KeyNode *np;
+ KeySym keysym;
+ KeyType key;
+ unsigned int mask;
+
+ /* Match key bindings for switching windows */
+ key = GetKey(event);
+ switch(key & 0xFF) {
+ case KEY_NEXT:
+ case KEY_PREV:
+ case KEY_NEXT_STACKED:
+ case KEY_PREV_STACKED:
+ return 1;
+ }
+
+ /* Get modifiers of those key bindings */
+ mask = 0;
+ for(np = bindings; np; np = np->next) {
+ switch(np->key & 0xFF) {
+ case KEY_NEXT:
+ case KEY_PREV:
+ case KEY_NEXT_STACKED:
+ case KEY_PREV_STACKED:
+ mask |= np->mask;
+ }
+ }
+
+ /* Match (prioritized) modifier */
+ keysym = XLookupKeysym((XKeyEvent*)event, 0);
+ switch(keysym) {
+ case XK_Hyper_L:
+ case XK_Hyper_R:
+ return mask & MASK_HYPER
+ && !(mask & MASK_SUPER)
+ && !(mask & MASK_META)
+ && !(mask & MASK_ALT)
+ && !(mask & MASK_CTRL)
+ && !(mask & MASK_SHIFT);
+ case XK_Super_L:
+ case XK_Super_R:
+ return mask & MASK_SUPER
+ && !(mask & MASK_META)
+ && !(mask & MASK_ALT)
+ && !(mask & MASK_CTRL)
+ && !(mask & MASK_SHIFT);
+ case XK_Meta_L:
+ case XK_Meta_R:
+ return mask & MASK_META
+ && !(mask & MASK_ALT)
+ && !(mask & MASK_CTRL)
+ && !(mask & MASK_SHIFT);
+ case XK_Alt_L:
+ case XK_Alt_R:
+ return mask & MASK_ALT
+ && !(mask & MASK_CTRL)
+ && !(mask & MASK_SHIFT);
+ case XK_Control_L:
+ case XK_Control_R:
+ return mask & MASK_CTRL
+ && !(mask & MASK_SHIFT);
+ case XK_Shift_L:
+ case XK_Shift_R:
+ return mask & MASK_SHIFT
+ && (mask & MASK_SUPER
+ || mask & MASK_META
+ || mask & MASK_ALT
+ || mask & MASK_CTRL);
+ }
+
+ return 0;
+}
+