aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar taiyu <taiyu.len@gmail.com>2015-09-08 10:53:15 -0700
committerLibravatar taiyu <taiyu.len@gmail.com>2015-09-08 10:53:15 -0700
commit6388241abb7e2e66e716fc128e658d3d3419442a (patch)
treeac715db07ee07ff0226434e9a8228d187a77cb64
parentremove old things (diff)
downloadsway-6388241abb7e2e66e716fc128e658d3d3419442a.tar.gz
sway-6388241abb7e2e66e716fc128e658d3d3419442a.tar.zst
sway-6388241abb7e2e66e716fc128e658d3d3419442a.zip
mode supports multi token names
-rw-r--r--include/commands.h1
-rw-r--r--sway/commands.c9
-rw-r--r--sway/stringop.c11
3 files changed, 11 insertions, 10 deletions
diff --git a/include/commands.h b/include/commands.h
index e521306c..0a38ce43 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -13,7 +13,6 @@ struct cmd_handler {
13 } config_type; 13 } config_type;
14}; 14};
15 15
16struct cmd_handler *find_handler(char *line);
17bool handle_command(char *command); 16bool handle_command(char *command);
18// Handles commands during config 17// Handles commands during config
19bool config_command(char *command); 18bool config_command(char *command);
diff --git a/sway/commands.c b/sway/commands.c
index 423b576f..09ee91e8 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -368,26 +368,27 @@ static bool cmd_mode(int argc, char **argv) {
368 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)) { 368 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)) {
369 return false; 369 return false;
370 } 370 }
371 const char *mode_name = argv[0]; 371 bool mode_make = strcmp(argv[argc-1], "{") == 0;
372 const char *mode_name = join_args(argv, argc - mode_make);
372 struct sway_mode *mode = NULL; 373 struct sway_mode *mode = NULL;
373 // Find mode 374 // Find mode
374 int i, len = config->modes->length; 375 int i, len = config->modes->length;
375 for (i = 0; i < len; ++i) { 376 for (i = 0; i < len; ++i) {
376 struct sway_mode *find = config->modes->items[i]; 377 struct sway_mode *find = config->modes->items[i];
377 if (strcasecmp(find->name, mode_name)==0) { 378 if (strcasecmp(find->name, mode_name) == 0) {
378 mode = find; 379 mode = find;
379 break; 380 break;
380 } 381 }
381 } 382 }
382 // Create mode if it doesnt exist 383 // Create mode if it doesnt exist
383 if (!mode && argc >= 2 && strncmp(argv[1],"{",1) == 0) { 384 if (!mode && mode_make) {
384 mode = malloc(sizeof*mode); 385 mode = malloc(sizeof*mode);
385 mode->name = strdup(mode_name); 386 mode->name = strdup(mode_name);
386 mode->bindings = create_list(); 387 mode->bindings = create_list();
387 list_add(config->modes, mode); 388 list_add(config->modes, mode);
388 } 389 }
389 if (!mode) { 390 if (!mode) {
390 sway_log(L_ERROR, "Invalide mode `%s'", mode_name); 391 sway_log(L_ERROR, "Unknown mode `%s'", mode_name);
391 return false; 392 return false;
392 } 393 }
393 sway_log(L_DEBUG, "Switching to mode `%s'",mode->name); 394 sway_log(L_DEBUG, "Switching to mode `%s'",mode->name);
diff --git a/sway/stringop.c b/sway/stringop.c
index 7de6eded..270e673a 100644
--- a/sway/stringop.c
+++ b/sway/stringop.c
@@ -99,7 +99,7 @@ void free_flat_list(list_t *list) {
99char **split_args(const char *start, int *argc) { 99char **split_args(const char *start, int *argc) {
100 *argc = 0; 100 *argc = 0;
101 int alloc = 2; 101 int alloc = 2;
102 char **parts = malloc(sizeof(char *) * alloc); 102 char **argv = malloc(sizeof(char *) * alloc);
103 bool in_token = false; 103 bool in_token = false;
104 bool in_string = false; 104 bool in_string = false;
105 bool in_char = false; 105 bool in_char = false;
@@ -132,15 +132,16 @@ char **split_args(const char *start, int *argc) {
132 token[end - start] = '\0'; 132 token[end - start] = '\0';
133 strip_quotes(token); 133 strip_quotes(token);
134 unescape_string(token); 134 unescape_string(token);
135 parts[*argc] = token; 135 argv[*argc] = token;
136 if (++*argc == alloc) { 136 if (++*argc + 1 == alloc) {
137 parts = realloc(parts, (alloc *= 2) * sizeof(char *)); 137 argv = realloc(argv, (alloc *= 2) * sizeof(char *));
138 } 138 }
139 } 139 }
140 in_token = false; 140 in_token = false;
141 escaped = false; 141 escaped = false;
142 } 142 }
143 return parts; 143 argv[*argc] = NULL;
144 return argv;
144} 145}
145 146
146void free_argv(int argc, char **argv) { 147void free_argv(int argc, char **argv) {