aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/workspace.c
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/tree/workspace.c
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/tree/workspace.c')
-rw-r--r--sway/tree/workspace.c25
1 files changed, 10 insertions, 15 deletions
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) {