diff options
author | Phil Jones <philj56@gmail.com> | 2022-06-23 10:15:28 +0100 |
---|---|---|
committer | Phil Jones <philj56@gmail.com> | 2022-06-23 10:15:28 +0100 |
commit | 7756d7f462b1223f253805967118e08224ff9aaf (patch) | |
tree | 00140512a07905aa578865240a613a623082508d /src/config.c | |
parent | c149768f888efbf9ab237730280402bd607894ac (diff) |
Allow percentages for window size & margins.
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/src/config.c b/src/config.c index fa1b41a..e68a725 100644 --- a/src/config.c +++ b/src/config.c @@ -21,11 +21,12 @@ static char *strip(const char *str); static bool parse_option(struct tofi *tofi, size_t lineno, const char *option, const char *value); static char *get_config_path(void); -static int parse_anchor(size_t lineno, const char *str, bool *err); +static int8_t parse_anchor(size_t lineno, const char *str, bool *err); static bool parse_bool(size_t lineno, const char *str, bool *err); static struct color parse_color(size_t lineno, const char *str, bool *err); static uint32_t parse_uint32(size_t lineno, const char *str, bool *err); static int32_t parse_int32(size_t lineno, const char *str, bool *err); +static uint32_t parse_uint32_percent(size_t lineno, const char *str, bool *err, uint32_t max); /* * Function-like macro. Yuck. @@ -237,10 +238,7 @@ bool parse_option(struct tofi *tofi, size_t lineno, const char *option, const ch } else if (strcasecmp(option, "entry-color") == 0) { tofi->window.entry.background_color = parse_color(lineno, value, &err); } else if (strcasecmp(option, "font-name") == 0) { - if (tofi->window.entry.font_name) { - free(tofi->window.entry.font_name); - } - tofi->window.entry.font_name = strdup(value); + snprintf(tofi->window.entry.font_name, N_ELEM(tofi->window.entry.font_name), "%s", value); } else if (strcasecmp(option, "font-size") == 0) { tofi->window.entry.font_size = parse_uint32(lineno, value, &err); } else if (strcasecmp(option, "num-results") == 0) { @@ -250,10 +248,7 @@ bool parse_option(struct tofi *tofi, size_t lineno, const char *option, const ch } else if (strcasecmp(option, "outline-color") == 0) { tofi->window.entry.border.outline_color = parse_color(lineno, value, &err); } else if (strcasecmp(option, "prompt-text") == 0) { - if (tofi->window.entry.prompt_text) { - free(tofi->window.entry.prompt_text); - } - tofi->window.entry.prompt_text = strdup(value); + snprintf(tofi->window.entry.prompt_text, N_ELEM(tofi->window.entry.prompt_text), "%s", value); } else if (strcasecmp(option, "result-padding") == 0) { tofi->window.entry.result_padding = parse_int32(lineno, value, &err); } else if (strcasecmp(option, "border-width") == 0) { @@ -265,17 +260,17 @@ bool parse_option(struct tofi *tofi, size_t lineno, const char *option, const ch } else if (strcasecmp(option, "selection-color") == 0) { tofi->window.entry.selection_color = parse_color(lineno, value, &err); } else if (strcasecmp(option, "width") == 0) { - tofi->window.width = parse_uint32(lineno, value, &err); + tofi->window.width = parse_uint32_percent(lineno, value, &err, tofi->output_width / tofi->window.scale); } else if (strcasecmp(option, "height") == 0) { - tofi->window.height = parse_uint32(lineno, value, &err); + tofi->window.height = parse_uint32_percent(lineno, value, &err, tofi->output_height / tofi->window.scale); } else if (strcasecmp(option, "margin-top") == 0) { - tofi->window.margin_top = parse_uint32(lineno, value, &err); + tofi->window.margin_top = parse_uint32_percent(lineno, value, &err, tofi->output_height / tofi->window.scale); } else if (strcasecmp(option, "margin-bottom") == 0) { - tofi->window.margin_bottom = parse_uint32(lineno, value, &err); + tofi->window.margin_bottom = parse_uint32_percent(lineno, value, &err, tofi->output_height / tofi->window.scale); } else if (strcasecmp(option, "margin-left") == 0) { - tofi->window.margin_left = parse_uint32(lineno, value, &err); + tofi->window.margin_left = parse_uint32_percent(lineno, value, &err, tofi->output_width / tofi->window.scale); } else if (strcasecmp(option, "margin-right") == 0) { - tofi->window.margin_right = parse_uint32(lineno, value, &err); + tofi->window.margin_right = parse_uint32_percent(lineno, value, &err, tofi->output_width / tofi->window.scale); } else if (strcasecmp(option, "horizontal") == 0) { tofi->window.entry.horizontal = parse_bool(lineno, value, &err); } else if (strcasecmp(option, "hide-cursor") == 0) { @@ -327,7 +322,7 @@ bool parse_bool(size_t lineno, const char *str, bool *err) return false; } -int parse_anchor(size_t lineno, const char *str, bool *err) +int8_t parse_anchor(size_t lineno, const char *str, bool *err) { if(strcasecmp(str, "top-left") == 0) { return ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP @@ -410,3 +405,27 @@ int32_t parse_int32(size_t lineno, const char *str, bool *err) } return ret; } + +uint32_t parse_uint32_percent(size_t lineno, const char *str, bool *err, uint32_t max) +{ + errno = 0; + char *endptr; + int32_t ret = strtoul(str, &endptr, 0); + if (endptr == str) { + PARSE_ERROR(lineno, "Failed to parse \"%s\" as unsigned int.\n", str); + if (err) { + *err = true; + } + } else if (errno || ret < 0) { + PARSE_ERROR(lineno, "Unsigned int value \"%s\" out of range.\n", str); + if (err) { + *err = true; + } + } + if (!err || !*err) { + if (*endptr == '%') { + ret = max * ret / 100; + } + } + return ret; +} |