Split weston_seat_init up into pointer/keyboard/touch

So we don't unnecessarily advertise interfaces the seat doesn't support.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
diff --git a/src/compositor.c b/src/compositor.c
index e7ae968..573f765 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2279,15 +2279,48 @@
 }
 
 WL_EXPORT void
+weston_seat_init_pointer(struct weston_seat *seat)
+{
+	if (seat->has_pointer)
+		return;
+
+	wl_pointer_init(&seat->pointer);
+	wl_seat_set_pointer(&seat->seat, &seat->pointer);
+
+	seat->has_pointer = 1;
+}
+
+WL_EXPORT void
+weston_seat_init_keyboard(struct weston_seat *seat)
+{
+	if (seat->has_keyboard)
+		return;
+
+	wl_keyboard_init(&seat->keyboard);
+	wl_seat_set_keyboard(&seat->seat, &seat->keyboard);
+
+	seat->has_keyboard = 1;
+}
+
+WL_EXPORT void
+weston_seat_init_touch(struct weston_seat *seat)
+{
+	if (seat->has_touch)
+		return;
+
+	wl_touch_init(&seat->touch);
+	wl_seat_set_touch(&seat->seat, &seat->touch);
+
+	seat->has_touch = 1;
+}
+
+WL_EXPORT void
 weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
 {
 	wl_seat_init(&seat->seat);
-	wl_pointer_init(&seat->pointer);
-	wl_seat_set_pointer(&seat->seat, &seat->pointer);
-	wl_keyboard_init(&seat->keyboard);
-	wl_seat_set_keyboard(&seat->seat, &seat->keyboard);
-	wl_touch_init(&seat->touch);
-	wl_seat_set_touch(&seat->seat, &seat->touch);
+	seat->has_pointer = 0;
+	seat->has_keyboard = 0;
+	seat->has_touch = 0;
 
 	wl_display_add_global(ec->wl_display, &wl_seat_interface, seat,
 			      bind_seat);
@@ -2334,7 +2367,8 @@
 	if (seat->sprite)
 		destroy_surface(&seat->sprite->surface.resource);
 
-	xkb_state_unref(seat->xkb_state.state);
+	if (seat->xkb_state.state != NULL)
+		xkb_state_unref(seat->xkb_state.state);
 
 	wl_seat_release(&seat->seat);
 }