From 298ccb539c5f9d538e49364f45e57ff0d88df717 Mon Sep 17 00:00:00 2001 From: Jonathan Buch Date: Tue, 25 Sep 2018 10:22:50 +0200 Subject: Add configuration for raising containers on focus * New configuration option: raise_floating (From the discussion on https://github.com/i3/i3/issues/2990) * By default, it still raises the window on focus, otherwise it will raise the window on click. --- include/sway/commands.h | 1 + include/sway/config.h | 1 + 2 files changed, 2 insertions(+) (limited to 'include') diff --git a/include/sway/commands.h b/include/sway/commands.h index 64f707f4..f7fafb96 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -125,6 +125,7 @@ sway_cmd cmd_floating_modifier; sway_cmd cmd_floating_scroll; sway_cmd cmd_focus; sway_cmd cmd_focus_follows_mouse; +sway_cmd cmd_raise_floating; sway_cmd cmd_focus_on_window_activation; sway_cmd cmd_focus_wrapping; sway_cmd cmd_font; diff --git a/include/sway/config.h b/include/sway/config.h index 98a18b76..02ace979 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -359,6 +359,7 @@ struct sway_config { // Flags bool focus_follows_mouse; + bool raise_floating; bool mouse_warping; enum focus_wrapping_mode focus_wrapping; bool active; -- cgit v1.2.3 From 7727d54faf2939e30f82da562de83dbcda1749db Mon Sep 17 00:00:00 2001 From: Jonathan Buch Date: Thu, 27 Sep 2018 18:32:55 +0200 Subject: 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(-) (limited to 'include') diff --git a/include/sway/input/cursor.h b/include/sway/input/cursor.h index 7ec45120..4d47ab42 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 afad6f6f..3c62acb9 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 a069b177..f9ddf3d6 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; -- cgit v1.2.3