]> git.mdlowis.com Git - proto/labwc.git/commitdiff
seat: implement virtual pointer protocol
authorJoshua Ashton <joshua@froggi.es>
Wed, 17 Aug 2022 18:17:21 +0000 (18:17 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 27 Sep 2022 16:31:00 +0000 (17:31 +0100)
include/labwc.h
src/seat.c

index cedf829dba9a68acba019db6a5dd70df835a62f7..49e49011d23eabf9dd4ff88b0d1f56cd39937485 100644 (file)
@@ -40,6 +40,7 @@
 #include <wlr/types/wlr_xdg_decoration_v1.h>
 #include <wlr/types/wlr_xdg_shell.h>
 #include <wlr/types/wlr_drm_lease_v1.h>
+#include <wlr/types/wlr_virtual_pointer_v1.h>
 #include <wlr/util/log.h>
 #if HAVE_XWAYLAND
 #include <wlr/xwayland.h>
@@ -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;
index 082ed306c3335186223bc381eab2189ef3e4b95a..cdd548e06fc361abcaa44ff4325f5a02c4d6b2cb 100644 (file)
@@ -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");