So we don't unnecessarily advertise interfaces the seat doesn't support.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
wl_pointer_set_user_data(input->pointer, input);
wl_pointer_add_listener(input->pointer, &pointer_listener,
input);
+ weston_seat_init_pointer((struct weston_seat *) seat);
} else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
wl_pointer_destroy(input->pointer);
input->pointer = NULL;
wl_keyboard_set_user_data(input->keyboard, input);
wl_keyboard_add_listener(input->keyboard, &keyboard_listener,
input);
+ weston_seat_init_keyboard((struct weston_seat *) seat);
} else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) {
wl_keyboard_destroy(input->keyboard);
input->keyboard = NULL;
memset(input, 0, sizeof *input);
weston_seat_init(&input->base, &c->base);
+ weston_seat_init_pointer(&input->base);
+ weston_seat_init_keyboard(&input->base);
c->base.seat = &input->base;
}
WL_EXPORT void
-weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
+weston_seat_init_pointer(struct weston_seat *seat)
{
- wl_seat_init(&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);
+ 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);
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);
}
struct weston_seat {
struct wl_seat seat;
struct wl_pointer pointer;
+ int has_pointer;
struct wl_keyboard keyboard;
+ int has_keyboard;
struct wl_touch touch;
+ int has_touch;
+
struct weston_compositor *compositor;
struct weston_surface *sprite;
struct weston_surface *drag_surface;
void
weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec);
+void
+weston_seat_init_pointer(struct weston_seat *seat);
+void
+weston_seat_init_keyboard(struct weston_seat *seat);
+void
+weston_seat_init_touch(struct weston_seat *seat);
void
weston_seat_release(struct weston_seat *seat);
if (has_abs && !has_key)
return -1;
+ if ((device->caps &
+ (EVDEV_MOTION_ABS | EVDEV_MOTION_REL | EVDEV_BUTTON)))
+ weston_seat_init_pointer(&device->master->base);
+ if ((device->caps & EVDEV_KEYBOARD))
+ weston_seat_init_keyboard(&device->master->base);
+ if ((device->caps & EVDEV_TOUCH))
+ weston_seat_init_touch(&device->master->base);
+
return 0;
}