backend/wayland: factor out wlr_wl_seat

This commit is contained in:
Mykola Orliuk 2020-10-03 17:34:32 +02:00 committed by Simon Ser
parent df417b7e95
commit 1ac5257357
4 changed files with 88 additions and 48 deletions

View File

@ -103,9 +103,9 @@ static void registry_global(void *data, struct wl_registry *registry,
wl->compositor = wl_registry_bind(registry, name, wl->compositor = wl_registry_bind(registry, name,
&wl_compositor_interface, 4); &wl_compositor_interface, 4);
} else if (strcmp(iface, wl_seat_interface.name) == 0) { } else if (strcmp(iface, wl_seat_interface.name) == 0) {
wl->seat = wl_registry_bind(registry, name, struct wl_seat *wl_seat = wl_registry_bind(registry, name,
&wl_seat_interface, 5); &wl_seat_interface, 5);
wl_seat_add_listener(wl->seat, &seat_listener, wl); create_wl_seat(wl_seat, wl);
} else if (strcmp(iface, xdg_wm_base_interface.name) == 0) { } else if (strcmp(iface, xdg_wm_base_interface.name) == 0) {
wl->xdg_wm_base = wl_registry_bind(registry, name, wl->xdg_wm_base = wl_registry_bind(registry, name,
&xdg_wm_base_interface, 1); &xdg_wm_base_interface, 1);
@ -155,13 +155,16 @@ static bool backend_start(struct wlr_backend *backend) {
wl->started = true; wl->started = true;
if (wl->keyboard) { struct wlr_wl_seat *seat = wl->seat;
create_wl_keyboard(wl->keyboard, wl); if (seat != NULL) {
if (seat->keyboard) {
create_wl_keyboard(seat->keyboard, wl);
} }
if (wl->tablet_manager && wl->seat) { if (wl->tablet_manager) {
wl_add_tablet_seat(wl->tablet_manager, wl_add_tablet_seat(wl->tablet_manager,
wl->seat, wl); seat->wl_seat, wl);
}
} }
for (size_t i = 0; i < wl->requested_outputs; ++i) { for (size_t i = 0; i < wl->requested_outputs; ++i) {
@ -192,8 +195,6 @@ static void backend_destroy(struct wlr_backend *backend) {
wl_list_remove(&wl->local_display_destroy.link); wl_list_remove(&wl->local_display_destroy.link);
free(wl->seat_name);
wl_event_source_remove(wl->remote_display_src); wl_event_source_remove(wl->remote_display_src);
wlr_renderer_destroy(wl->renderer); wlr_renderer_destroy(wl->renderer);
@ -201,12 +202,7 @@ static void backend_destroy(struct wlr_backend *backend) {
wlr_drm_format_set_finish(&wl->linux_dmabuf_v1_formats); wlr_drm_format_set_finish(&wl->linux_dmabuf_v1_formats);
if (wl->pointer) { destroy_wl_seats(wl);
wl_pointer_destroy(wl->pointer);
}
if (wl->seat) {
wl_seat_destroy(wl->seat);
}
if (wl->zxdg_decoration_manager_v1) { if (wl->zxdg_decoration_manager_v1) {
zxdg_decoration_manager_v1_destroy(wl->zxdg_decoration_manager_v1); zxdg_decoration_manager_v1_destroy(wl->zxdg_decoration_manager_v1);
} }

View File

@ -586,8 +586,11 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *wlr_backend) {
wlr_signal_emit_safe(&backend->backend.events.new_output, wlr_output); wlr_signal_emit_safe(&backend->backend.events.new_output, wlr_output);
if (backend->pointer != NULL) { struct wlr_wl_seat *seat = backend->seat;
create_wl_pointer(backend->pointer, output); if (seat != NULL) {
if (seat->pointer) {
create_wl_pointer(seat->pointer, output);
}
} }
return wlr_output; return wlr_output;

View File

@ -372,12 +372,49 @@ static struct wlr_wl_input_device *get_wl_input_device_from_input_device(
return (struct wlr_wl_input_device *)wlr_dev; return (struct wlr_wl_input_device *)wlr_dev;
} }
void create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl) {
assert(!wl->seat); // only one seat supported at the moment
struct wlr_wl_seat *seat = calloc(1, sizeof(struct wlr_wl_seat));
seat->wl_seat = wl_seat;
wl->seat = seat;
wl_seat_add_listener(wl_seat, &seat_listener, wl);
}
void destroy_wl_seats(struct wlr_wl_backend *wl) {
struct wlr_wl_seat *seat = wl->seat;
if (!seat) {
return;
}
if (seat->pointer) {
wl_pointer_destroy(seat->pointer);
}
free(seat->name);
if (seat->wl_seat) {
wl_seat_destroy(seat->wl_seat);
}
free(seat);
}
static struct wlr_wl_seat *backend_get_seat(struct wlr_wl_backend *backend, struct wl_seat *wl_seat) {
assert(backend->seat && backend->seat->wl_seat == wl_seat);
return backend->seat;
}
static struct wlr_wl_seat *input_device_get_seat(struct wlr_input_device *wlr_dev) {
struct wlr_wl_input_device *dev =
get_wl_input_device_from_input_device(wlr_dev);
assert(dev->backend->seat);
return dev->backend->seat;
}
static void input_device_destroy(struct wlr_input_device *wlr_dev) { static void input_device_destroy(struct wlr_input_device *wlr_dev) {
struct wlr_wl_input_device *dev = struct wlr_wl_input_device *dev =
get_wl_input_device_from_input_device(wlr_dev); get_wl_input_device_from_input_device(wlr_dev);
if (dev->wlr_input_device.type == WLR_INPUT_DEVICE_KEYBOARD) { if (dev->wlr_input_device.type == WLR_INPUT_DEVICE_KEYBOARD) {
wl_keyboard_release(dev->backend->keyboard); struct wlr_wl_seat *seat = input_device_get_seat(wlr_dev);
dev->backend->keyboard = NULL; wl_keyboard_release(seat->keyboard);
seat->keyboard = NULL;
} }
wl_list_remove(&dev->wlr_input_device.link); wl_list_remove(&dev->wlr_input_device.link);
free(dev); free(dev);
@ -678,20 +715,20 @@ void create_wl_touch(struct wl_touch *wl_touch, struct wlr_wl_backend *wl) {
static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat, static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
enum wl_seat_capability caps) { enum wl_seat_capability caps) {
struct wlr_wl_backend *backend = data; struct wlr_wl_backend *backend = data;
assert(backend->seat == wl_seat); struct wlr_wl_seat *seat = backend_get_seat(backend, wl_seat);
if ((caps & WL_SEAT_CAPABILITY_POINTER) && backend->pointer == NULL) { if ((caps & WL_SEAT_CAPABILITY_POINTER) && seat->pointer == NULL) {
wlr_log(WLR_DEBUG, "seat %p offered pointer", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p offered pointer", (void *)wl_seat);
struct wl_pointer *wl_pointer = wl_seat_get_pointer(wl_seat); struct wl_pointer *wl_pointer = wl_seat_get_pointer(wl_seat);
backend->pointer = wl_pointer; seat->pointer = wl_pointer;
struct wlr_wl_output *output; struct wlr_wl_output *output;
wl_list_for_each(output, &backend->outputs, link) { wl_list_for_each(output, &backend->outputs, link) {
create_wl_pointer(wl_pointer, output); create_wl_pointer(wl_pointer, output);
} }
} }
if (!(caps & WL_SEAT_CAPABILITY_POINTER) && backend->pointer != NULL) { if (!(caps & WL_SEAT_CAPABILITY_POINTER) && seat->pointer != NULL) {
wlr_log(WLR_DEBUG, "seat %p dropped pointer", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p dropped pointer", (void *)wl_seat);
struct wlr_input_device *device, *tmp; struct wlr_input_device *device, *tmp;
@ -701,21 +738,21 @@ static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
} }
} }
wl_pointer_release(backend->pointer); wl_pointer_release(seat->pointer);
backend->pointer = NULL; seat->pointer = NULL;
} }
if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && backend->keyboard == NULL) { if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && seat->keyboard == NULL) {
wlr_log(WLR_DEBUG, "seat %p offered keyboard", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p offered keyboard", (void *)wl_seat);
struct wl_keyboard *wl_keyboard = wl_seat_get_keyboard(wl_seat); struct wl_keyboard *wl_keyboard = wl_seat_get_keyboard(wl_seat);
backend->keyboard = wl_keyboard; seat->keyboard = wl_keyboard;
if (backend->started) { if (backend->started) {
create_wl_keyboard(wl_keyboard, backend); create_wl_keyboard(wl_keyboard, backend);
} }
} }
if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && backend->keyboard != NULL) { if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && seat->keyboard != NULL) {
wlr_log(WLR_DEBUG, "seat %p dropped keyboard", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p dropped keyboard", (void *)wl_seat);
struct wlr_input_device *device, *tmp; struct wlr_input_device *device, *tmp;
@ -724,18 +761,18 @@ static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
wlr_input_device_destroy(device); wlr_input_device_destroy(device);
} }
} }
assert(backend->keyboard == NULL); // free'ed by input_device_destroy assert(seat->keyboard == NULL); // free'ed by input_device_destroy
} }
if ((caps & WL_SEAT_CAPABILITY_TOUCH) && backend->touch == NULL) { if ((caps & WL_SEAT_CAPABILITY_TOUCH) && seat->touch == NULL) {
wlr_log(WLR_DEBUG, "seat %p offered touch", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p offered touch", (void *)wl_seat);
backend->touch = wl_seat_get_touch(wl_seat); seat->touch = wl_seat_get_touch(wl_seat);
if (backend->started) { if (backend->started) {
create_wl_touch(backend->touch, backend); create_wl_touch(seat->touch, backend);
} }
} }
if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && backend->touch != NULL) { if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && seat->touch != NULL) {
wlr_log(WLR_DEBUG, "seat %p dropped touch", (void *)wl_seat); wlr_log(WLR_DEBUG, "seat %p dropped touch", (void *)wl_seat);
struct wlr_input_device *device, *tmp; struct wlr_input_device *device, *tmp;
@ -745,18 +782,17 @@ static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
} }
} }
wl_touch_release(backend->touch); wl_touch_release(seat->touch);
backend->touch = NULL; seat->touch = NULL;
} }
} }
static void seat_handle_name(void *data, struct wl_seat *wl_seat, static void seat_handle_name(void *data, struct wl_seat *wl_seat,
const char *name) { const char *name) {
struct wlr_wl_backend *backend = data; struct wlr_wl_backend *backend = data;
assert(backend->seat == wl_seat); struct wlr_wl_seat *seat = backend_get_seat(backend, wl_seat);
// Do we need to check if seatName was previously set for name change? free(seat->name);
free(backend->seat_name); seat->name = strdup(name);
backend->seat_name = strdup(name);
} }
const struct wl_seat_listener seat_listener = { const struct wl_seat_listener seat_listener = {
@ -765,7 +801,5 @@ const struct wl_seat_listener seat_listener = {
}; };
struct wl_seat *wlr_wl_input_device_get_seat(struct wlr_input_device *wlr_dev) { struct wl_seat *wlr_wl_input_device_get_seat(struct wlr_input_device *wlr_dev) {
struct wlr_wl_input_device *dev = return input_device_get_seat(wlr_dev)->wl_seat;
get_wl_input_device_from_input_device(wlr_dev);
return dev->backend->seat;
} }

View File

@ -38,13 +38,9 @@ struct wlr_wl_backend {
struct wp_presentation *presentation; struct wp_presentation *presentation;
struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf_v1; struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf_v1;
struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1; struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1;
struct wl_seat *seat; struct wlr_wl_seat *seat;
struct wl_touch *touch;
struct wl_pointer *pointer;
struct wl_keyboard *keyboard;
struct wlr_wl_pointer *current_pointer; struct wlr_wl_pointer *current_pointer;
struct zwp_tablet_manager_v2 *tablet_manager; struct zwp_tablet_manager_v2 *tablet_manager;
char *seat_name;
struct wlr_drm_format_set linux_dmabuf_v1_formats; struct wlr_drm_format_set linux_dmabuf_v1_formats;
}; };
@ -108,6 +104,15 @@ struct wlr_wl_pointer {
struct wl_listener output_destroy; struct wl_listener output_destroy;
}; };
struct wlr_wl_seat {
struct wl_seat *wl_seat;
char *name;
struct wl_touch *touch;
struct wl_pointer *pointer;
struct wl_keyboard *keyboard;
};
struct wlr_wl_backend *get_wl_backend_from_backend(struct wlr_backend *backend); struct wlr_wl_backend *get_wl_backend_from_backend(struct wlr_backend *backend);
void update_wl_output_cursor(struct wlr_wl_output *output); void update_wl_output_cursor(struct wlr_wl_output *output);
struct wlr_wl_pointer *pointer_get_wl(struct wlr_pointer *wlr_pointer); struct wlr_wl_pointer *pointer_get_wl(struct wlr_pointer *wlr_pointer);
@ -116,6 +121,8 @@ void create_wl_keyboard(struct wl_keyboard *wl_keyboard, struct wlr_wl_backend *
void create_wl_touch(struct wl_touch *wl_touch, struct wlr_wl_backend *wl); void create_wl_touch(struct wl_touch *wl_touch, struct wlr_wl_backend *wl);
struct wlr_wl_input_device *create_wl_input_device( struct wlr_wl_input_device *create_wl_input_device(
struct wlr_wl_backend *backend, enum wlr_input_device_type type); struct wlr_wl_backend *backend, enum wlr_input_device_type type);
void create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl);
void destroy_wl_seats(struct wlr_wl_backend *wl);
extern const struct wl_seat_listener seat_listener; extern const struct wl_seat_listener seat_listener;