aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Ian Fan <ianfan0@gmail.com>2018-08-12 00:32:13 +0100
committerLibravatar Ian Fan <ianfan0@gmail.com>2018-08-18 17:25:06 +0100
commite81cc8a5754386d9484b84cf97ab2f8755c35294 (patch)
treea3a9f64d0e179b07f94e2fff1484f5099f440432 /sway
parentcommands: handle quoted exec command (diff)
downloadsway-e81cc8a5754386d9484b84cf97ab2f8755c35294.tar.gz
sway-e81cc8a5754386d9484b84cf97ab2f8755c35294.tar.zst
sway-e81cc8a5754386d9484b84cf97ab2f8755c35294.zip
commands: saner workspace number handling
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/move.c7
-rw-r--r--sway/commands/rename.c8
-rw-r--r--sway/commands/workspace.c7
-rw-r--r--sway/tree/workspace.c25
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
84char *prev_workspace_name = NULL; 84char *prev_workspace_name = NULL;
85struct workspace_by_number_data {
86 int len;
87 const char *cset;
88 const char *name;
89};
90 85
91void next_name_map(struct sway_container *ws, void *data) { 86void 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
241struct sway_container *workspace_by_number(const char* name) { 241struct 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
250static bool _workspace_by_name(struct sway_container *view, void *data) { 245static bool _workspace_by_name(struct sway_container *view, void *data) {