aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/commands.c7
-rw-r--r--sway/movement.c14
-rw-r--r--sway/movement.h11
3 files changed, 21 insertions, 11 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 40d9d353..64130fdc 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -112,12 +112,7 @@ int cmd_focus(struct sway_config *config, int argc, char **argv) {
} else if (strcasecmp(argv[0], "down") == 0) {
return move_focus(MOVE_DOWN);
} else if (strcasecmp(argv[0], "parent") == 0) {
- swayc_t *current = get_focused_container(&root_container);
- if (current && current->parent) {
- current->parent->focused = NULL;
- unfocus_all(current->parent);
- focus_view(current->parent);
- }
+ return move_focus(MOVE_PARENT);
}
return 0;
}
diff --git a/sway/movement.c b/sway/movement.c
index 108e2588..a55d0350 100644
--- a/sway/movement.c
+++ b/sway/movement.c
@@ -9,6 +9,20 @@ int move_focus(enum movement_direction direction) {
swayc_t *current = get_focused_container(&root_container);
swayc_t *parent = current->parent;
+ if (direction == MOVE_PARENT) {
+ current = parent;
+ parent = parent->parent;
+ if (parent->type == C_ROOT) {
+ sway_log(L_DEBUG, "Focus cannot move to parent");
+ return 1;
+ } else {
+ sway_log(L_DEBUG, "Moving focus away from %p", current);
+ unfocus_all(parent);
+ focus_view(parent);
+ return 0;
+ }
+ }
+
while (true) {
sway_log(L_DEBUG, "Moving focus away from %p", current);
diff --git a/sway/movement.h b/sway/movement.h
index 44e630ff..a527674c 100644
--- a/sway/movement.h
+++ b/sway/movement.h
@@ -4,11 +4,12 @@
#include <wlc/wlc.h>
#include "list.h"
-enum movement_direction{
- MOVE_LEFT,
- MOVE_RIGHT,
- MOVE_UP,
- MOVE_DOWN
+enum movement_direction {
+ MOVE_LEFT,
+ MOVE_RIGHT,
+ MOVE_UP,
+ MOVE_DOWN,
+ MOVE_PARENT
};
int move_focus(enum movement_direction direction);