commit 924ed6464c25219bc0dd5ed06885cd3692042a20
parent d7350915d9d9d8aba936c6139aa085804548f6b1
Author: Jarkko Oranen <oranenj@iki.fi>
Date: Sun, 19 Mar 2017 16:46:27 +0200
Prevent "move next" and "move prev" commands from crashing
Fixes #1120
When the parent of a view is C_WORKSPACE and the movement direction
is either MOVE_PREV or MOVE_NEXT, the code would attempt to move the
views to the next output, but swayc_adjacent_output can't accept
non-directional movement commands and causes undefined behaviour and
a segfault.
If the code is simply skipped, we end up in an infinite loop.
Instead, we can allow containers whose parent is a C_WORKSPACE take the
path that handles MOVE_PREV and MOVE_NEXT, which behaves as you would
expect.
I'm not certain that this fix is entirely correct as the desired behaviour
of move_container is not very well defined, but it seems to work.
Diffstat:
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sway/layout.c b/sway/layout.c
@@ -417,7 +417,7 @@ void move_container(swayc_t *container, enum movement_direction dir, int move_am
sway_log(L_DEBUG, "container:%p, parent:%p, child %p,",
container,parent,child);
if (parent->layout == layout
- || (layout == L_NONE && parent->type == C_CONTAINER) /* accept any layout for next/prev direction */
+ || (layout == L_NONE && (parent->type == C_CONTAINER || parent->type == C_WORKSPACE)) /* accept any layout for next/prev direction */
|| (parent->layout == L_TABBED && layout == L_HORIZ)
|| (parent->layout == L_STACKED && layout == L_VERT)
|| is_auto_layout(parent->layout)) {