aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway.5.txt5
-rw-r--r--sway/commands.c19
-rw-r--r--sway/layout.c7
3 files changed, 27 insertions, 4 deletions
diff --git a/sway.5.txt b/sway.5.txt
index d97720c5..dad55c5f 100644
--- a/sway.5.txt
+++ b/sway.5.txt
@@ -53,6 +53,11 @@ Commands
container, which is useful, for example, to open a sibling of the parent
container, or to move the entire container around.
+**focus** output <direction|name>::
+ Direction may be one of _up_, _down_, _left_, _right_. The directional focus
+ commands will move the focus to the output in that direction. When name is
+ given the focus is changed to the output with that name.
+
**focus** mode_toggle::
Toggles focus between floating view and tiled view.
diff --git a/sway/commands.c b/sway/commands.c
index c81379fd..441b6fd7 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -17,6 +17,7 @@
#include "workspace.h"
#include "commands.h"
#include "container.h"
+#include "output.h"
#include "handlers.h"
#include "sway.h"
#include "resize.h"
@@ -372,7 +373,20 @@ static struct cmd_results *cmd_floating_mod(int argc, char **argv) {
static struct cmd_results *cmd_focus(int argc, char **argv) {
if (config->reading) return cmd_results_new(CMD_FAILURE, "focus", "Can't be used in config file.");
struct cmd_results *error = NULL;
- if ((error = checkarg(argc, "focus", EXPECTED_EQUAL_TO, 1))) {
+ if (argc > 0 && strcasecmp(argv[0], "output") == 0) {
+ swayc_t *output = NULL;
+ if ((error = checkarg(argc, "focus", EXPECTED_EQUAL_TO, 2))) {
+ return error;
+ } else if (!(output = output_by_name(argv[1]))) {
+ return cmd_results_new(CMD_FAILURE, "focus output",
+ "Can't find output with name/at direction %s", argv[1]);
+ } else if (!workspace_switch(swayc_active_workspace_for(output))) {
+ return cmd_results_new(CMD_FAILURE, "focus output",
+ "Switching to workspace on output '%s' was blocked", argv[1]);
+ } else {
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+ }
+ } else if ((error = checkarg(argc, "focus", EXPECTED_EQUAL_TO, 1))) {
return error;
}
static int floating_toggled_index = 0;
@@ -424,6 +438,9 @@ static struct cmd_results *cmd_focus(int argc, char **argv) {
}
}
}
+ } else {
+ return cmd_results_new(CMD_INVALID, "focus",
+ "Expected 'focus <direction|parent|mode_toggle>' or 'focus output <direction|name>'");
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}
diff --git a/sway/layout.c b/sway/layout.c
index 6388a9b2..29772172 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -289,15 +289,16 @@ void move_container_to(swayc_t* container, swayc_t* destination) {
return;
}
swayc_t *parent = remove_child(container);
- // reset container geometry
- container->width = container->height = 0;
-
// Send to new destination
if (container->is_floating) {
add_floating(swayc_active_workspace_for(destination), container);
} else if (destination->type == C_WORKSPACE) {
+ // reset container geometry
+ container->width = container->height = 0;
add_child(destination, container);
} else {
+ // reset container geometry
+ container->width = container->height = 0;
add_sibling(destination, container);
}
// Destroy old container if we need to