diff options
| -rw-r--r-- | dwl.c | 40 | 
1 files changed, 16 insertions, 24 deletions
@@ -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;  		}  	}  | 
