From 87f8e6687b23e9f6d7c725115f4c0d624cfec736 Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Thu, 30 Apr 2020 12:32:50 -0500 Subject: [PATCH] include border in xytoclient If there isn't an actual surface under the cursor, *surface will be set to NULL, which is safe now that focus functions handle a NULL surface safely. --- dwl.c | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/dwl.c b/dwl.c index ca6c4fd..a37bceb 100644 --- a/dwl.c +++ b/dwl.c @@ -1346,32 +1346,24 @@ Client * xytoclient(double x, double y, struct wlr_surface **surface, double *sx, double *sy) { - /* XXX what if (x,y) is within a window's border? */ - /* This iterates over all of our surfaces and attempts to find one under the - * cursor. This relies on stack being ordered from top-to-bottom. */ + /* Find the topmost visible client (if any) under the cursor, including + * borders. This relies on stack being ordered from top to bottom. */ Client *c; wl_list_for_each(c, &stack, slink) { - /* Skip clients that aren't visible */ - if (!VISIBLEON(c, c->mon)) - continue; - /* - * XDG toplevels may have nested surfaces, such as popup windows - * for context menus or tooltips. This function tests if any of - * those are underneath the coordinates x and y (in layout - * coordinates). If so, it sets the surface pointer to that - * wlr_surface and the sx and sy coordinates to the coordinates - * relative to that surface's top-left corner. - */ - double _sx, _sy; - struct wlr_surface *_surface = NULL; - _surface = wlr_xdg_surface_surface_at(c->xdg_surface, - x - c->geom.x - c->bw, y - c->geom.y - c->bw, - &_sx, &_sy); - - if (_surface) { - *sx = _sx; - *sy = _sy; - *surface = _surface; + if (VISIBLEON(c, c->mon) && wlr_box_contains_point(&c->geom, x, y)) { + /* + * XDG toplevels may have nested surfaces, such as popup windows + * for context menus or tooltips. This function tests if any of + * those are underneath the coordinates x and y (in layout + * coordinates). If so, it sets the surface pointer to that + * wlr_surface and the sx and sy coordinates to the coordinates + * relative to that surface's top-left corner. + */ + /* XXX set *surface to xdg_surface->surface instead of + * NULL? what should sx/sy be in that case? */ + *surface = wlr_xdg_surface_surface_at(c->xdg_surface, + x - c->geom.x - c->bw, y - c->geom.y - c->bw, + sx, sy); return c; } }