aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-08-08 08:13:22 -0400
committerGitHub <noreply@github.com>2018-08-08 08:13:22 -0400
commitc8a8216629cd56a510255f6ead3eaba9508b6544 (patch)
tree2f70bd11f025791a2970850771baa2062413f00c /sway/commands
parent6f0bc469e9b99ea641fdf98805f29e8acd96894a (diff)
parent5653fc754b09ae5344f42f9e3df71cd4420b7d61 (diff)
Merge pull request #2420 from RyanDwyer/floating-move-to-workspace
Implement move to workspace on a floating container
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/move.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/sway/commands/move.c b/sway/commands/move.c
index 95dcb088..de6b1b0a 100644
--- a/sway/commands/move.c
+++ b/sway/commands/move.c
@@ -100,7 +100,8 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
// determine destination
if (strcasecmp(argv[1], "workspace") == 0) {
// move container to workspace x
- struct sway_container *ws;
+ struct sway_container *ws = NULL;
+ char *ws_name = NULL;
if (strcasecmp(argv[2], "next") == 0 ||
strcasecmp(argv[2], "prev") == 0 ||
strcasecmp(argv[2], "next_on_output") == 0 ||
@@ -110,14 +111,13 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
} else if (strcasecmp(argv[2], "back_and_forth") == 0) {
if (!(ws = workspace_by_name(argv[2]))) {
if (prev_workspace_name) {
- ws = workspace_create(NULL, prev_workspace_name);
+ ws_name = strdup(prev_workspace_name);
} else {
return cmd_results_new(CMD_FAILURE, "move",
"No workspace was previously active.");
}
}
} else {
- char *ws_name = NULL;
if (strcasecmp(argv[2], "number") == 0) {
// move "container to workspace number x"
if (argc < 4) {
@@ -141,12 +141,26 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
ws = workspace_by_name(ws_name);
}
}
-
- if (!ws) {
- ws = workspace_create(NULL, ws_name);
+ }
+ if (!ws) {
+ // We have to create the workspace, but if the container is
+ // sticky and the workspace is going to be created on the same
+ // output, we'll bail out first.
+ if (container_is_floating(current) && current->is_sticky) {
+ struct sway_container *old_output =
+ container_parent(current, C_OUTPUT);
+ struct sway_container *new_output =
+ workspace_get_initial_output(ws_name);
+ if (old_output == new_output) {
+ free(ws_name);
+ return cmd_results_new(CMD_FAILURE, "move",
+ "Can't move sticky container to another workspace "
+ "on the same output");
+ }
}
- free(ws_name);
+ ws = workspace_create(NULL, ws_name);
}
+ free(ws_name);
destination = seat_get_focus_inactive(config->handler_context.seat, ws);
} else if (strcasecmp(argv[1], "output") == 0) {
struct sway_container *source = container_parent(current, C_OUTPUT);
@@ -173,6 +187,16 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
return cmd_results_new(CMD_INVALID, "move", expected_syntax);
}
+ if (container_is_floating(current) && current->is_sticky) {
+ struct sway_container *old_output = container_parent(current, C_OUTPUT);
+ struct sway_container *new_output = destination->type == C_OUTPUT ?
+ destination : container_parent(destination, C_OUTPUT);
+ if (old_output == new_output) {
+ return cmd_results_new(CMD_FAILURE, "move", "Can't move sticky "
+ "container to another workspace on the same output");
+ }
+ }
+
// move container, arrange windows and return focus
container_move_to(current, destination);
struct sway_container *focus =