Implement `focus child` command

The `focus child` command focuses the child container within the selected
container.
This commit is contained in:
Tony Crisci 2016-07-27 22:42:45 -04:00
parent 6d2b455727
commit 88b7cbe314
5 changed files with 12 additions and 5 deletions

View File

@ -5,7 +5,8 @@ enum movement_direction {
MOVE_RIGHT, MOVE_RIGHT,
MOVE_UP, MOVE_UP,
MOVE_DOWN, MOVE_DOWN,
MOVE_PARENT MOVE_PARENT,
MOVE_CHILD
}; };
#include "container.h" #include "container.h"

View File

@ -864,6 +864,8 @@ static struct cmd_results *cmd_focus(int argc, char **argv) {
move_focus(MOVE_DOWN); move_focus(MOVE_DOWN);
} else if (strcasecmp(argv[0], "parent") == 0) { } else if (strcasecmp(argv[0], "parent") == 0) {
move_focus(MOVE_PARENT); move_focus(MOVE_PARENT);
} else if (strcasecmp(argv[0], "child") == 0) {
move_focus(MOVE_CHILD);
} else if (strcasecmp(argv[0], "mode_toggle") == 0) { } else if (strcasecmp(argv[0], "mode_toggle") == 0) {
int i; int i;
swayc_t *workspace = swayc_active_workspace(); swayc_t *workspace = swayc_active_workspace();
@ -903,7 +905,7 @@ static struct cmd_results *cmd_focus(int argc, char **argv) {
} }
} else { } else {
return cmd_results_new(CMD_INVALID, "focus", return cmd_results_new(CMD_INVALID, "focus",
"Expected 'focus <direction|parent|mode_toggle>' or 'focus output <direction|name>'"); "Expected 'focus <direction|parent|child|mode_toggle>' or 'focus output <direction|name>'");
} }
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }

View File

@ -72,7 +72,7 @@ bool move_focus(enum movement_direction direction) {
return false; return false;
} else if (new_view->type == C_OUTPUT) { } else if (new_view->type == C_OUTPUT) {
return set_focused_container(swayc_active_workspace_for(new_view)); return set_focused_container(swayc_active_workspace_for(new_view));
} else if (direction == MOVE_PARENT) { } else if (direction == MOVE_PARENT || direction == MOVE_CHILD) {
return set_focused_container(new_view); return set_focused_container(new_view);
} else if (config->mouse_warping) { } else if (config->mouse_warping) {
swayc_t *old_op = old_view->type == C_OUTPUT ? swayc_t *old_op = old_view->type == C_OUTPUT ?

View File

@ -1009,6 +1009,10 @@ static swayc_t *get_swayc_in_output_direction(swayc_t *output, enum movement_dir
} }
swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_direction dir, swayc_t *limit) { swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_direction dir, swayc_t *limit) {
if (dir == MOVE_CHILD) {
return container->focused;
}
swayc_t *parent = container->parent; swayc_t *parent = container->parent;
if (dir == MOVE_PARENT) { if (dir == MOVE_PARENT) {
if (parent->type == C_OUTPUT) { if (parent->type == C_OUTPUT) {

View File

@ -59,8 +59,8 @@ They are expected to be used with **bindsym** or at runtime through **swaymsg**(
Make focused view floating, non-floating, or the opposite of what it is now. Make focused view floating, non-floating, or the opposite of what it is now.
**focus** <direction>:: **focus** <direction>::
Direction may be one of _up_, _down_, _left_, _right_, or _parent_. The Direction may be one of _up_, _down_, _left_, _right_, _parent_, or _child_.
directional focus commands will move the focus in that direction. The parent The directional focus commands will move the focus in that direction. The parent
focus command will change the focus to the parent of the currently focused focus command will change the focus to the parent of the currently focused
container, which is useful, for example, to open a sibling of the parent container, which is useful, for example, to open a sibling of the parent
container, or to move the entire container around. container, or to move the entire container around.