From 7c810dc344c28d1876c5ee158cb0806289d0f813 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Wed, 30 May 2018 13:20:02 -0400 Subject: Make command block implementation generic --- sway/commands/mode.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'sway/commands/mode.c') diff --git a/sway/commands/mode.c b/sway/commands/mode.c index c30a8bac..31d0f251 100644 --- a/sway/commands/mode.c +++ b/sway/commands/mode.c @@ -7,6 +7,13 @@ #include "sway/ipc-server.h" #include "list.h" #include "log.h" +#include "stringop.h" + +// Must be in order for the bsearch +static struct cmd_handler mode_handlers[] = { + { "bindcode", cmd_bindcode }, + { "bindsym", cmd_bindsym } +}; struct cmd_results *cmd_mode(int argc, char **argv) { struct cmd_results *error = NULL; @@ -14,12 +21,12 @@ struct cmd_results *cmd_mode(int argc, char **argv) { return error; } - const char *mode_name = argv[0]; - bool new_mode = (argc == 2 && strcmp(argv[1], "{") == 0); - if (new_mode && !config->reading) { + if (argc > 1 && !config->reading) { return cmd_results_new(CMD_FAILURE, "mode", "Can only be used in config file."); } + + const char *mode_name = argv[0]; struct sway_mode *mode = NULL; // Find mode for (int i = 0; i < config->modes->length; ++i) { @@ -30,7 +37,7 @@ struct cmd_results *cmd_mode(int argc, char **argv) { } } // Create mode if it doesn't exist - if (!mode && new_mode) { + if (!mode && argc > 1) { mode = calloc(1, sizeof(struct sway_mode)); if (!mode) { return cmd_results_new(CMD_FAILURE, @@ -46,14 +53,21 @@ struct cmd_results *cmd_mode(int argc, char **argv) { "mode", "Unknown mode `%s'", mode_name); return error; } - if ((config->reading && new_mode) || (!config->reading && !new_mode)) { + if ((config->reading && argc > 1) || (!config->reading && argc == 1)) { wlr_log(L_DEBUG, "Switching to mode `%s'",mode->name); } // Set current mode config->current_mode = mode; - if (!new_mode) { + if (argc == 1) { // trigger IPC mode event ipc_event_mode(config->current_mode->name); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } - return cmd_results_new(new_mode ? CMD_BLOCK_MODE : CMD_SUCCESS, NULL, NULL); + + // Create binding + struct cmd_results *result = subcommand(argv + 1, argc - 1, mode_handlers, + sizeof(mode_handlers)); + config->current_mode = config->modes->items[0]; + + return result; } -- cgit v1.2.3 From 8bfa2def8876bb507aa0174e6b159a0a226889b4 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Wed, 30 May 2018 22:23:11 -0400 Subject: Address first round of review for generic blocks --- common/readline.c | 19 +++++++++++++------ include/readline.h | 2 +- include/sway/commands.h | 4 ++-- sway/commands.c | 4 ++-- sway/commands/bar.c | 4 ++-- sway/commands/bar/colors.c | 2 +- sway/commands/input.c | 4 ++-- sway/commands/mode.c | 4 ++-- sway/commands/seat.c | 4 ++-- sway/config.c | 19 +++++++------------ 10 files changed, 34 insertions(+), 32 deletions(-) (limited to 'sway/commands/mode.c') diff --git a/common/readline.c b/common/readline.c index abe986c4..f637b64d 100644 --- a/common/readline.c +++ b/common/readline.c @@ -1,3 +1,4 @@ +#define _POSIX_C_SOURCE 200809L #include "readline.h" #include "log.h" #include @@ -48,15 +49,21 @@ char *read_line(FILE *file) { return string; } -char *peek_line(FILE *file, int offset) { - int pos = ftell(file); - char *line = NULL; +char *peek_line(FILE *file, int offset, long *position) { + long pos = ftell(file); + size_t length = 1; + char *line = calloc(1, length); for (int i = 0; i <= offset; i++) { - free(line); - line = read_line(file); - if (!line) { + ssize_t read = getline(&line, &length, file); + if (read < 0) { break; } + if (line[read - 1] == '\n') { + line[read - 1] = '\0'; + } + } + if (position) { + *position = ftell(file); } fseek(file, pos, SEEK_SET); return line; diff --git a/include/readline.h b/include/readline.h index 3f63e917..e1ae2302 100644 --- a/include/readline.h +++ b/include/readline.h @@ -4,7 +4,7 @@ #include char *read_line(FILE *file); -char *peek_line(FILE *file, int offset); +char *peek_line(FILE *file, int offset, long *position); char *read_line_buffer(FILE *file, char *string, size_t string_len); #endif diff --git a/include/sway/commands.h b/include/sway/commands.h index 6e2395bd..593ae0f1 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -60,8 +60,8 @@ struct cmd_results *config_command(char *command); /** * Parse and handle a sub command */ -struct cmd_results *subcommand(char **argv, int argc, - struct cmd_handler *handlers, int handlers_size); +struct cmd_results *config_subcommand(char **argv, int argc, + struct cmd_handler *handlers, size_t handlers_size); /* * Parses a command policy rule. */ diff --git a/sway/commands.c b/sway/commands.c index 825fda8f..3a86ae53 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -376,8 +376,8 @@ cleanup: return results; } -struct cmd_results *subcommand(char **argv, int argc, - struct cmd_handler *handlers, int handlers_size) { +struct cmd_results *config_subcommand(char **argv, int argc, + struct cmd_handler *handlers, size_t handlers_size) { char *command = join_args(argv, argc); wlr_log(L_DEBUG, "Subcommand: %s", command); free(command); diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 358b3893..d84ce808 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -52,7 +52,7 @@ struct cmd_results *cmd_bar(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, "bar", "Can only be used in config file."); } - return subcommand(argv, argc, bar_config_handlers, + return config_subcommand(argv, argc, bar_config_handlers, sizeof(bar_config_handlers)); } @@ -111,5 +111,5 @@ struct cmd_results *cmd_bar(int argc, char **argv) { wlr_log(L_DEBUG, "Creating bar %s", bar->id); } - return subcommand(argv, argc, bar_handlers, sizeof(bar_handlers)); + return config_subcommand(argv, argc, bar_handlers, sizeof(bar_handlers)); } diff --git a/sway/commands/bar/colors.c b/sway/commands/bar/colors.c index 6d3c09b8..8c862ca9 100644 --- a/sway/commands/bar/colors.c +++ b/sway/commands/bar/colors.c @@ -52,7 +52,7 @@ static struct cmd_results *parse_three_colors(char ***colors, } struct cmd_results *bar_cmd_colors(int argc, char **argv) { - return subcommand(argv, argc, bar_colors_handlers, + return config_subcommand(argv, argc, bar_colors_handlers, sizeof(bar_colors_handlers)); } diff --git a/sway/commands/input.c b/sway/commands/input.c index 972160e2..22a0bb7c 100644 --- a/sway/commands/input.c +++ b/sway/commands/input.c @@ -42,8 +42,8 @@ struct cmd_results *cmd_input(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, NULL, "Couldn't allocate config"); } - struct cmd_results *res = subcommand(argv + 1, argc - 1, input_handlers, - sizeof(input_handlers)); + struct cmd_results *res = config_subcommand(argv + 1, argc - 1, + input_handlers, sizeof(input_handlers)); free_input_config(config->handler_context.input_config); config->handler_context.input_config = NULL; diff --git a/sway/commands/mode.c b/sway/commands/mode.c index 31d0f251..00331ccc 100644 --- a/sway/commands/mode.c +++ b/sway/commands/mode.c @@ -65,8 +65,8 @@ struct cmd_results *cmd_mode(int argc, char **argv) { } // Create binding - struct cmd_results *result = subcommand(argv + 1, argc - 1, mode_handlers, - sizeof(mode_handlers)); + struct cmd_results *result = config_subcommand(argv + 1, argc - 1, + mode_handlers, sizeof(mode_handlers)); config->current_mode = config->modes->items[0]; return result; diff --git a/sway/commands/seat.c b/sway/commands/seat.c index 6080bf64..5e3c0bd0 100644 --- a/sway/commands/seat.c +++ b/sway/commands/seat.c @@ -24,8 +24,8 @@ struct cmd_results *cmd_seat(int argc, char **argv) { "Couldn't allocate config"); } - struct cmd_results *res = subcommand(argv + 1, argc - 1, seat_handlers, - sizeof(seat_handlers)); + struct cmd_results *res = config_subcommand(argv + 1, argc - 1, + seat_handlers, sizeof(seat_handlers)); free_seat_config(config->handler_context.seat_config); config->handler_context.seat_config = NULL; diff --git a/sway/config.c b/sway/config.c index edb10bd7..88cc6843 100644 --- a/sway/config.c +++ b/sway/config.c @@ -518,21 +518,20 @@ static int detect_brace_on_following_line(FILE *file, char *line, int lines = 0; if (line[strlen(line) - 1] != '{' && line[strlen(line) - 1] != '}') { char *peeked = NULL; + long position = 0; do { wlr_log(L_DEBUG, "Peeking line %d", line_number + lines + 1); free(peeked); - peeked = peek_line(file, lines); + peeked = peek_line(file, lines, &position); if (peeked) { peeked = strip_whitespace(peeked); } + wlr_log(L_DEBUG, "Peeked line: `%s`", peeked); lines++; } while (peeked && strlen(peeked) == 0); if (peeked && strlen(peeked) == 1 && peeked[0] == '{') { - for (int i = 0; i < lines; i++) { - free(peeked); - peeked = read_line(file); - } + fseek(file, position, SEEK_SET); } else { lines = 0; } @@ -541,7 +540,7 @@ static int detect_brace_on_following_line(FILE *file, char *line, return lines; } -static char *expand_line(char *block, char *line, bool add_brace) { +static char *expand_line(const char *block, const char *line, bool add_brace) { int size = (block ? strlen(block) + 1 : 0) + strlen(line) + (add_brace ? 2 : 0) + 1; char *expanded = calloc(1, size); @@ -549,10 +548,8 @@ static char *expand_line(char *block, char *line, bool add_brace) { wlr_log(L_ERROR, "Cannot allocate expanded line buffer"); return NULL; } - strcat(expanded, block ? block : ""); - strcat(expanded, block ? " " : ""); - strcat(expanded, line); - strcat(expanded, add_brace ? " {" : ""); + snprintf(expanded, size, "%s%s%s%s", block ? block : "", + block ? " " : "", line, add_brace ? " {" : ""); return expanded; } @@ -594,9 +591,7 @@ bool read_config(FILE *file, struct sway_config *config) { // Special case res = config_commands_command(expanded); } else { - wlr_log(L_DEBUG, "Entering c_c"); res = config_command(expanded); - wlr_log(L_DEBUG, "Exiting c_c"); } free(expanded); switch(res->status) { -- cgit v1.2.3