diff options
-rw-r--r-- | sway/commands/move.c | 7 | ||||
-rw-r--r-- | sway/commands/rename.c | 8 | ||||
-rw-r--r-- | sway/commands/workspace.c | 7 | ||||
-rw-r--r-- | sway/tree/workspace.c | 25 |
4 files changed, 29 insertions, 18 deletions
diff --git a/sway/commands/move.c b/sway/commands/move.c index f5eb9124..33d1ee4a 100644 --- a/sway/commands/move.c +++ b/sway/commands/move.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #define _XOPEN_SOURCE 500 | 1 | #define _XOPEN_SOURCE 500 |
2 | #include <ctype.h> | ||
2 | #include <stdbool.h> | 3 | #include <stdbool.h> |
3 | #include <string.h> | 4 | #include <string.h> |
4 | #include <strings.h> | 5 | #include <strings.h> |
@@ -124,7 +125,11 @@ static struct cmd_results *cmd_move_container(struct sway_container *current, | |||
124 | return cmd_results_new(CMD_INVALID, "move", | 125 | return cmd_results_new(CMD_INVALID, "move", |
125 | expected_syntax); | 126 | expected_syntax); |
126 | } | 127 | } |
127 | ws_name = strdup(argv[3]); | 128 | if (!isdigit(argv[3][0])) { |
129 | return cmd_results_new(CMD_INVALID, "move", | ||
130 | "Invalid workspace number '%s'", argv[3]); | ||
131 | } | ||
132 | ws_name = join_args(argv + 3, argc - 3); | ||
128 | ws = workspace_by_number(ws_name); | 133 | ws = workspace_by_number(ws_name); |
129 | } else { | 134 | } else { |
130 | ws_name = join_args(argv + 2, argc - 2); | 135 | ws_name = join_args(argv + 2, argc - 2); |
diff --git a/sway/commands/rename.c b/sway/commands/rename.c index c69bbdac..21d2aa64 100644 --- a/sway/commands/rename.c +++ b/sway/commands/rename.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #define _XOPEN_SOURCE 500 | 1 | #define _XOPEN_SOURCE 500 |
2 | #include <ctype.h> | ||
2 | #include <string.h> | 3 | #include <string.h> |
3 | #include <strings.h> | 4 | #include <strings.h> |
4 | #include "log.h" | 5 | #include "log.h" |
@@ -34,6 +35,10 @@ struct cmd_results *cmd_rename(int argc, char **argv) { | |||
34 | } | 35 | } |
35 | } else if (strcasecmp(argv[1], "number") == 0) { | 36 | } else if (strcasecmp(argv[1], "number") == 0) { |
36 | // 'rename workspace number x to new_name' | 37 | // 'rename workspace number x to new_name' |
38 | if (!isdigit(argv[2][0])) { | ||
39 | return cmd_results_new(CMD_INVALID, "rename", | ||
40 | "Invalid workspace number '%s'", argv[2]); | ||
41 | } | ||
37 | workspace = workspace_by_number(argv[2]); | 42 | workspace = workspace_by_number(argv[2]); |
38 | while (argn < argc && strcasecmp(argv[argn], "to") != 0) { | 43 | while (argn < argc && strcasecmp(argv[argn], "to") != 0) { |
39 | ++argn; | 44 | ++argn; |
@@ -67,7 +72,8 @@ struct cmd_results *cmd_rename(int argc, char **argv) { | |||
67 | strcasecmp(new_name, "next_on_output") == 0 || | 72 | strcasecmp(new_name, "next_on_output") == 0 || |
68 | strcasecmp(new_name, "prev_on_output") == 0 || | 73 | strcasecmp(new_name, "prev_on_output") == 0 || |
69 | strcasecmp(new_name, "back_and_forth") == 0 || | 74 | strcasecmp(new_name, "back_and_forth") == 0 || |
70 | strcasecmp(new_name, "current") == 0) { | 75 | strcasecmp(new_name, "current") == 0 || |
76 | strcasecmp(new_name, "number") == 0) { | ||
71 | free(new_name); | 77 | free(new_name); |
72 | return cmd_results_new(CMD_INVALID, "rename", | 78 | return cmd_results_new(CMD_INVALID, "rename", |
73 | "Cannot use special workspace name '%s'", argv[argn]); | 79 | "Cannot use special workspace name '%s'", argv[argn]); |
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c index f5558bb4..ceb4cd6e 100644 --- a/sway/commands/workspace.c +++ b/sway/commands/workspace.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #define _XOPEN_SOURCE 500 | 1 | #define _XOPEN_SOURCE 500 |
2 | #include <ctype.h> | ||
2 | #include <string.h> | 3 | #include <string.h> |
3 | #include <strings.h> | 4 | #include <strings.h> |
4 | #include "sway/commands.h" | 5 | #include "sway/commands.h" |
@@ -60,9 +61,13 @@ struct cmd_results *cmd_workspace(int argc, char **argv) { | |||
60 | struct sway_container *ws = NULL; | 61 | struct sway_container *ws = NULL; |
61 | if (strcasecmp(argv[0], "number") == 0) { | 62 | if (strcasecmp(argv[0], "number") == 0) { |
62 | if (argc < 2) { | 63 | if (argc < 2) { |
63 | cmd_results_new(CMD_INVALID, "workspace", | 64 | return cmd_results_new(CMD_INVALID, "workspace", |
64 | "Expected workspace number"); | 65 | "Expected workspace number"); |
65 | } | 66 | } |
67 | if (!isdigit(argv[1][0])) { | ||
68 | return cmd_results_new(CMD_INVALID, "workspace", | ||
69 | "Invalid workspace number '%s'", argv[1]); | ||
70 | } | ||
66 | if (!(ws = workspace_by_number(argv[1]))) { | 71 | if (!(ws = workspace_by_number(argv[1]))) { |
67 | char *name = join_args(argv + 1, argc - 1); | 72 | char *name = join_args(argv + 1, argc - 1); |
68 | ws = workspace_create(NULL, name); | 73 | ws = workspace_create(NULL, name); |
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index b7090de6..a6d1870c 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c | |||
@@ -82,11 +82,6 @@ struct sway_container *workspace_create(struct sway_container *output, | |||
82 | } | 82 | } |
83 | 83 | ||
84 | char *prev_workspace_name = NULL; | 84 | char *prev_workspace_name = NULL; |
85 | struct workspace_by_number_data { | ||
86 | int len; | ||
87 | const char *cset; | ||
88 | const char *name; | ||
89 | }; | ||
90 | 85 | ||
91 | void next_name_map(struct sway_container *ws, void *data) { | 86 | void next_name_map(struct sway_container *ws, void *data) { |
92 | int *count = data; | 87 | int *count = data; |
@@ -154,7 +149,7 @@ static void workspace_name_from_binding(const struct sway_binding * binding, | |||
154 | wlr_log(WLR_DEBUG, "Isolated name from workspace number: '%s'", _target); | 149 | wlr_log(WLR_DEBUG, "Isolated name from workspace number: '%s'", _target); |
155 | 150 | ||
156 | // Make sure the workspace number doesn't already exist | 151 | // Make sure the workspace number doesn't already exist |
157 | if (workspace_by_number(_target)) { | 152 | if (isdigit(_target[0]) && workspace_by_number(_target)) { |
158 | free(_target); | 153 | free(_target); |
159 | free(dup); | 154 | free(dup); |
160 | return; | 155 | return; |
@@ -233,18 +228,18 @@ static bool _workspace_by_number(struct sway_container *view, void *data) { | |||
233 | if (view->type != C_WORKSPACE) { | 228 | if (view->type != C_WORKSPACE) { |
234 | return false; | 229 | return false; |
235 | } | 230 | } |
236 | struct workspace_by_number_data *wbnd = data; | 231 | char *name = data; |
237 | int a = strspn(view->name, wbnd->cset); | 232 | char *view_name = view->name; |
238 | return a == wbnd->len && strncmp(view->name, wbnd->name, a) == 0; | 233 | while (isdigit(*name)) { |
234 | if (*name++ != *view_name++) { | ||
235 | return false; | ||
236 | } | ||
237 | } | ||
238 | return !isdigit(*view_name); | ||
239 | } | 239 | } |
240 | 240 | ||
241 | struct sway_container *workspace_by_number(const char* name) { | 241 | struct sway_container *workspace_by_number(const char* name) { |
242 | struct workspace_by_number_data wbnd = {0, "1234567890", name}; | 242 | return root_find_workspace(_workspace_by_number, (void *) name); |
243 | wbnd.len = strspn(name, wbnd.cset); | ||
244 | if (wbnd.len <= 0) { | ||
245 | return NULL; | ||
246 | } | ||
247 | return root_find_workspace(_workspace_by_number, (void *) &wbnd); | ||
248 | } | 243 | } |
249 | 244 | ||
250 | static bool _workspace_by_name(struct sway_container *view, void *data) { | 245 | static bool _workspace_by_name(struct sway_container *view, void *data) { |