aboutsummaryrefslogtreecommitdiff
path: root/sway/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands.c')
-rw-r--r--sway/commands.c81
1 files changed, 69 insertions, 12 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 1005cf68..a77ff791 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -8,8 +8,10 @@
#include <json-c/json.h>
#include "sway/commands.h"
#include "sway/config.h"
+#include "sway/criteria.h"
#include "sway/security.h"
#include "sway/input/input-manager.h"
+#include "sway/input/seat.h"
#include "stringop.h"
#include "log.h"
@@ -70,10 +72,7 @@ void apply_input_config(struct input_config *input) {
list_add(config->input_configs, input);
}
- struct input_config *old_input_config = current_input_config;
- current_input_config = input;
sway_input_manager_apply_input_config(input_manager, input);
- current_input_config = old_input_config;
}
void apply_seat_config(struct seat_config *seat) {
@@ -89,7 +88,6 @@ void apply_seat_config(struct seat_config *seat) {
list_add(config->seat_configs, seat);
}
- current_seat_config = seat;
sway_input_manager_apply_seat_config(input_manager, seat);
}
@@ -136,6 +134,7 @@ static struct cmd_handler handlers[] = {
{ "exit", cmd_exit },
{ "include", cmd_include },
{ "input", cmd_input },
+ { "kill", cmd_kill },
{ "output", cmd_output },
{ "seat", cmd_seat },
{ "set", cmd_set },
@@ -204,9 +203,41 @@ struct cmd_results *handle_command(char *_exec) {
char *head = exec;
char *cmdlist;
char *cmd;
+ list_t *containers = NULL;
head = exec;
do {
+ // Extract criteria (valid for this command list only).
+ bool has_criteria = false;
+ if (*head == '[') {
+ has_criteria = true;
+ ++head;
+ char *criteria_string = argsep(&head, "]");
+ if (head) {
+ ++head;
+ list_t *tokens = create_list();
+ char *error;
+
+ if ((error = extract_crit_tokens(tokens, criteria_string))) {
+ wlr_log(L_DEBUG, "criteria string parse error: %s", error);
+ results = cmd_results_new(CMD_INVALID, criteria_string,
+ "Can't parse criteria string: %s", error);
+ free(error);
+ free(tokens);
+ goto cleanup;
+ }
+ containers = container_for_crit_tokens(tokens);
+
+ free(tokens);
+ } else {
+ if (!results) {
+ results = cmd_results_new(CMD_INVALID, criteria_string, "Unmatched [");
+ }
+ goto cleanup;
+ }
+ // Skip leading whitespace
+ head += strspn(head, whitespace);
+ }
// Split command list
cmdlist = argsep(&head, ";");
cmdlist += strspn(cmdlist, whitespace);
@@ -239,16 +270,42 @@ struct cmd_results *handle_command(char *_exec) {
free_argv(argc, argv);
goto cleanup;
}
- struct cmd_results *res = handler->handle(argc-1, argv+1);
- if (res->status != CMD_SUCCESS) {
- free_argv(argc, argv);
- if (results) {
- free_cmd_results(results);
+
+ if (!has_criteria) {
+ // without criteria, the command acts upon the focused
+ // container
+ struct sway_seat *seat = config->handler_context.seat;
+ if (!seat) {
+ seat = sway_input_manager_get_default_seat(input_manager);
+ }
+ if (seat) {
+ config->handler_context.current_container = seat->focus;
+ struct cmd_results *res = handler->handle(argc-1, argv+1);
+ if (res->status != CMD_SUCCESS) {
+ free_argv(argc, argv);
+ if (results) {
+ free_cmd_results(results);
+ }
+ results = res;
+ goto cleanup;
+ }
+ free_cmd_results(res);
+ }
+ } else {
+ for (int i = 0; i < containers->length; ++i) {
+ config->handler_context.current_container = containers->items[i];
+ struct cmd_results *res = handler->handle(argc-1, argv+1);
+ if (res->status != CMD_SUCCESS) {
+ free_argv(argc, argv);
+ if (results) {
+ free_cmd_results(results);
+ }
+ results = res;
+ goto cleanup;
+ }
+ free_cmd_results(res);
}
- results = res;
- goto cleanup;
}
- free_cmd_results(res);
free_argv(argc, argv);
} while(cmdlist);
} while(head);