diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-07-27 09:10:10 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-07-28 22:41:04 +1000 |
commit | 538e083f61c363ef1127636d8fac1b7e4872e4c4 (patch) | |
tree | 7bb7c11bb066ba0e3277ee16068c14bd0409d43c /sway/commands/focus.c | |
parent | c95847c9e17cf42a8ff23f791232c0ddd671ba6e (diff) |
Fix focus mode_toggle from a child of a floating container
Also fixes a crash when unfloating a window. It needs to add it back to
the tiling tree as a sibling rather than a child, because the reference
container might be a view.
Diffstat (limited to 'sway/commands/focus.c')
-rw-r--r-- | sway/commands/focus.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sway/commands/focus.c b/sway/commands/focus.c index ce3d032f..76d3f1dc 100644 --- a/sway/commands/focus.c +++ b/sway/commands/focus.c @@ -35,6 +35,15 @@ static struct cmd_results *focus_mode(struct sway_container *con, struct sway_seat *seat, bool floating) { struct sway_container *ws = con->type == C_WORKSPACE ? con : container_parent(con, C_WORKSPACE); + + // If the container is in a floating split container, + // operate on the split container instead of the child. + if (container_is_floating_or_child(con)) { + while (con->parent->layout != L_FLOATING) { + con = con->parent; + } + } + struct sway_container *new_focus = NULL; if (floating) { new_focus = seat_get_focus_inactive(seat, ws->sway_workspace->floating); @@ -99,7 +108,7 @@ struct cmd_results *cmd_focus(int argc, char **argv) { } else if (strcmp(argv[0], "tiling") == 0) { return focus_mode(con, seat, false); } else if (strcmp(argv[0], "mode_toggle") == 0) { - return focus_mode(con, seat, !container_is_floating(con)); + return focus_mode(con, seat, !container_is_floating_or_child(con)); } if (strcmp(argv[0], "output") == 0) { |