summaryrefslogtreecommitdiffstats
path: root/src/config.c
diff options
context:
space:
mode:
authorPatrick McDermott <pj@pehjota.net>2017-10-04 18:14:11 (EDT)
committer Patrick McDermott <pj@pehjota.net>2017-10-04 18:14:11 (EDT)
commit2f6902ce85cab3f1fba0ad32b1e11707c4206f4c (patch)
treea0f060d2e22e1682345a970c6f0d2f62889ca2d0 /src/config.c
parent700e2658c496d0bdb241fa8a32708bd4b613a729 (diff)
downloadmarquee-2f6902ce85cab3f1fba0ad32b1e11707c4206f4c.zip
marquee-2f6902ce85cab3f1fba0ad32b1e11707c4206f4c.tar.gz
marquee-2f6902ce85cab3f1fba0ad32b1e11707c4206f4c.tar.bz2
src/config.[ch]: Support setting integer and double values
Also declare mq_config_set() in src/config.h.
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/config.c b/src/config.c
index cf2d154..d4de2af 100644
--- a/src/config.c
+++ b/src/config.c
@@ -28,10 +28,14 @@
enum type {
TYPE_BOOLEAN,
+ TYPE_INTEGER,
+ TYPE_DOUBLE,
};
union callback {
void (*boolean_cb)(const gchar *, gboolean, gpointer);
+ void (*integer_cb)(const gchar *, gint, gpointer);
+ void (*double_cb)(const gchar *, gdouble, gpointer);
};
struct callbacks {
@@ -76,6 +80,16 @@ set_type_or_run_callbacks(MqConfig *config, const gchar *name, gpointer value,
*((gboolean *) value),
cbs->user_data);
break;
+ case TYPE_INTEGER:
+ cbs->cb.integer_cb(name,
+ *((gint *) value),
+ cbs->user_data);
+ break;
+ case TYPE_DOUBLE:
+ cbs->cb.double_cb(name,
+ *((gdouble *) value),
+ cbs->user_data);
+ break;
}
}
}
@@ -136,9 +150,38 @@ mq_config_set_boolean(MqConfig *config, const gchar *name, gboolean value)
}
void
+mq_config_set_integer(MqConfig *config, const gchar *name, gint value)
+{
+ gchar *group;
+ gchar *key;
+
+ split_name(name, &group, &key);
+
+ g_key_file_set_integer(config->key_file, group, name, value);
+
+ set_type_or_run_callbacks(config, name, &value, TYPE_INTEGER);
+}
+
+void
+mq_config_set_double(MqConfig *config, const gchar *name, gdouble value)
+{
+ gchar *group;
+ gchar *key;
+
+ split_name(name, &group, &key);
+
+ g_key_file_set_double(config->key_file, group, name, value);
+
+ set_type_or_run_callbacks(config, name, &value, TYPE_DOUBLE);
+}
+
+gboolean
mq_config_set(MqConfig *config, const gchar *name, const gchar *value)
{
struct item *item;
+ gint integer_value;
+ gdouble double_value;
+ gchar *endptr;
item = g_hash_table_lookup(config->types_and_cbs, name);
g_assert(item);
@@ -149,6 +192,23 @@ mq_config_set(MqConfig *config, const gchar *name, const gchar *value)
* mq_html_input_checkbox()). */
mq_config_set_boolean(config, name,
value[1] == 'n' ? TRUE : FALSE);
- break;
+ return TRUE;
+ case TYPE_INTEGER:
+ integer_value = strtol(value, &endptr, 10);
+ if (*endptr != '\0') {
+ return FALSE;
+ }
+ mq_config_set_integer(config, name, integer_value);
+ return TRUE;
+ case TYPE_DOUBLE:
+ double_value = strtod(value, &endptr);
+ if (*endptr != '\0') {
+ return FALSE;
+ }
+ mq_config_set_double(config, name, double_value);
+ return TRUE;
}
+
+ g_assert_not_reached();
+ return FALSE;
}