From 667b8dcb67d8c3f15b52f59d228bb3146a5cdb30 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Mon, 6 Aug 2018 10:43:09 +0100 Subject: [PATCH] commands: check for special workspaces in workspace & move commands --- sway/commands/move.c | 60 ++++++++++++++++++++++----------------- sway/commands/workspace.c | 18 +++++++----- sway/tree/workspace.c | 39 +++++++++---------------- 3 files changed, 59 insertions(+), 58 deletions(-) diff --git a/sway/commands/move.c b/sway/commands/move.c index d49d6862..500151f7 100644 --- a/sway/commands/move.c +++ b/sway/commands/move.c @@ -99,40 +99,48 @@ static struct cmd_results *cmd_move_container(struct sway_container *current, if (strcasecmp(argv[1], "workspace") == 0) { // move container to workspace x struct sway_container *ws; - char *ws_name = NULL; - if (strcasecmp(argv[2], "number") == 0) { - // move "container to workspace number x" - if (argc < 4) { - return cmd_results_new(CMD_INVALID, "move", expected_syntax); + if (strcasecmp(argv[2], "next") == 0 || + strcasecmp(argv[2], "prev") == 0 || + strcasecmp(argv[2], "next_on_output") == 0 || + strcasecmp(argv[2], "prev_on_output") == 0 || + strcasecmp(argv[2], "back_and_forth") == 0 || + strcasecmp(argv[2], "current") == 0) { + ws = workspace_by_name(argv[2]); + } else if (strcasecmp(argv[2], "back_and_forth") == 0) { + if (!(ws = workspace_by_name(argv[0])) && prev_workspace_name) { + ws = workspace_create(NULL, prev_workspace_name); } - ws_name = strdup(argv[3]); - ws = workspace_by_number(ws_name); } else { - ws_name = join_args(argv + 2, argc - 2); - ws = workspace_by_name(ws_name); - } - - if (!no_auto_back_and_forth && config->auto_back_and_forth && - prev_workspace_name) { - // auto back and forth move - if (old_ws->name && strcmp(old_ws->name, ws_name) == 0) { - // if target workspace is the current one - free(ws_name); - ws_name = strdup(prev_workspace_name); + char *ws_name = NULL; + if (strcasecmp(argv[2], "number") == 0) { + // move "container to workspace number x" + if (argc < 4) { + return cmd_results_new(CMD_INVALID, "move", + expected_syntax); + } + ws_name = strdup(argv[3]); + ws = workspace_by_number(ws_name); + } else { + ws_name = join_args(argv + 2, argc - 2); ws = workspace_by_name(ws_name); } - } - if (!ws) { - if (strcasecmp(argv[2], "back_and_forth") == 0) { - if (prev_workspace_name) { - ws = workspace_create(NULL, prev_workspace_name); + if (!no_auto_back_and_forth && config->auto_back_and_forth && + prev_workspace_name) { + // auto back and forth move + if (old_ws->name && strcmp(old_ws->name, ws_name) == 0) { + // if target workspace is the current one + free(ws_name); + ws_name = strdup(prev_workspace_name); + ws = workspace_by_name(ws_name); } } - ws = workspace_create(NULL, ws_name); - } - free(ws_name); + if (!ws) { + 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); diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c index f32ede1e..f5558bb4 100644 --- a/sway/commands/workspace.c +++ b/sway/commands/workspace.c @@ -68,16 +68,20 @@ struct cmd_results *cmd_workspace(int argc, char **argv) { ws = workspace_create(NULL, name); free(name); } + } else if (strcasecmp(argv[0], "next") == 0 || + strcasecmp(argv[0], "prev") == 0 || + strcasecmp(argv[0], "next_on_output") == 0 || + strcasecmp(argv[0], "prev_on_output") == 0 || + strcasecmp(argv[0], "current") == 0) { + ws = workspace_by_name(argv[0]); + } else if (strcasecmp(argv[0], "back_and_forth") == 0) { + if (!(ws = workspace_by_name(argv[0])) && prev_workspace_name) { + ws = workspace_create(NULL, prev_workspace_name); + } } else { char *name = join_args(argv, argc); if (!(ws = workspace_by_name(name))) { - if (strcasecmp(argv[0], "back_and_forth") == 0) { - if (prev_workspace_name) { - ws = workspace_create(NULL, prev_workspace_name); - } - } else { - ws = workspace_create(NULL, name); - } + ws = workspace_create(NULL, name); } free(name); } diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 5e20429b..3fcad631 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -251,34 +251,23 @@ struct sway_container *workspace_by_name(const char *name) { current_output = container_parent(focus, C_OUTPUT); } - char *name_cpy = strdup(name); - char *first_word = strtok(name_cpy, " "); - if (first_word == NULL) { - first_word = name_cpy; - } - - struct sway_container *ws = NULL; - if (strcmp(first_word, "prev") == 0) { - ws = workspace_prev(current_workspace); - } else if (strcmp(first_word, "prev_on_output") == 0) { - ws = workspace_output_prev(current_output); - } else if (strcmp(first_word, "next") == 0) { - ws = workspace_next(current_workspace); - } else if (strcmp(first_word, "next_on_output") == 0) { - ws = workspace_output_next(current_output); - } else if (strcmp(first_word, "current") == 0) { - ws = current_workspace; - } else if (strcasecmp(first_word, "back_and_forth") == 0) { - if (prev_workspace_name) { - ws = container_find(&root_container, _workspace_by_name, - (void *)prev_workspace_name); - } + if (strcmp(name, "prev") == 0) { + return workspace_prev(current_workspace); + } else if (strcmp(name, "prev_on_output") == 0) { + return workspace_output_prev(current_output); + } else if (strcmp(name, "next") == 0) { + return workspace_next(current_workspace); + } else if (strcmp(name, "next_on_output") == 0) { + return workspace_output_next(current_output); + } else if (strcmp(name, "current") == 0) { + return current_workspace; + } else if (strcasecmp(name, "back_and_forth") == 0) { + return prev_workspace_name ? container_find(&root_container, + _workspace_by_name, (void *)prev_workspace_name) : NULL; } else { - ws = container_find(&root_container, _workspace_by_name, + return container_find(&root_container, _workspace_by_name, (void *)name); } - free(name_cpy); - return ws; } /**