Do binding modifier lookup on XKB state, not physical keys

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@fooishbar.org>
Daniel Stone 13 years ago committed by Kristian Høgsberg
parent 994679a20e
commit e3f15edc2f
  1. 46
      src/compositor.c
  2. 3
      src/compositor.h

@ -1731,13 +1731,16 @@ notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis, int32_t value)
static int static int
update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state) 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_depressed, mods_latched, mods_locked, group;
uint32_t mods_lookup;
int ret = 0; int ret = 0;
/* First update the XKB state object with the keypress. */
xkb_state_update_key(seat->xkb_state.state, key + 8, xkb_state_update_key(seat->xkb_state.state, key + 8,
state ? XKB_KEY_DOWN : XKB_KEY_UP); 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, mods_depressed = xkb_state_serialize_mods(seat->xkb_state.state,
XKB_STATE_DEPRESSED); XKB_STATE_DEPRESSED);
mods_latched = xkb_state_serialize_mods(seat->xkb_state.state, mods_latched = xkb_state_serialize_mods(seat->xkb_state.state,
@ -1758,31 +1761,15 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
seat->xkb_state.mods_locked = mods_locked; seat->xkb_state.mods_locked = mods_locked;
seat->xkb_state.group = group; seat->xkb_state.group = group;
switch (key) { /* And update the modifier_state for bindings. */
case KEY_LEFTCTRL: mods_lookup = mods_depressed | mods_latched;
case KEY_RIGHTCTRL: seat->modifier_state = 0;
modifier = MODIFIER_CTRL; if ((mods_lookup & seat->compositor->xkb_info.ctrl_mod))
break; seat->modifier_state |= MODIFIER_CTRL;
if ((mods_lookup & seat->compositor->xkb_info.alt_mod))
case KEY_LEFTALT: seat->modifier_state |= MODIFIER_ALT;
case KEY_RIGHTALT: if ((mods_lookup & seat->compositor->xkb_info.super_mod))
modifier = MODIFIER_ALT; seat->modifier_state |= MODIFIER_SUPER;
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;
return ret; return ret;
} }
@ -2243,6 +2230,13 @@ static int weston_compositor_xkb_init(struct weston_compositor *ec,
return -1; 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; return 0;
} }

@ -305,6 +305,9 @@ struct weston_compositor {
struct xkb_rule_names names; struct xkb_rule_names names;
struct xkb_context *context; struct xkb_context *context;
struct xkb_keymap *keymap; struct xkb_keymap *keymap;
xkb_mod_index_t ctrl_mod;
xkb_mod_index_t alt_mod;
xkb_mod_index_t super_mod;
} xkb_info; } xkb_info;
}; };

Loading…
Cancel
Save