diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-08-08 10:04:11 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-08-08 12:50:42 +1000 |
commit | 5653fc754b09ae5344f42f9e3df71cd4420b7d61 (patch) | |
tree | 2f70bd11f025791a2970850771baa2062413f00c /sway/commands | |
parent | a0649190deaaf093112e99881c25ff550f07e96b (diff) | |
download | sway-5653fc754b09ae5344f42f9e3df71cd4420b7d61.tar.xz |
Deny moving a sticky container to workspace if it's the same output
Rationale: Sticky containers are always assigned to the visible
workspace.
The basic idea here is to check the destination's output (move.c:190).
But if the command was `move container to workspace x` then a workspace
might have been created for it. We could destroy the workspace in this
case, but that results in unnecessary IPC events.
To avoid this, the logic for `move container to workspace x` has been
adjusted. It now delays creating the workspace until the end, and uses
`workspace_get_initial_output` to determine and check the output before
creating it.
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/move.c | 38 |
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 = |