diff options
author | Tony Crisci <tony@dubstepdish.com> | 2018-01-20 16:21:45 -0500 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2018-01-20 16:21:45 -0500 |
commit | 6a1d71b8b8f33bdea3fb41bcd0de9439c0452682 (patch) | |
tree | 3ebbb611bb34864f9e86ceed87b6e32c73b93f84 /sway/commands.c | |
parent | add kill command (diff) | |
download | sway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.tar.gz sway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.tar.zst sway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.zip |
basic command criteria
Diffstat (limited to 'sway/commands.c')
-rw-r--r-- | sway/commands.c | 68 |
1 files changed, 60 insertions, 8 deletions
diff --git a/sway/commands.c b/sway/commands.c index 28943963..c1e25c5f 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <json-c/json.h> | 8 | #include <json-c/json.h> |
9 | #include "sway/commands.h" | 9 | #include "sway/commands.h" |
10 | #include "sway/config.h" | 10 | #include "sway/config.h" |
11 | #include "sway/criteria.h" | ||
11 | #include "sway/security.h" | 12 | #include "sway/security.h" |
12 | #include "sway/input/input-manager.h" | 13 | #include "sway/input/input-manager.h" |
13 | #include "stringop.h" | 14 | #include "stringop.h" |
@@ -201,9 +202,41 @@ struct cmd_results *handle_command(char *_exec) { | |||
201 | char *head = exec; | 202 | char *head = exec; |
202 | char *cmdlist; | 203 | char *cmdlist; |
203 | char *cmd; | 204 | char *cmd; |
205 | list_t *containers = NULL; | ||
204 | 206 | ||
205 | head = exec; | 207 | head = exec; |
206 | do { | 208 | do { |
209 | // Extract criteria (valid for this command list only). | ||
210 | bool has_criteria = false; | ||
211 | if (*head == '[') { | ||
212 | has_criteria = true; | ||
213 | ++head; | ||
214 | char *criteria_string = argsep(&head, "]"); | ||
215 | if (head) { | ||
216 | ++head; | ||
217 | list_t *tokens = create_list(); | ||
218 | char *error; | ||
219 | |||
220 | if ((error = extract_crit_tokens(tokens, criteria_string))) { | ||
221 | wlr_log(L_DEBUG, "criteria string parse error: %s", error); | ||
222 | results = cmd_results_new(CMD_INVALID, criteria_string, | ||
223 | "Can't parse criteria string: %s", error); | ||
224 | free(error); | ||
225 | free(tokens); | ||
226 | goto cleanup; | ||
227 | } | ||
228 | containers = container_for(tokens); | ||
229 | |||
230 | free(tokens); | ||
231 | } else { | ||
232 | if (!results) { | ||
233 | results = cmd_results_new(CMD_INVALID, criteria_string, "Unmatched ["); | ||
234 | } | ||
235 | goto cleanup; | ||
236 | } | ||
237 | // Skip leading whitespace | ||
238 | head += strspn(head, whitespace); | ||
239 | } | ||
207 | // Split command list | 240 | // Split command list |
208 | cmdlist = argsep(&head, ";"); | 241 | cmdlist = argsep(&head, ";"); |
209 | cmdlist += strspn(cmdlist, whitespace); | 242 | cmdlist += strspn(cmdlist, whitespace); |
@@ -236,16 +269,35 @@ struct cmd_results *handle_command(char *_exec) { | |||
236 | free_argv(argc, argv); | 269 | free_argv(argc, argv); |
237 | goto cleanup; | 270 | goto cleanup; |
238 | } | 271 | } |
239 | struct cmd_results *res = handler->handle(argc-1, argv+1); | 272 | |
240 | if (res->status != CMD_SUCCESS) { | 273 | if (!has_criteria) { |
241 | free_argv(argc, argv); | 274 | config->handler_context.current_container = NULL; |
242 | if (results) { | 275 | struct cmd_results *res = handler->handle(argc-1, argv+1); |
243 | free_cmd_results(results); | 276 | if (res->status != CMD_SUCCESS) { |
277 | free_argv(argc, argv); | ||
278 | if (results) { | ||
279 | free_cmd_results(results); | ||
280 | } | ||
281 | results = res; | ||
282 | goto cleanup; | ||
283 | } | ||
284 | free_cmd_results(res); | ||
285 | } else { | ||
286 | wlr_log(L_DEBUG, "@@ running command on containers"); | ||
287 | for (int i = 0; i < containers->length; ++i) { | ||
288 | config->handler_context.current_container = containers->items[i]; | ||
289 | struct cmd_results *res = handler->handle(argc-1, argv+1); | ||
290 | if (res->status != CMD_SUCCESS) { | ||
291 | free_argv(argc, argv); | ||
292 | if (results) { | ||
293 | free_cmd_results(results); | ||
294 | } | ||
295 | results = res; | ||
296 | goto cleanup; | ||
297 | } | ||
298 | free_cmd_results(res); | ||
244 | } | 299 | } |
245 | results = res; | ||
246 | goto cleanup; | ||
247 | } | 300 | } |
248 | free_cmd_results(res); | ||
249 | free_argv(argc, argv); | 301 | free_argv(argc, argv); |
250 | } while(cmdlist); | 302 | } while(cmdlist); |
251 | } while(head); | 303 | } while(head); |