diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2018-02-17 18:20:53 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2018-02-20 13:58:14 -0800 |
commit | e223dd74bf9ffd4dee0bcbf5f3cee07643406579 (patch) | |
tree | 3414441392a35bfe158b4438ffee9a299fbb48ab /src/settings.h | |
parent | 9e6c1726de883b042725ea6630bc4d95e526879a (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.h | 36 |
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 |