From 273b280f469f5be3455f98f4230b169cc9ee67f2 Mon Sep 17 00:00:00 2001 From: Andri Yngvason Date: Wed, 5 Feb 2020 21:50:03 +0000 Subject: [PATCH] virtual-pointer: Add request for mapping to specific output --- include/wlr/types/wlr_virtual_pointer_v1.h | 2 ++ protocol/wlr-virtual-pointer-unstable-v1.xml | 17 +++++++++++++++-- types/wlr_virtual_pointer_v1.c | 19 ++++++++++++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/include/wlr/types/wlr_virtual_pointer_v1.h b/include/wlr/types/wlr_virtual_pointer_v1.h index 7d2d80d9..ede9bebf 100644 --- a/include/wlr/types/wlr_virtual_pointer_v1.h +++ b/include/wlr/types/wlr_virtual_pointer_v1.h @@ -13,6 +13,7 @@ #include #include #include +#include struct wlr_virtual_pointer_manager_v1 { struct wl_global *global; @@ -45,6 +46,7 @@ struct wlr_virtual_pointer_v1_new_pointer_event { struct wlr_virtual_pointer_v1 *new_pointer; /** Suggested by client; may be NULL. */ struct wlr_seat *suggested_seat; + struct wlr_output *suggested_output; }; struct wlr_virtual_pointer_manager_v1* wlr_virtual_pointer_manager_v1_create( diff --git a/protocol/wlr-virtual-pointer-unstable-v1.xml b/protocol/wlr-virtual-pointer-unstable-v1.xml index e21b4d71..ea243e7c 100644 --- a/protocol/wlr-virtual-pointer-unstable-v1.xml +++ b/protocol/wlr-virtual-pointer-unstable-v1.xml @@ -23,7 +23,7 @@ DEALINGS IN THE SOFTWARE. - + This protocol allows clients to emulate a physical pointer device. The requests are mostly mirror opposites of those specified in wl_pointer. @@ -118,7 +118,7 @@ - + This object allows clients to create individual virtual pointer objects. @@ -135,5 +135,18 @@ + + + + + Creates a new virtual pointer. The seat and the output arguments are + optional. If the seat argument is set, the compositor should assign the + input device to the requested seat. If the output argument is set, the + compositor should map the input device to the requested output. + + + + + diff --git a/types/wlr_virtual_pointer_v1.c b/types/wlr_virtual_pointer_v1.c index 8483ae9b..aed3647b 100644 --- a/types/wlr_virtual_pointer_v1.c +++ b/types/wlr_virtual_pointer_v1.c @@ -233,9 +233,10 @@ static struct wlr_virtual_pointer_manager_v1 *manager_from_resource( return wl_resource_get_user_data(resource); } -static void virtual_pointer_manager_create_virtual_pointer( +static void virtual_pointer_manager_create_virtual_pointer_with_output( struct wl_client *client, struct wl_resource *resource, - struct wl_resource *seat, uint32_t id) { + struct wl_resource *seat, struct wl_resource *output, + uint32_t id) { struct wlr_virtual_pointer_manager_v1 *manager = manager_from_resource(resource); struct wlr_virtual_pointer_v1 *virtual_pointer = calloc(1, @@ -281,6 +282,11 @@ static void virtual_pointer_manager_create_virtual_pointer( event.suggested_seat = seat_client->seat; } + if (output) { + struct wlr_output *wlr_output = wlr_output_from_resource(output); + event.suggested_output = wlr_output; + } + virtual_pointer->input_device.pointer = pointer; virtual_pointer->resource = pointer_resource; wl_signal_init(&virtual_pointer->events.destroy); @@ -289,6 +295,12 @@ static void virtual_pointer_manager_create_virtual_pointer( wlr_signal_emit_safe(&manager->events.new_virtual_pointer, &event); } +static void virtual_pointer_manager_create_virtual_pointer( + struct wl_client *client, struct wl_resource *resource, + struct wl_resource *seat, uint32_t id) { + virtual_pointer_manager_create_virtual_pointer_with_output(client, + resource, seat, NULL, id); +} static void virtual_pointer_manager_destroy(struct wl_client *client, struct wl_resource *resource) { wl_resource_destroy(resource); @@ -296,6 +308,7 @@ static void virtual_pointer_manager_destroy(struct wl_client *client, static const struct zwlr_virtual_pointer_manager_v1_interface manager_impl = { .create_virtual_pointer = virtual_pointer_manager_create_virtual_pointer, + .create_virtual_pointer_with_output = virtual_pointer_manager_create_virtual_pointer_with_output, .destroy = virtual_pointer_manager_destroy, }; @@ -341,7 +354,7 @@ struct wlr_virtual_pointer_manager_v1* wlr_virtual_pointer_manager_v1_create( wl_signal_init(&manager->events.new_virtual_pointer); wl_signal_init(&manager->events.destroy); manager->global = wl_global_create(display, - &zwlr_virtual_pointer_manager_v1_interface, 1, manager, + &zwlr_virtual_pointer_manager_v1_interface, 2, manager, virtual_pointer_manager_bind); if (!manager->global) { free(manager);