summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-10-05 17:44:09 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2014-10-05 18:02:28 +0200
commit62d5068d631fd655efe3ae4ad51fffe28e13e27a (patch)
tree7a971ccfcdc9b2f4881d58a6516f070623640eaa /src
parent34dbefceb1377ccd7871e183d7791f76fe879e73 (diff)
terminal/idev: don't remove consumed-mods from kbd-matches
XKB consumed mods include modifiers that *didn't* affect the translation, but might affect it if used. This is very misleading, given that we are usually not interested in that information. Therefore, keep them in real mods to behave like X11 does. Maybe at some point, XKB introduces proper shortcut matching... Also make evcat display consumed modifiers so we can better debug those situations.
Diffstat (limited to 'src')
-rw-r--r--src/libsystemd-terminal/evcat.c7
-rw-r--r--src/libsystemd-terminal/idev.h2
2 files changed, 8 insertions, 1 deletions
diff --git a/src/libsystemd-terminal/evcat.c b/src/libsystemd-terminal/evcat.c
index 62556f6a2b..9e8a262b79 100644
--- a/src/libsystemd-terminal/evcat.c
+++ b/src/libsystemd-terminal/evcat.c
@@ -219,6 +219,13 @@ static void kdata_print(idev_data *data) {
printf(" %-5s", (k->mods & IDEV_KBDMOD_LINUX) ? "LINUX" : "");
printf(" %-4s", (k->mods & IDEV_KBDMOD_CAPS) ? "CAPS" : "");
+ /* Consumed modifiers */
+ printf(" | %-5s", (k->consumed_mods & IDEV_KBDMOD_SHIFT) ? "SHIFT" : "");
+ printf(" %-4s", (k->consumed_mods & IDEV_KBDMOD_CTRL) ? "CTRL" : "");
+ printf(" %-3s", (k->consumed_mods & IDEV_KBDMOD_ALT) ? "ALT" : "");
+ printf(" %-5s", (k->consumed_mods & IDEV_KBDMOD_LINUX) ? "LINUX" : "");
+ printf(" %-4s", (k->consumed_mods & IDEV_KBDMOD_CAPS) ? "CAPS" : "");
+
/* Resolved symbols */
printf(" |");
for (i = 0; i < k->n_syms; ++i) {
diff --git a/src/libsystemd-terminal/idev.h b/src/libsystemd-terminal/idev.h
index ea79bb6ab6..c8c03f3d41 100644
--- a/src/libsystemd-terminal/idev.h
+++ b/src/libsystemd-terminal/idev.h
@@ -123,7 +123,7 @@ static inline bool idev_kbdmatch(idev_data_keyboard *kdata,
return false;
real = kdata->mods & ~kdata->consumed_mods & significant;
- if (real != (mods & ~kdata->consumed_mods))
+ if (real != mods)
return false;
return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms));