aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2020-04-30 12:32:50 -0500
committerDevin J. Pohly <djpohly@gmail.com>2020-04-30 12:32:57 -0500
commit87f8e6687b23e9f6d7c725115f4c0d624cfec736 (patch)
treeca5d7468f2256de6b802b1a0057b23d587961cae
parent2c134faa406627a3c8ca935ac4e5c502b4d4d01e (diff)
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.
-rw-r--r--dwl.c40
1 files 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;
}
}