Update less-simple-touch-input patch based on pointer contstraints being added upstream

This commit is contained in:
Micah N Gorrell 2024-03-26 10:35:19 -06:00
parent 67f16db3df
commit 2a6e98d532

View File

@ -1,18 +1,23 @@
From 81810896c3034d609ed1bf93e1e04641f9ddf818 Mon Sep 17 00:00:00 2001
From adc8734017644f44443db30e976cf03147c7c3c4 Mon Sep 17 00:00:00 2001
From: Micah N Gorrell <m@minego.net>
Date: Fri, 9 Feb 2024 17:08:20 -0700
Subject: [PATCH] Add support for touch screen input devices, and send the
appropriate events to clients
Send notification of touch motition events even if there is no client to focus. This is important for swiping on an OSK.
Add support for touch screen input devices, and send the appropriate events to clients
Removed #ifdef around code that needs pointer constraints now that that is merged to upstream
---
dwl.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 149 insertions(+)
dwl.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 145 insertions(+)
diff --git a/dwl.c b/dwl.c
index fa76db2..6bff6cd 100644
index 5867b0c..fe447fb 100644
--- a/dwl.c
+++ b/dwl.c
@@ -45,6 +45,7 @@
@@ -47,6 +47,7 @@
#include <wlr/types/wlr_session_lock_v1.h>
#include <wlr/types/wlr_single_pixel_buffer_v1.h>
#include <wlr/types/wlr_subcompositor.h>
@ -20,7 +25,7 @@ index fa76db2..6bff6cd 100644
#include <wlr/types/wlr_viewporter.h>
#include <wlr/types/wlr_virtual_keyboard_v1.h>
#include <wlr/types/wlr_virtual_pointer_v1.h>
@@ -158,6 +159,12 @@ typedef struct {
@@ -161,6 +162,12 @@ typedef struct {
struct wl_listener key;
} KeyboardGroup;
@ -33,15 +38,17 @@ index fa76db2..6bff6cd 100644
typedef struct {
/* Must keep these three elements in this order */
unsigned int type; /* LayerShell */
@@ -255,6 +262,7 @@ static void createlocksurface(struct wl_listener *listener, void *data);
static void createmon(struct wl_listener *listener, void *data);
@@ -264,7 +271,9 @@ static void createmon(struct wl_listener *listener, void *data);
static void createnotify(struct wl_listener *listener, void *data);
static void createpointer(struct wlr_pointer *pointer);
static void createpointerconstraint(struct wl_listener *listener, void *data);
+static void createtouch(struct wlr_touch *touch);
static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint);
+static void createtouch(struct wlr_touch *touch);
static void cursorframe(struct wl_listener *listener, void *data);
static void cursorwarptohint(void);
static void destroydecoration(struct wl_listener *listener, void *data);
static void destroydragicon(struct wl_listener *listener, void *data);
@@ -321,6 +329,10 @@ static void togglefloating(const Arg *arg);
@@ -334,6 +343,10 @@ static void togglefloating(const Arg *arg);
static void togglefullscreen(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
@ -52,7 +59,7 @@ index fa76db2..6bff6cd 100644
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);
@@ -387,6 +399,7 @@ static struct wlr_output_layout *output_layout;
@@ -404,6 +417,7 @@ static struct wlr_output_layout *output_layout;
static struct wlr_box sgeom;
static struct wl_list mons;
static Monitor *selmon;
@ -60,8 +67,8 @@ index fa76db2..6bff6cd 100644
#ifdef XWAYLAND
static void activatex11(struct wl_listener *listener, void *data);
@@ -1015,6 +1028,16 @@ createpointer(struct wlr_pointer *pointer)
wlr_cursor_attach_input_device(cursor, &pointer->base);
@@ -1041,6 +1055,16 @@ createpointerconstraint(struct wl_listener *listener, void *data)
&pointer_constraint->destroy, destroypointerconstraint);
}
+void
@ -75,9 +82,9 @@ index fa76db2..6bff6cd 100644
+}
+
void
cursorframe(struct wl_listener *listener, void *data)
cursorconstrain(struct wlr_pointer_constraint_v1 *constraint)
{
@@ -1344,6 +1367,9 @@ inputdevice(struct wl_listener *listener, void *data)
@@ -1412,6 +1436,9 @@ inputdevice(struct wl_listener *listener, void *data)
case WLR_INPUT_DEVICE_POINTER:
createpointer(wlr_pointer_from_input_device(device));
break;
@ -87,7 +94,7 @@ index fa76db2..6bff6cd 100644
default:
/* TODO handle other input device types */
break;
@@ -1356,6 +1382,8 @@ inputdevice(struct wl_listener *listener, void *data)
@@ -1424,6 +1451,8 @@ inputdevice(struct wl_listener *listener, void *data)
caps = WL_SEAT_CAPABILITY_POINTER;
if (!wl_list_empty(&kb_group.wlr_group->devices))
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
@ -96,7 +103,7 @@ index fa76db2..6bff6cd 100644
wlr_seat_set_capabilities(seat, caps);
}
@@ -2325,6 +2353,13 @@ setup(void)
@@ -2431,6 +2460,13 @@ setup(void)
LISTEN_STATIC(&cursor->events.axis, axisnotify);
LISTEN_STATIC(&cursor->events.frame, cursorframe);
@ -110,7 +117,7 @@ index fa76db2..6bff6cd 100644
cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1);
LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape);
@@ -2541,6 +2576,120 @@ toggleview(const Arg *arg)
@@ -2647,6 +2683,115 @@ toggleview(const Arg *arg)
printstatus();
}
@ -153,19 +160,14 @@ index fa76db2..6bff6cd 100644
+ if (serial && wlr_seat_touch_num_points(seat) == 1) {
+ /* Emulate a mouse click if the touch event wasn't handled */
+ struct wlr_pointer_button_event *button_event = data;
+ struct wlr_pointer_motion_absolute_event *motion_event = data;
+ double dx, dy;
+
+#ifdef POINTERCONSTRAINTS
+ struct wlr_pointer_motion_absolute_event *event = data;
+ double lx, ly, dx, dy;
+
+ wlr_cursor_absolute_to_layout_coords(cursor, &event->pointer->base, event->x, event->y, &lx, &ly);
+ wlr_cursor_warp_closest(cursor, &event->pointer->base, lx, ly);
+ wlr_cursor_absolute_to_layout_coords(cursor, &motion_event->pointer->base, motion_event->x, motion_event->y, &lx, &ly);
+ wlr_cursor_warp_closest(cursor, &motion_event->pointer->base, lx, ly);
+ dx = lx - cursor->x;
+ dy = ly - cursor->y;
+ motionnotify(event->time_msec, &event->pointer->base, dx, dy, dx, dy);
+#else
+ motionabsolute(listener, data);
+#endif
+ motionnotify(motion_event->time_msec, &motion_event->pointer->base, dx, dy, dx, dy);
+
+ button_event->button = BTN_LEFT;
+ button_event->state = WLR_BUTTON_PRESSED;
@ -219,10 +221,10 @@ index fa76db2..6bff6cd 100644
+
+ if (c != NULL) {
+ wlr_seat_touch_point_focus(seat, surface, event->time_msec, event->touch_id, sx, sy);
+ wlr_seat_touch_notify_motion(seat, event->time_msec, event->touch_id, sx, sy);
+ } else {
+ wlr_seat_touch_point_clear_focus(seat, event->time_msec, event->touch_id);
+ }
+ wlr_seat_touch_notify_motion(seat, event->time_msec, event->touch_id, sx, sy);
+
+ wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
+}
@ -232,5 +234,5 @@ index fa76db2..6bff6cd 100644
unlocksession(struct wl_listener *listener, void *data)
{
--
2.43.0
2.44.0