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.
This commit is contained in:
parent
2c134faa40
commit
87f8e6687b
1 changed files with 16 additions and 24 deletions
40
dwl.c
40
dwl.c
|
@ -1346,32 +1346,24 @@ Client *
|
||||||
xytoclient(double x, double y,
|
xytoclient(double x, double y,
|
||||||
struct wlr_surface **surface, double *sx, double *sy)
|
struct wlr_surface **surface, double *sx, double *sy)
|
||||||
{
|
{
|
||||||
/* XXX what if (x,y) is within a window's border? */
|
/* Find the topmost visible client (if any) under the cursor, including
|
||||||
/* This iterates over all of our surfaces and attempts to find one under the
|
* borders. This relies on stack being ordered from top to bottom. */
|
||||||
* cursor. This relies on stack being ordered from top-to-bottom. */
|
|
||||||
Client *c;
|
Client *c;
|
||||||
wl_list_for_each(c, &stack, slink) {
|
wl_list_for_each(c, &stack, slink) {
|
||||||
/* Skip clients that aren't visible */
|
if (VISIBLEON(c, c->mon) && wlr_box_contains_point(&c->geom, x, y)) {
|
||||||
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
|
||||||
* XDG toplevels may have nested surfaces, such as popup windows
|
* those are underneath the coordinates x and y (in layout
|
||||||
* for context menus or tooltips. This function tests if any of
|
* coordinates). If so, it sets the surface pointer to that
|
||||||
* those are underneath the coordinates x and y (in layout
|
* wlr_surface and the sx and sy coordinates to the coordinates
|
||||||
* coordinates). If so, it sets the surface pointer to that
|
* relative to that surface's top-left corner.
|
||||||
* 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? */
|
||||||
double _sx, _sy;
|
*surface = wlr_xdg_surface_surface_at(c->xdg_surface,
|
||||||
struct wlr_surface *_surface = NULL;
|
x - c->geom.x - c->bw, y - c->geom.y - c->bw,
|
||||||
_surface = wlr_xdg_surface_surface_at(c->xdg_surface,
|
sx, sy);
|
||||||
x - c->geom.x - c->bw, y - c->geom.y - c->bw,
|
|
||||||
&_sx, &_sy);
|
|
||||||
|
|
||||||
if (_surface) {
|
|
||||||
*sx = _sx;
|
|
||||||
*sy = _sy;
|
|
||||||
*surface = _surface;
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue