Support wl_keyboard::modifiers event

This event lets the compositor inform clients of the canonical keyboard
modifier/group state.  Make sure we send it at appropriate moments from
the compositor, and listen for it in clients as well.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
diff --git a/clients/window.c b/clients/window.c
index ae8792e..012260d 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1831,11 +1831,9 @@
 		window->send_cursor_position = 1;
 
 	num_syms = xkb_key_get_syms(d->xkb.state, code, &syms);
-	xkb_state_update_key(d->xkb.state, code,
-			     state ? XKB_KEY_DOWN : XKB_KEY_UP);
 
-	mask = xkb_state_serialize_mods(d->xkb.state, 
-					XKB_STATE_DEPRESSED | 
+	mask = xkb_state_serialize_mods(d->xkb.state,
+					XKB_STATE_DEPRESSED |
 					XKB_STATE_LATCHED);
 	input->modifiers = 0;
 	if (mask & input->display->xkb.control_mask)
@@ -1862,6 +1860,23 @@
 }
 
 static void
+keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
+			  uint32_t serial, uint32_t mods_depressed,
+			  uint32_t mods_latched, uint32_t mods_locked,
+			  uint32_t group)
+{
+	struct input *input = data;
+
+	xkb_state_update_mask(input->display->xkb.state,
+			      mods_depressed,
+			      mods_latched,
+			      mods_locked,
+			      0,
+			      0,
+			      group);
+}
+
+static void
 input_remove_pointer_focus(struct input *input)
 {
 	struct window *window = input->pointer_focus;
@@ -1977,6 +1992,7 @@
 	keyboard_handle_enter,
 	keyboard_handle_leave,
 	keyboard_handle_key,
+	keyboard_handle_modifiers,
 };
 
 static void