summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Jarkko Oranen <oranenj@iki.fi>2017-03-19 16:46:27 +0200
committerLibravatar Jarkko Oranen <oranenj@iki.fi>2017-03-19 16:58:39 +0200
commit924ed6464c25219bc0dd5ed06885cd3692042a20 (patch)
tree7be02709fd7d81d1829810df24578faa73f77804
parentThe default layout of a workspace should follow the output (diff)
downloadsway-924ed6464c25219bc0dd5ed06885cd3692042a20.tar.gz
sway-924ed6464c25219bc0dd5ed06885cd3692042a20.tar.zst
sway-924ed6464c25219bc0dd5ed06885cd3692042a20.zip
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.
-rw-r--r--sway/layout.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sway/layout.c b/sway/layout.c
index 473b74f7..69291daf 100644
--- 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
417 sway_log(L_DEBUG, "container:%p, parent:%p, child %p,", 417 sway_log(L_DEBUG, "container:%p, parent:%p, child %p,",
418 container,parent,child); 418 container,parent,child);
419 if (parent->layout == layout 419 if (parent->layout == layout
420 || (layout == L_NONE && parent->type == C_CONTAINER) /* accept any layout for next/prev direction */ 420 || (layout == L_NONE && (parent->type == C_CONTAINER || parent->type == C_WORKSPACE)) /* accept any layout for next/prev direction */
421 || (parent->layout == L_TABBED && layout == L_HORIZ) 421 || (parent->layout == L_TABBED && layout == L_HORIZ)
422 || (parent->layout == L_STACKED && layout == L_VERT) 422 || (parent->layout == L_STACKED && layout == L_VERT)
423 || is_auto_layout(parent->layout)) { 423 || is_auto_layout(parent->layout)) {