summaryrefslogtreecommitdiff
path: root/src/settings.h
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2018-02-17 18:20:53 -0800
committerVito Caputo <vcaputo@pengaru.com>2018-02-20 13:58:14 -0800
commite223dd74bf9ffd4dee0bcbf5f3cee07643406579 (patch)
tree3414441392a35bfe158b4438ffee9a299fbb48ab /src/settings.h
parent9e6c1726de883b042725ea6630bc4d95e526879a (diff)
settings: introduce abstract settings
Settings will be used to express configurable parameters in the rendering modules and fb backends. The goal is to address both commandline argument setting of parameters, automatic use of defaults, as well as interactive configuration including the outputting of the resulting settings in a form usable as a commandline for future reuse. Since settings can be numerous and highly varied from one module or backend to another, a form similar to the Linux kernel's cmdline or QEMU's approach has been adopted. For example, a complete DRM backend, card selection and config would be: rototiller --video=drm,dev=/dev/dri/card0,connector=LVDS-1,mode=1024x768@60 If any of the above were omitted, then the missing settings would be interactively configured. If you added --defaults, then any omissions would be automatically filled in with the defaults. i.e. rototiller --video=drm,dev=/dev/dri/card4 --defaults would use the preferred connector and mode for that card. rototiller --video=drm --defaults would do the same but also default to the /dev/dri/card0 path. for brevity, I omitted rendering modules from above, but the same approach applies simply to --module=: rototiller --module=sparkler --video=drm --defaults If you ran rototiller without any arguments, then a fully interactive setup would ensue for module and video. If you ran rototiller with just --defaults, then everything is defaulted for you. A default rendering module will be used (the original roto renderer, probably). Note that this commit only adds scaffolding to make this possible, none of this is wired up yet.
Diffstat (limited to 'src/settings.h')
-rw-r--r--src/settings.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/settings.h b/src/settings.h
new file mode 100644
index 0000000..6334faa
--- /dev/null
+++ b/src/settings.h
@@ -0,0 +1,36 @@
+#ifndef _SETTINGS_H
+#define _SETTINGS_H
+
+#include <stdio.h>
+
+/* Individual setting description */
+typedef struct setting_desc_t {
+ const char *name; /* long-form/human name for setting */
+ const char *key; /* short-form/key for setting, used as left side of =value in settings string */
+ const char *regex; /* value must conform to this regex */
+ const char *preferred; /* if there's a default, this is it */
+ const char **values; /* if a set of values is provided, listed here */
+ const char **annotations; /* if a set of values is provided, annotations for those values may be listed here */
+} setting_desc_t;
+
+/* For conveniently representing setting description generators */
+typedef struct setting_desc_generator_t {
+ const char *key; /* key this generator applies to */
+ const char **value_ptr; /* where to put the value */
+ setting_desc_t *(*func)(void *setup_context);
+} setting_desc_generator_t;
+
+typedef struct settings_t settings_t;
+
+settings_t * settings_new(const char *settings);
+void settings_free(settings_t *settings);
+const char * settings_get_value(settings_t *settings, const char *key);
+const char * settings_get_key(settings_t *settings, unsigned pos);
+int settings_add_value(settings_t *settings, const char *key, const char *value);
+char * settings_as_arg(const settings_t *settings);
+int settings_apply_desc_generators(settings_t *settings, const setting_desc_generator_t generators[], unsigned n_generators, void *setup_context, setting_desc_t **next_setting);
+
+setting_desc_t * setting_desc_new(const char *name, const char *key, const char *regex, const char *preferred, const char *values[], const char *annotations[]);
+void setting_desc_free(setting_desc_t *desc);
+
+#endif
© All Rights Reserved