[gnome-settings-daemon/shell-keygrab: 1/5] Revert "common: Remove Core X key matching"
- From: Florian MÃllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/shell-keygrab: 1/5] Revert "common: Remove Core X key matching"
- Date: Wed, 5 Dec 2012 08:43:16 +0000 (UTC)
commit d0abc49529986e2fb35fd78f798316774e721388
Author: Florian MÃllner <fmuellner gnome org>
Date: Thu Nov 15 16:59:03 2012 +0100
Revert "common: Remove Core X key matching"
As we will start using the Shell's DBus interface for key
grabbing, unfortunately we need to bring back Core X key
matching until mutter is ported to XI2.
This reverts commit 721a962a6df81da9bd2f06b1026a75d989258274.
plugins/common/gsd-keygrab.c | 47 ++++++++++++++++++++++++++++++++++++++++++
plugins/common/gsd-keygrab.h | 2 +
2 files changed, 49 insertions(+), 0 deletions(-)
---
diff --git a/plugins/common/gsd-keygrab.c b/plugins/common/gsd-keygrab.c
index aefc9ba..d2f2575 100644
--- a/plugins/common/gsd-keygrab.c
+++ b/plugins/common/gsd-keygrab.c
@@ -365,6 +365,53 @@ match_xi2_key (Key *key, XIDeviceEvent *event)
&& key_uses_keycode (key, keycode));
}
+gboolean
+match_key (Key *key, XEvent *event)
+{
+ guint keyval;
+ GdkModifierType consumed;
+ gint group;
+
+ if (key == NULL)
+ return FALSE;
+
+ setup_modifiers ();
+
+ if (have_xkb (event->xkey.display))
+ group = XkbGroupForCoreState (event->xkey.state);
+ else
+ group = (event->xkey.state & GDK_KEY_Mode_switch) ? 1 : 0;
+
+ /* Check if we find a keysym that matches our current state */
+ if (gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (), event->xkey.keycode,
+ event->xkey.state, group,
+ &keyval, NULL, NULL, &consumed)) {
+ guint lower, upper;
+ guint mask;
+
+ /* The Key structure contains virtual modifiers, whereas
+ * the XEvent will be using the real modifier, so translate those */
+ mask = key->state;
+ gdk_keymap_map_virtual_modifiers (gdk_keymap_get_default (), &mask);
+
+ gdk_keyval_convert_case (keyval, &lower, &upper);
+
+ /* If we are checking against the lower version of the
+ * keysym, we might need the Shift state for matching,
+ * so remove it from the consumed modifiers */
+ if (lower == key->keysym)
+ consumed &= ~GDK_SHIFT_MASK;
+
+ return ((lower == key->keysym || upper == key->keysym)
+ && (event->xkey.state & ~consumed & gsd_used_mods) == mask);
+ }
+
+ /* The key we passed doesn't have a keysym, so try with just the keycode */
+ return (key != NULL
+ && key->state == (event->xkey.state & gsd_used_mods)
+ && key_uses_keycode (key, event->xkey.keycode));
+}
+
Key *
parse_key (const char *str)
{
diff --git a/plugins/common/gsd-keygrab.h b/plugins/common/gsd-keygrab.h
index 6ec8847..ee542ea 100644
--- a/plugins/common/gsd-keygrab.h
+++ b/plugins/common/gsd-keygrab.h
@@ -47,6 +47,8 @@ void ungrab_key_unsafe (Key *key,
gboolean match_xi2_key (Key *key,
XIDeviceEvent *event);
+gboolean match_key (Key *key,
+ XEvent *event);
gboolean key_uses_keycode (const Key *key,
guint keycode);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]