diff options
author | Ian Fan <ianfan0@gmail.com> | 2018-08-12 00:32:13 +0100 |
---|---|---|
committer | Ian Fan <ianfan0@gmail.com> | 2018-08-18 17:25:06 +0100 |
commit | e81cc8a5754386d9484b84cf97ab2f8755c35294 (patch) | |
tree | a3a9f64d0e179b07f94e2fff1484f5099f440432 /sway/tree | |
parent | commands: handle quoted exec command (diff) | |
download | sway-e81cc8a5754386d9484b84cf97ab2f8755c35294.tar.gz sway-e81cc8a5754386d9484b84cf97ab2f8755c35294.tar.zst sway-e81cc8a5754386d9484b84cf97ab2f8755c35294.zip |
commands: saner workspace number handling
Diffstat (limited to 'sway/tree')
-rw-r--r-- | sway/tree/workspace.c | 25 |
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 | ||
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) { |