summaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c
index fb00fd6..59b8012 100644
--- a/src/config.c
+++ b/src/config.c
@@ -33,6 +33,7 @@ static uint32_t fixup_percentage(uint32_t value, uint32_t base, bool is_percent,
static uint32_t parse_anchor(const char *filename, size_t lineno, const char *str, bool *err);
static bool parse_bool(const char *filename, size_t lineno, const char *str, bool *err);
+static wchar_t parse_wchar(const char *filename, size_t lineno, const char *str, bool *err);
static struct color parse_color(const char *filename, size_t lineno, const char *str, bool *err);
static uint32_t parse_uint32(const char *filename, size_t lineno, const char *str, bool *err);
static int32_t parse_int32(const char *filename, size_t lineno, const char *str, bool *err);
@@ -357,6 +358,22 @@ bool parse_option(struct tofi *tofi, const char *filename, size_t lineno, const
tofi->fuzzy_match = parse_bool(filename, lineno, value, &err);
} else if (strcasecmp(option, "require-match") == 0) {
tofi->require_match = parse_bool(filename, lineno, value, &err);
+ } else if (strcasecmp(option, "hide-input") == 0) {
+ tofi->window.entry.hide_input = parse_bool(filename, lineno, value, &err);
+ } else if (strcasecmp(option, "hidden-character") == 0) {
+ /* Unicode handling is ugly. */
+ wchar_t wc = parse_wchar(filename, lineno, value, &err);
+ size_t buf_len = N_ELEM(tofi->window.entry.hidden_character_mb) + 1;
+ char *buf = xmalloc(buf_len);
+ size_t char_len = snprintf(buf, buf_len, "%lc", wc);
+ if (char_len >= buf_len) {
+ PARSE_ERROR(filename, lineno, "Character \"%lc\" is too large.\n", value);
+ err = true;
+ } else {
+ memcpy(tofi->window.entry.hidden_character_mb, buf, char_len);
+ tofi->window.entry.hidden_character_mb_length = char_len;
+ }
+ free(buf);
} else if (strcasecmp(option, "drun-launch") == 0) {
tofi->drun_launch = parse_bool(filename, lineno, value, &err);
} else if (strcasecmp(option, "drun-print-exec") == 0) {
@@ -507,6 +524,23 @@ bool parse_bool(const char *filename, size_t lineno, const char *str, bool *err)
return false;
}
+wchar_t parse_wchar(const char *filename, size_t lineno, const char *str, bool *err)
+{
+ size_t len = strlen(str);
+ wchar_t ch;
+ size_t ret = mbrtowc(&ch, str, len, NULL);
+ if (ret == (size_t)-2) {
+ return 0;
+ } else if (ret != len) {
+ PARSE_ERROR(filename, lineno, "Failed to parse \"%s\" as a character.\n", str);
+ if (err) {
+ *err = true;
+ }
+ return 0;
+ }
+ return ch;
+}
+
uint32_t parse_anchor(const char *filename, size_t lineno, const char *str, bool *err)
{
if(strcasecmp(str, "top-left") == 0) {