diff options
author | Jonathan Buch <jbuch@synyx.de> | 2018-10-03 11:26:46 +0200 |
---|---|---|
committer | Jonathan Buch <jbuch@synyx.de> | 2018-10-03 16:23:14 +0200 |
commit | 426c33f4dc2515867a0d3b04cb865d5cad091d10 (patch) | |
tree | 2564be2f236c91052227bf2cdf322d620caa18b4 /sway/tree | |
parent | 7e978d7a4c521a98b9f44274cd65791b06266ed3 (diff) | |
download | sway-426c33f4dc2515867a0d3b04cb865d5cad091d10.tar.xz |
Reenable popup-handling for determining focus
This reenables the popup-handling code before the floating-window
focus change.
Diffstat (limited to 'sway/tree')
-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; |