From 7727d54faf2939e30f82da562de83dbcda1749db Mon Sep 17 00:00:00 2001 From: Jonathan Buch Date: Thu, 27 Sep 2018 18:32:55 +0200 Subject: [PATCH] Fix focusing topmost floating windows Re-focus on the container on which the cursor hovers over. A special case is, if there are menus or other subsurfaces open in the focused container. It will prefer the focused container as long as there are subsurfaces. This commit starts caching the previous node as well as the previous x/y cursor position. Re-calculating the previous focused node by looking at the current state of the cursor position does not work, if the environment changes. --- include/sway/input/cursor.h | 1 + sway/input/cursor.c | 10 +++++----- sway/tree/container.c | 7 +++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/sway/input/cursor.h b/include/sway/input/cursor.h index 7ec451203..4d47ab429 100644 --- a/include/sway/input/cursor.h +++ b/include/sway/input/cursor.h @@ -10,6 +10,7 @@ struct sway_cursor { struct wlr_cursor *cursor; struct { double x, y; + struct sway_node *node; } previous; struct wlr_xcursor_manager *xcursor_manager; diff --git a/sway/input/cursor.c b/sway/input/cursor.c index afad6f6f0..3c62acb92 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -567,15 +567,15 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time_msec, struct wlr_surface *surface = NULL; double sx, sy; - // Find the node beneath the pointer's previous position - struct sway_node *prev_node = node_at_coords(seat, - cursor->previous.x, cursor->previous.y, &surface, &sx, &sy); + struct sway_node *prev_node = cursor->previous.node; + struct sway_node *node = node_at_coords(seat, + cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); + // Update the stored previous position cursor->previous.x = cursor->cursor->x; cursor->previous.y = cursor->cursor->y; + cursor->previous.node = node; - struct sway_node *node = node_at_coords(seat, - cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); if (node && config->focus_follows_mouse && allow_refocusing) { struct sway_node *focus = seat_get_focus(seat); if (focus && node->type == N_WORKSPACE) { diff --git a/sway/tree/container.c b/sway/tree/container.c index a069b1775..f9ddf3d65 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -369,6 +369,13 @@ struct sway_container *container_at(struct sway_workspace *workspace, } // If focused is floating, focused view's non-popups if (focus && focus->view && is_floating) { + // only switch to unfocused container if focused container has no menus open + bool has_subsurfaces = wl_list_length(&focus->view->surface->subsurfaces) > 0; + c = floating_container_at(lx, ly, surface, sx, sy); + if (!has_subsurfaces && c && c->view && *surface && c != focus) { + return c; + } + surface_at_view(focus, lx, ly, surface, sx, sy); if (*surface) { return focus;