diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2014-10-03 13:11:08 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2014-10-03 15:57:00 +0200 |
commit | 884964a9639649422d3613500cdacea48a4ccc91 (patch) | |
tree | 28fd050d2df794152e76504e0c7e5f0ddc6d5b2a /src | |
parent | f8958c3495edf6d1563a5309e84bd68931a46213 (diff) |
terminal/idev: add helper to match keyboard shortcuts
Matching keyboard shortcuts on internationalized keyboards is actually
non-trivial. Matching the actual key is easy, but the modifiers can be
used by both, the matching and the translation step. Therefore, XKB
exports "consumed-modifiers" that we use to figure out whether a modifier
was already used by the translation step.
The new IDEV_KBDMATCH() helper can be used to match on any keyboard
shortcut and it will do the right thing.
Diffstat (limited to 'src')
-rw-r--r-- | src/libsystemd-terminal/idev.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/libsystemd-terminal/idev.h b/src/libsystemd-terminal/idev.h index 0ae044cfd5..ea79bb6ab6 100644 --- a/src/libsystemd-terminal/idev.h +++ b/src/libsystemd-terminal/idev.h @@ -110,6 +110,28 @@ struct idev_data_keyboard { uint32_t *codepoints; }; +static inline bool idev_kbdmatch(idev_data_keyboard *kdata, + uint32_t mods, uint32_t n_syms, + const uint32_t *syms) { + const uint32_t significant = IDEV_KBDMOD_SHIFT | + IDEV_KBDMOD_CTRL | + IDEV_KBDMOD_ALT | + IDEV_KBDMOD_LINUX; + uint32_t real; + + if (n_syms != kdata->n_syms) + return false; + + real = kdata->mods & ~kdata->consumed_mods & significant; + if (real != (mods & ~kdata->consumed_mods)) + return false; + + return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms)); +} + +#define IDEV_KBDMATCH(_kdata, _mods, _sym) \ + idev_kbdmatch((_kdata), (_mods), 1, (const uint32_t[]){ (_sym) }) + /* * Data Packets */ |