summaryrefslogtreecommitdiffstats
path: root/dwl-patches/patches/warpcursor/warpcursor.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dwl-patches/patches/warpcursor/warpcursor.patch')
-rw-r--r--dwl-patches/patches/warpcursor/warpcursor.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/dwl-patches/patches/warpcursor/warpcursor.patch b/dwl-patches/patches/warpcursor/warpcursor.patch
new file mode 100644
index 0000000..6ac0329
--- /dev/null
+++ b/dwl-patches/patches/warpcursor/warpcursor.patch
@@ -0,0 +1,71 @@
+From 4951ccc89dac2b557994b2f6c3aacb2398e2d1b1 Mon Sep 17 00:00:00 2001
+From: Ben Collerson <benc@benc.cc>
+Date: Thu, 4 Jan 2024 20:30:01 +1000
+Subject: [PATCH] warpcursor
+
+---
+ dwl.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/dwl.c b/dwl.c
+index 145fd018..f7ad6c13 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -347,6 +347,7 @@ 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 void warpcursor(const Client *c);
+ 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);
+@@ -514,6 +515,7 @@ arrange(Monitor *m)
+ m->lt[m->sellt]->arrange(m);
+ motionnotify(0, NULL, 0, 0, 0, 0);
+ checkidleinhibitor(NULL);
++ warpcursor(focustop(selmon));
+ }
+
+ void
+@@ -1323,6 +1325,10 @@ focusclient(Client *c, int lift)
+ if (locked)
+ return;
+
++ /* Warp cursor to center of client if it is outside */
++ if (lift)
++ warpcursor(c);
++
+ /* Raise client in stacking order if requested */
+ if (c && lift)
+ wlr_scene_node_raise_to_top(&c->scene->node);
+@@ -2927,6 +2933,27 @@ virtualpointer(struct wl_listener *listener, void *data)
+ wlr_cursor_map_input_to_output(cursor, &pointer.base, event->suggested_output);
+ }
+
++void
++warpcursor(const Client *c) {
++ if (cursor_mode != CurNormal) {
++ return;
++ }
++ if (!c && selmon) {
++ wlr_cursor_warp_closest(cursor,
++ NULL,
++ selmon->w.x + selmon->w.width / 2.0 ,
++ selmon->w.y + selmon->w.height / 2.0);
++ }
++ else if ( c && (cursor->x < c->geom.x ||
++ cursor->x > c->geom.x + c->geom.width ||
++ cursor->y < c->geom.y ||
++ cursor->y > c->geom.y + c->geom.height))
++ wlr_cursor_warp_closest(cursor,
++ NULL,
++ c->geom.x + c->geom.width / 2.0,
++ c->geom.y + c->geom.height / 2.0);
++}
++
+ Monitor *
+ xytomon(double x, double y)
+ {
+--
+2.45.2
+