window: Update modifier state directly after receiving a modifier event

If the keyboard modifier event was received after the key event the
modifier state would end up incorrect.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
diff --git a/clients/window.c b/clients/window.c
index efe164d..5dcd6cb 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -2284,7 +2284,6 @@
 	enum wl_keyboard_key_state state = state_w;
 	const xkb_keysym_t *syms;
 	xkb_keysym_t sym;
-	xkb_mod_mask_t mask;
 	struct itimerspec its;
 
 	input->display->serial = serial;
@@ -2294,17 +2293,6 @@
 
 	num_syms = xkb_key_get_syms(input->xkb.state, code, &syms);
 
-	mask = xkb_state_serialize_mods(input->xkb.state,
-					XKB_STATE_DEPRESSED |
-					XKB_STATE_LATCHED);
-	input->modifiers = 0;
-	if (mask & input->xkb.control_mask)
-		input->modifiers |= MOD_CONTROL_MASK;
-	if (mask & input->xkb.alt_mask)
-		input->modifiers |= MOD_ALT_MASK;
-	if (mask & input->xkb.shift_mask)
-		input->modifiers |= MOD_SHIFT_MASK;
-
 	sym = XKB_KEY_NoSymbol;
 	if (num_syms == 1)
 		sym = syms[0];
@@ -2356,9 +2344,20 @@
 			  uint32_t group)
 {
 	struct input *input = data;
+	xkb_mod_mask_t mask;
 
 	xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched,
 			      mods_locked, 0, 0, group);
+	mask = xkb_state_serialize_mods(input->xkb.state,
+					XKB_STATE_DEPRESSED |
+					XKB_STATE_LATCHED);
+	input->modifiers = 0;
+	if (mask & input->xkb.control_mask)
+		input->modifiers |= MOD_CONTROL_MASK;
+	if (mask & input->xkb.alt_mask)
+		input->modifiers |= MOD_ALT_MASK;
+	if (mask & input->xkb.shift_mask)
+		input->modifiers |= MOD_SHIFT_MASK;
 }
 
 static const struct wl_keyboard_listener keyboard_listener = {