diff options
Diffstat (limited to 'src/key.c')
-rw-r--r-- | src/key.c | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -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; +} + |