From 61db11dbbd1c9326084caf12d316264c47728391 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 cf62f60f..7c1b01a0 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #if HAVE_XWAYLAND #include @@ -145,6 +146,9 @@ struct seat { struct wl_listener destroy_drag; struct wl_listener constraint_commit; struct wl_listener idle_inhibitor_create; + + 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 228cf094..896bcd55 100644 --- a/src/seat.c +++ b/src/seat.c @@ -289,6 +289,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) { @@ -313,6 +334,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");