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 <[email protected]> --- 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 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
