diff options
| -rw-r--r-- | sway/tree/container.c | 23 | 
1 files changed, 20 insertions, 3 deletions
| diff --git a/sway/tree/container.c b/sway/tree/container.c index f069a9e9..9db7aed1 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -356,16 +356,33 @@ static bool surface_is_popup(struct wlr_surface *surface) {  struct sway_container *container_at(struct sway_workspace *workspace,  		double lx, double ly,  		struct wlr_surface **surface, double *sx, double *sy) { -	struct sway_container *c = NULL; +	struct sway_container *c; -	// First cast a ray to handle floating windows +	// Focused view's popups +	struct sway_seat *seat = input_manager_current_seat(input_manager); +	struct sway_container *focus = seat_get_focused_container(seat); +	bool is_floating = focus && container_is_floating_or_child(focus); +	// Focused view's popups +	if (focus && focus->view) { +		c = surface_at_view(focus, lx, ly, surface, sx, sy); +		if (c && surface_is_popup(*surface)) { +			return c; +		} +		*surface = NULL; +	} +	// Cast a ray to handle floating windows  	for (int i = workspace->floating->length - 1; i >= 0; --i) {  		struct sway_container *cn = workspace->floating->items[i];  		if (cn->view && (c = surface_at_view(cn, lx, ly, surface, sx, sy))) {  			return c;  		}  	} - +	// If focused is tiling, focused view's non-popups +	if (focus && focus->view && !is_floating) { +		if ((c = surface_at_view(focus, lx, ly, surface, sx, sy))) { +			return c; +		} +	}  	// Tiling (non-focused)  	if ((c = tiling_container_at(&workspace->node, lx, ly, surface, sx, sy))) {  		return c; | 
