mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
backend/wayland: factor out wlr_wl_seat
This commit is contained in:
parent
df417b7e95
commit
1ac5257357
4 changed files with 88 additions and 48 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue