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>
diff --git a/src/compositor.c b/src/compositor.c
index 0e39ebe..b76cd39 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1731,13 +1731,16 @@
 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,
@@ -1758,31 +1761,15 @@
 	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;
 }
@@ -2243,6 +2230,13 @@
 		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;
 }