From 4b8d0ba4b295973a6639dfa5b9082174ff485bc5 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 17 Aug 2022 18:17:21 +0000 Subject: [PATCH] seat: implement virtual pointer protocol --- include/labwc.h | 4 ++++ src/seat.c | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/labwc.h b/include/labwc.h index cedf829d..49e49011 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #if HAVE_XWAYLAND #include @@ -156,6 +157,9 @@ struct seat { struct wl_listener constraint_commit; struct wl_listener idle_inhibitor_create; struct wl_listener pressed_surface_destroy; + + struct wlr_virtual_pointer_manager_v1 *virtual_pointer; + struct wl_listener virtual_pointer_new; }; struct lab_data_buffer; diff --git a/src/seat.c b/src/seat.c index 082ed306..cdd548e0 100644 --- a/src/seat.c +++ b/src/seat.c @@ -286,6 +286,27 @@ new_idle_inhibitor(struct wl_listener *listener, void *data) wlr_idle_set_enabled(seat->wlr_idle, seat->seat, 0); } +static void +new_virtual_pointer(struct wl_listener *listener, void *data) +{ + struct seat *seat = wl_container_of(listener, seat, virtual_pointer_new); + struct wlr_virtual_pointer_v1_new_pointer_event *event = data; + struct wlr_virtual_pointer_v1 *pointer = event->new_pointer; + struct wlr_input_device *device = &pointer->pointer.base; + struct input *input = calloc(1, sizeof(struct input)); + + device->data = input; + input->wlr_input_device = device; + + seat_add_device(seat, input); + new_pointer(seat, input); + + if (event->suggested_output) { + wlr_cursor_map_input_to_output(seat->cursor, device, + event->suggested_output); + } +} + void seat_init(struct server *server) { @@ -310,6 +331,12 @@ seat_init(struct server *server) &seat->idle_inhibitor_create); seat->idle_inhibitor_create.notify = new_idle_inhibitor; + seat->virtual_pointer = wlr_virtual_pointer_manager_v1_create( + server->wl_display); + wl_signal_add(&seat->virtual_pointer->events.new_virtual_pointer, + &seat->virtual_pointer_new); + seat->virtual_pointer_new.notify = new_virtual_pointer; + seat->cursor = wlr_cursor_create(); if (!seat->cursor) { wlr_log(WLR_ERROR, "unable to create cursor"); -- 2.52.0