diff options
Diffstat (limited to 'dwl-patches/patches/virtual-pointer/virtual-pointer.patch')
-rw-r--r-- | dwl-patches/patches/virtual-pointer/virtual-pointer.patch | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/dwl-patches/patches/virtual-pointer/virtual-pointer.patch b/dwl-patches/patches/virtual-pointer/virtual-pointer.patch new file mode 100644 index 0000000..e0a1803 --- /dev/null +++ b/dwl-patches/patches/virtual-pointer/virtual-pointer.patch @@ -0,0 +1,126 @@ +From 4ab53a41256c8f2eac4c003c43b798b6aa312919 Mon Sep 17 00:00:00 2001 +From: wochap <gean.marroquin@gmail.com> +Date: Mon, 8 Apr 2024 11:39:18 -0500 +Subject: [PATCH] implement virtual-pointer + +--- + dwl.c | 49 +++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 39 insertions(+), 10 deletions(-) + +diff --git a/dwl.c b/dwl.c +index ef27a1d..20840cd 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -46,6 +46,7 @@ + #include <wlr/types/wlr_subcompositor.h> + #include <wlr/types/wlr_viewporter.h> + #include <wlr/types/wlr_virtual_keyboard_v1.h> ++#include <wlr/types/wlr_virtual_pointer_v1.h> + #include <wlr/types/wlr_xcursor_manager.h> + #include <wlr/types/wlr_xdg_activation_v1.h> + #include <wlr/types/wlr_xdg_decoration_v1.h> +@@ -318,11 +319,13 @@ static void toggleview(const Arg *arg); + static void unlocksession(struct wl_listener *listener, void *data); + static void unmaplayersurfacenotify(struct wl_listener *listener, void *data); + static void unmapnotify(struct wl_listener *listener, void *data); ++static void updatecapabilities(void); + static void updatemons(struct wl_listener *listener, void *data); + static void updatetitle(struct wl_listener *listener, void *data); + static void urgent(struct wl_listener *listener, void *data); + static void view(const Arg *arg); + static void virtualkeyboard(struct wl_listener *listener, void *data); ++static void virtualpointer(struct wl_listener *listener, void *data); + static Monitor *xytomon(double x, double y); + static void xytonode(double x, double y, struct wlr_surface **psurface, + Client **pc, LayerSurface **pl, double *nx, double *ny); +@@ -357,6 +360,7 @@ static struct wlr_output_manager_v1 *output_mgr; + static struct wlr_gamma_control_manager_v1 *gamma_control_mgr; + static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr; + static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr; ++static struct wlr_virtual_pointer_manager_v1 *virtual_pointer_mgr; + + static struct wlr_cursor *cursor; + static struct wlr_xcursor_manager *cursor_mgr; +@@ -1338,7 +1342,6 @@ inputdevice(struct wl_listener *listener, void *data) + /* This event is raised by the backend when a new input device becomes + * available. */ + struct wlr_input_device *device = data; +- uint32_t caps; + + switch (device->type) { + case WLR_INPUT_DEVICE_KEYBOARD: +@@ -1351,15 +1354,8 @@ inputdevice(struct wl_listener *listener, void *data) + /* TODO handle other input device types */ + break; + } +- +- /* We need to let the wlr_seat know what our capabilities are, which is +- * communiciated to the client. In dwl we always have a cursor, even if +- * there are no pointer devices, so we always include that capability. */ +- /* TODO do we actually require a cursor? */ +- caps = WL_SEAT_CAPABILITY_POINTER; +- if (!wl_list_empty(&keyboards)) +- caps |= WL_SEAT_CAPABILITY_KEYBOARD; +- wlr_seat_set_capabilities(seat, caps); ++ ++ updatecapabilities(); + } + + int +@@ -2331,6 +2327,8 @@ setup(void) + LISTEN_STATIC(&backend->events.new_input, inputdevice); + virtual_keyboard_mgr = wlr_virtual_keyboard_manager_v1_create(dpy); + LISTEN_STATIC(&virtual_keyboard_mgr->events.new_virtual_keyboard, virtualkeyboard); ++ virtual_pointer_mgr = wlr_virtual_pointer_manager_v1_create(dpy); ++ LISTEN_STATIC(&virtual_pointer_mgr->events.new_virtual_pointer, virtualpointer); + seat = wlr_seat_create(dpy, "seat0"); + LISTEN_STATIC(&seat->events.request_set_cursor, setcursor); + LISTEN_STATIC(&seat->events.request_set_selection, setsel); +@@ -2536,6 +2534,21 @@ unmapnotify(struct wl_listener *listener, void *data) + motionnotify(0); + } + ++void ++updatecapabilities(void) ++{ ++ uint32_t caps; ++ ++ /* We need to let the wlr_seat know what our capabilities are, which is ++ * communicated to the client. In dwl we always have a cursor, even if ++ * there are no pointer devices, so we always include that capability. */ ++ /* TODO do we actually require a cursor? */ ++ caps = WL_SEAT_CAPABILITY_POINTER; ++ if (!wl_list_empty(&keyboards)) ++ caps |= WL_SEAT_CAPABILITY_KEYBOARD; ++ wlr_seat_set_capabilities(seat, caps); ++} ++ + void + updatemons(struct wl_listener *listener, void *data) + { +@@ -2674,6 +2687,22 @@ virtualkeyboard(struct wl_listener *listener, void *data) + { + struct wlr_virtual_keyboard_v1 *keyboard = data; + createkeyboard(&keyboard->keyboard); ++ updatecapabilities(); ++} ++ ++void ++virtualpointer(struct wl_listener *listener, void *data) ++{ ++ 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; ++ createpointer(&pointer->pointer); ++ updatecapabilities(); ++ ++ if (event->suggested_output) { ++ wlr_cursor_map_input_to_output(cursor, device, ++ event->suggested_output); ++ } + } + + Monitor * +-- +2.43.2 + |