[PATCH weston 06/31] Do binding modifier lookup on XKB state, not physical keys
Daniel Stone
daniel at fooishbar.org
Wed May 30 08:31:44 PDT 2012
When we update the modifier_state used for Weston bindings, derive this
from the XKB modifier state, rather than a hardcoded mapping of physical
keys to modifier state.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
---
src/compositor.c | 46 ++++++++++++++++++++--------------------------
src/compositor.h | 3 +++
2 files changed, 23 insertions(+), 26 deletions(-)
diff --git a/src/compositor.c b/src/compositor.c
index f4f5962..e310ceb 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1733,13 +1733,16 @@ notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis, int32_t value)
static int
update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
{
- enum weston_keyboard_modifier modifier;
uint32_t mods_depressed, mods_latched, mods_locked, group;
+ uint32_t mods_lookup;
int ret = 0;
+ /* First update the XKB state object with the keypress. */
xkb_state_update_key(seat->xkb_state.state, key + 8,
state ? XKB_KEY_DOWN : XKB_KEY_UP);
+ /* Serialize and update our internal state, checking to see if it's
+ * different to the previous state. */
mods_depressed = xkb_state_serialize_mods(seat->xkb_state.state,
XKB_STATE_DEPRESSED);
mods_latched = xkb_state_serialize_mods(seat->xkb_state.state,
@@ -1760,31 +1763,15 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
seat->xkb_state.mods_locked = mods_locked;
seat->xkb_state.group = group;
- switch (key) {
- case KEY_LEFTCTRL:
- case KEY_RIGHTCTRL:
- modifier = MODIFIER_CTRL;
- break;
-
- case KEY_LEFTALT:
- case KEY_RIGHTALT:
- modifier = MODIFIER_ALT;
- break;
-
- case KEY_LEFTMETA:
- case KEY_RIGHTMETA:
- modifier = MODIFIER_SUPER;
- break;
-
- default:
- modifier = 0;
- break;
- }
-
- if (state)
- seat->modifier_state |= modifier;
- else
- seat->modifier_state &= ~modifier;
+ /* And update the modifier_state for bindings. */
+ mods_lookup = mods_depressed | mods_latched;
+ seat->modifier_state = 0;
+ if ((mods_lookup & seat->compositor->xkb_info.ctrl_mod))
+ seat->modifier_state |= MODIFIER_CTRL;
+ if ((mods_lookup & seat->compositor->xkb_info.alt_mod))
+ seat->modifier_state |= MODIFIER_ALT;
+ if ((mods_lookup & seat->compositor->xkb_info.super_mod))
+ seat->modifier_state |= MODIFIER_SUPER;
return ret;
}
@@ -2245,6 +2232,13 @@ static int weston_compositor_xkb_init(struct weston_compositor *ec,
return -1;
}
+ ec->xkb_info.ctrl_mod = xkb_map_mod_get_index(ec->xkb_info.keymap,
+ XKB_MOD_NAME_CTRL);
+ ec->xkb_info.alt_mod = xkb_map_mod_get_index(ec->xkb_info.keymap,
+ XKB_MOD_NAME_ALT);
+ ec->xkb_info.super_mod = xkb_map_mod_get_index(ec->xkb_info.keymap,
+ XKB_MOD_NAME_LOGO);
+
return 0;
}
diff --git a/src/compositor.h b/src/compositor.h
index 08086f7..57a49de 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -300,6 +300,9 @@ struct weston_compositor {
struct xkb_rule_names names;
struct xkb_context *context;
struct xkb_keymap *keymap;
+ xkb_mod_index_t ctrl_mod;
+ xkb_mod_index_t alt_mod;
+ xkb_mod_index_t super_mod;
} xkb_info;
};
--
1.7.10
More information about the wayland-devel
mailing list