From fd0c1ff2c8373c9cf76f893b331f383299e6ae38 Mon Sep 17 00:00:00 2001 From: Ben Collerson Date: Thu, 4 Jan 2024 20:30:01 +1000 Subject: [PATCH] warpcursor --- dwl.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dwl.c b/dwl.c index 521b07a6..37ec0b0f 100644 --- a/dwl.c +++ b/dwl.c @@ -350,6 +350,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); @@ -517,6 +518,7 @@ arrange(Monitor *m) m->lt[m->sellt]->arrange(m); motionnotify(0, NULL, 0, 0, 0, 0); checkidleinhibitor(NULL); + warpcursor(c); } void @@ -1314,6 +1316,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); @@ -1659,6 +1665,7 @@ mapnotify(struct wl_listener *listener, void *data) focusclient(c, 1); exclusive_focus = c; } + warpcursor(c); goto unset_fullscreen; } @@ -2921,6 +2928,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