summaryrefslogtreecommitdiff
path: root/src/settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings.c')
-rw-r--r--src/settings.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/settings.c b/src/settings.c
index c00fd94..4bbcf44 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -26,6 +26,16 @@ void settings_destroy() {
HASHMAP_DESTROY(&g_settings.settings);
}
+void setting_set_value(struct setting *setting, struct setting_value val) {
+ if (setting->value.type == val.type) {
+ if (setting->value.type == Setting_String && val.string_value != NULL) {
+ setting->value.string_value = strdup(val.string_value);
+ } else {
+ setting->value = val;
+ }
+ }
+}
+
void settings_register_setting(const char *path,
struct setting_value default_value) {
HASHMAP_APPEND(&g_settings.settings, struct setting_entry, path,
@@ -33,7 +43,8 @@ void settings_register_setting(const char *path,
if (s != NULL) {
struct setting *new_setting = &s->value;
- new_setting->value = default_value;
+ new_setting->value.type = default_value.type;
+ setting_set_value(new_setting, default_value);
strncpy(new_setting->path, path, 128);
new_setting->path[127] = '\0';
}
@@ -64,15 +75,15 @@ void settings_get_prefix(const char *prefix, struct setting **settings_out[],
void settings_set(const char *path, struct setting_value value) {
struct setting *setting = settings_get(path);
- if (setting != NULL && setting->value.type == value.type) {
- setting->value = value;
+ if (setting != NULL) {
+ setting_set_value(setting, value);
}
}
void setting_to_string(struct setting *setting, char *buf, size_t n) {
switch (setting->value.type) {
case Setting_Bool:
- snprintf(buf, n, "%s", setting->value.bool_value ? "true" : false);
+ snprintf(buf, n, "%s", setting->value.bool_value ? "true" : "false");
break;
case Setting_Number:
snprintf(buf, n, "%ld", setting->value.number_value);
@@ -105,7 +116,7 @@ int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]) {
if (argc == 0) {
return minibuffer_prompt(ctx, "setting: ");
} else if (argc == 1) {
- // validate setting here as well
+ // validate setting here as well for a better experience
struct setting *setting = settings_get(argv[0]);
if (setting == NULL) {
minibuffer_echo_timeout(4, "no such setting \"%s\"", argv[0]);
@@ -125,17 +136,19 @@ int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]) {
struct setting_value new_value = {.type = setting->value.type};
switch (setting->value.type) {
case Setting_Bool:
- new_value.bool_value = strncmp("true", value, 4) == 0;
+ new_value.bool_value = strncmp("true", value, 4) == 0 ||
+ strncmp("yes", value, 3) == 0 ||
+ strncmp("on", value, 2) == 0;
break;
case Setting_Number:
new_value.number_value = atol(value);
break;
case Setting_String:
- new_value.string_value = strdup(value);
+ new_value.string_value = (char *)value;
break;
}
- setting->value = new_value;
+ setting_set_value(setting, new_value);
}
return 0;