Zbigniew Jędrzejewski-Szmek 62fe94
From 884964a9639649422d3613500cdacea48a4ccc91 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: David Herrmann <dh.herrmann@gmail.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Fri, 3 Oct 2014 13:11:08 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal/idev: add helper to match keyboard shortcuts
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Matching keyboard shortcuts on internationalized keyboards is actually
Zbigniew Jędrzejewski-Szmek 62fe94
non-trivial. Matching the actual key is easy, but the modifiers can be
Zbigniew Jędrzejewski-Szmek 62fe94
used by both, the matching and the translation step. Therefore, XKB
Zbigniew Jędrzejewski-Szmek 62fe94
exports "consumed-modifiers" that we use to figure out whether a modifier
Zbigniew Jędrzejewski-Szmek 62fe94
was already used by the translation step.
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
The new IDEV_KBDMATCH() helper can be used to match on any keyboard
Zbigniew Jędrzejewski-Szmek 62fe94
shortcut and it will do the right thing.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/idev.h | 22 ++++++++++++++++++++++
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 22 insertions(+)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/idev.h b/src/libsystemd-terminal/idev.h
Zbigniew Jędrzejewski-Szmek 62fe94
index 0ae044cfd5..ea79bb6ab6 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/idev.h
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/idev.h
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -110,6 +110,28 @@ struct idev_data_keyboard {
Zbigniew Jędrzejewski-Szmek 62fe94
         uint32_t *codepoints;
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+static inline bool idev_kbdmatch(idev_data_keyboard *kdata,
Zbigniew Jędrzejewski-Szmek 62fe94
+                                 uint32_t mods, uint32_t n_syms,
Zbigniew Jędrzejewski-Szmek 62fe94
+                                 const uint32_t *syms) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        const uint32_t significant = IDEV_KBDMOD_SHIFT |
Zbigniew Jędrzejewski-Szmek 62fe94
+                                     IDEV_KBDMOD_CTRL |
Zbigniew Jędrzejewski-Szmek 62fe94
+                                     IDEV_KBDMOD_ALT |
Zbigniew Jędrzejewski-Szmek 62fe94
+                                     IDEV_KBDMOD_LINUX;
Zbigniew Jędrzejewski-Szmek 62fe94
+        uint32_t real;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (n_syms != kdata->n_syms)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        real = kdata->mods & ~kdata->consumed_mods & significant;
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (real != (mods & ~kdata->consumed_mods))
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms));
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+#define IDEV_KBDMATCH(_kdata, _mods, _sym) \
Zbigniew Jędrzejewski-Szmek 62fe94
+        idev_kbdmatch((_kdata), (_mods), 1, (const uint32_t[]){ (_sym) })
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 /*
Zbigniew Jędrzejewski-Szmek 62fe94
  * Data Packets
Zbigniew Jędrzejewski-Szmek 62fe94
  */