aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands.c
diff options
context:
space:
mode:
authorLibravatar Tony Crisci <tony@dubstepdish.com>2018-01-20 16:21:45 -0500
committerLibravatar Tony Crisci <tony@dubstepdish.com>2018-01-20 16:21:45 -0500
commit6a1d71b8b8f33bdea3fb41bcd0de9439c0452682 (patch)
tree3ebbb611bb34864f9e86ceed87b6e32c73b93f84 /sway/commands.c
parentadd kill command (diff)
downloadsway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.tar.gz
sway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.tar.zst
sway-6a1d71b8b8f33bdea3fb41bcd0de9439c0452682.zip
basic command criteria
Diffstat (limited to 'sway/commands.c')
-rw-r--r--sway/commands.c68
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);