summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-08-05 00:07:16 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-08-05 00:17:33 -0700
commit3cc953518d1c2b84f08f5693d3566db4462623a8 (patch)
tree48f04a0f90bd465d822ec31900a631d88959e5f2 /src
parentd7b92d1b6dd1b152c7263763de7e8f6b174583d4 (diff)
til_setup,*: add til_setup_t.creator pointer
Particularly with nested modules it's annoying to have to stow the module separate from the setup during the setup process. If the baked setup included the module pointer in the non-module-specific-setup part of the setup, then nested settings could finalize using the generic module setup wrapper and just rely on this til_setup_t.creator pointer to contain the appropriate module. Which should enable tossing out a bunch of copy-n-pasta surrounding nested modules setup. Note this has to be a void* since til_setup_t is a generic thing used equally by both the fb code and the module code. Hence why this is called "creator" and not "module", as well as the void* as opposed to til_module_t*. Also if rototiller ever grows a sound backend, the setup machinery will be reused there as well, and it'll be yet another creator handle that isn't an til_fb_ops_t or a til_module_t. It's assumed that the callers producing these setups won't be trying to pass them to the wrong places i.e. a module setup getting passed to an fb backend and vice versa. I'm mildly annoyed about having to move the various til_module_t blocks to above the module's foo_setup(), but it seemed like the least annoying option. This may be revisited.
Diffstat (limited to 'src')
-rw-r--r--src/drm_fb.c69
-rw-r--r--src/mem_fb.c79
-rw-r--r--src/modules/blinds/blinds.c29
-rw-r--r--src/modules/checkers/checkers.c31
-rw-r--r--src/modules/compose/compose.c2
-rw-r--r--src/modules/drizzle/drizzle.c33
-rw-r--r--src/modules/flui2d/flui2d.c27
-rw-r--r--src/modules/mixer/mixer.c31
-rw-r--r--src/modules/moire/moire.c29
-rw-r--r--src/modules/montage/montage.c2
-rw-r--r--src/modules/pixbounce/pixbounce.c24
-rw-r--r--src/modules/plato/plato.c27
-rw-r--r--src/modules/rkt/rkt.c27
-rw-r--r--src/modules/roto/roto.c29
-rw-r--r--src/modules/rtv/rtv.c2
-rw-r--r--src/modules/shapes/shapes.c33
-rw-r--r--src/modules/sparkler/sparkler.c29
-rw-r--r--src/modules/stars/stars.c26
-rw-r--r--src/modules/strobe/strobe.c31
-rw-r--r--src/modules/submit/submit.c29
-rw-r--r--src/modules/swarm/swarm.c27
-rw-r--r--src/modules/voronoi/voronoi.c33
-rw-r--r--src/sdl_fb.c176
-rw-r--r--src/til.c31
-rw-r--r--src/til_setup.c3
-rw-r--r--src/til_setup.h3
26 files changed, 465 insertions, 397 deletions
diff --git a/src/drm_fb.c b/src/drm_fb.c
index d10891b..0b6e053 100644
--- a/src/drm_fb.c
+++ b/src/drm_fb.c
@@ -296,38 +296,6 @@ static void drm_fb_setup_free(til_setup_t *setup)
}
-/* setup is called repeatedly as settings is constructed, until 0 is returned. */
-/* a negative value is returned on error */
-/* positive value indicates another setting is needed, described in next_setting */
-static int drm_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
-{
- drm_fb_setup_t *setup = til_setup_new(settings, sizeof(*setup), drm_fb_setup_free);
- til_setting_desc_generator_t generators[] = {
- {
- .key = "dev",
- .value_ptr = &setup->dev,
- .func = dev_desc_generator
- }, {
- .key = "connector",
- .value_ptr = &setup->connector,
- .func = connector_desc_generator
- }, {
- .key = "mode",
- .value_ptr = &setup->mode,
- .func = mode_desc_generator
- },
- };
-
- if (!drmAvailable())
- return -ENOSYS;
-
- if (!setup)
- return -ENOMEM;
-
- return til_settings_apply_desc_generators(settings, generators, nelems(generators), &setup->til_setup, res_setting, res_desc, res_setup);
-}
-
-
/* lookup a mode string in the given connector returning its respective modeinfo */
static drmModeModeInfo * lookup_mode(drmModeConnector *connector, const char *mode)
{
@@ -563,6 +531,9 @@ static int drm_fb_page_flip(til_fb_t *fb, void *context, void *page)
}
+static int drm_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
til_fb_ops_t drm_fb_ops = {
.setup = drm_fb_setup,
.init = drm_fb_init,
@@ -573,3 +544,37 @@ til_fb_ops_t drm_fb_ops = {
.page_free = drm_fb_page_free,
.page_flip = drm_fb_page_flip
};
+
+
+/* setup is called repeatedly as settings is constructed, until 0 is returned. */
+/* a negative value is returned on error */
+/* positive value indicates another setting is needed, described in next_setting */
+static int drm_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
+{
+ drm_fb_setup_t *setup = til_setup_new(settings, sizeof(*setup), drm_fb_setup_free, &drm_fb_ops);
+ til_setting_desc_generator_t generators[] = {
+ {
+ .key = "dev",
+ .value_ptr = &setup->dev,
+ .func = dev_desc_generator
+ }, {
+ .key = "connector",
+ .value_ptr = &setup->connector,
+ .func = connector_desc_generator
+ }, {
+ .key = "mode",
+ .value_ptr = &setup->mode,
+ .func = mode_desc_generator
+ },
+ };
+
+ if (!drmAvailable())
+ return -ENOSYS;
+
+ if (!setup)
+ return -ENOMEM;
+
+ return til_settings_apply_desc_generators(settings, generators, nelems(generators), &setup->til_setup, res_setting, res_desc, res_setup);
+}
+
+
diff --git a/src/mem_fb.c b/src/mem_fb.c
index ee736c7..bd25265 100644
--- a/src/mem_fb.c
+++ b/src/mem_fb.c
@@ -26,43 +26,6 @@ typedef struct mem_fb_t {
} mem_fb_t;
-static int mem_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
-{
- const char *size;
- int r;
-
- r = til_settings_get_and_describe_value(settings,
- &(til_setting_spec_t){
- .name = "Virtual window size",
- .key = "size",
- .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
- .preferred = "640x480",
- .values = NULL,
- .annotations = NULL
- },
- &size,
- res_setting,
- res_desc);
- if (r)
- return r;
-
- if (res_setup) {
- mem_fb_setup_t *setup;
-
- setup = til_setup_new(settings, sizeof(*setup), NULL);
- if (!setup)
- return -ENOMEM;
-
- /* TODO FIXME: parse errors */
- sscanf(size, "%ux%u", &setup->width, &setup->height);
-
- *res_setup = &setup->til_setup;
- }
-
- return 0;
-}
-
-
static int mem_fb_init(const char *title, const til_setup_t *setup, void **res_context)
{
mem_fb_t *c;
@@ -163,6 +126,9 @@ static int mem_fb_page_flip(til_fb_t *fb, void *context, void *page)
}
+static int mem_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
til_fb_ops_t mem_fb_ops = {
.setup = mem_fb_setup,
.init = mem_fb_init,
@@ -173,3 +139,42 @@ til_fb_ops_t mem_fb_ops = {
.page_free = mem_fb_page_free,
.page_flip = mem_fb_page_flip
};
+
+
+static int mem_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
+{
+ const char *size;
+ int r;
+
+ r = til_settings_get_and_describe_value(settings,
+ &(til_setting_spec_t){
+ .name = "Virtual window size",
+ .key = "size",
+ .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
+ .preferred = "640x480",
+ .values = NULL,
+ .annotations = NULL
+ },
+ &size,
+ res_setting,
+ res_desc);
+ if (r)
+ return r;
+
+ if (res_setup) {
+ mem_fb_setup_t *setup;
+
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &mem_fb_ops);
+ if (!setup)
+ return -ENOMEM;
+
+ /* TODO FIXME: parse errors */
+ sscanf(size, "%ux%u", &setup->width, &setup->height);
+
+ *res_setup = &setup->til_setup;
+ }
+
+ return 0;
+}
+
+
diff --git a/src/modules/blinds/blinds.c b/src/modules/blinds/blinds.c
index 8ffd596..68a387c 100644
--- a/src/modules/blinds/blinds.c
+++ b/src/modules/blinds/blinds.c
@@ -171,6 +171,21 @@ static void blinds_render_fragment(til_module_context_t *context, til_stream_t *
}
+static int blinds_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t blinds_module = {
+ .create_context = blinds_create_context,
+ .prepare_frame = blinds_prepare_frame,
+ .render_fragment = blinds_render_fragment,
+ .setup = blinds_setup,
+ .name = "blinds",
+ .description = "Retro 80s-inspired window blinds (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int blinds_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *orientation;
@@ -225,7 +240,7 @@ static int blinds_setup(const til_settings_t *settings, til_setting_t **res_sett
if (res_setup) {
blinds_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &blinds_module);
if (!setup)
return -ENOMEM;
@@ -246,15 +261,3 @@ static int blinds_setup(const til_settings_t *settings, til_setting_t **res_sett
return 0;
}
-
-
-til_module_t blinds_module = {
- .create_context = blinds_create_context,
- .prepare_frame = blinds_prepare_frame,
- .render_fragment = blinds_render_fragment,
- .setup = blinds_setup,
- .name = "blinds",
- .description = "Retro 80s-inspired window blinds (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/checkers/checkers.c b/src/modules/checkers/checkers.c
index d6530eb..a33a922 100644
--- a/src/modules/checkers/checkers.c
+++ b/src/modules/checkers/checkers.c
@@ -486,6 +486,22 @@ static int checkers_value_to_pos(const char **options, const char *value, unsign
}
+static int checkers_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t checkers_module = {
+ .create_context = checkers_create_context,
+ .destroy_context = checkers_destroy_context,
+ .prepare_frame = checkers_prepare_frame,
+ .render_fragment = checkers_render_fragment,
+ .setup = checkers_setup,
+ .name = "checkers",
+ .description = "Checker-patterned overlay (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int checkers_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *size;
@@ -749,7 +765,7 @@ static int checkers_setup(const til_settings_t *settings, til_setting_t **res_se
if (res_setup) {
checkers_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), checkers_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup), checkers_setup_free, &checkers_module);
if (!setup)
return -ENOMEM;
@@ -825,16 +841,3 @@ static int checkers_setup(const til_settings_t *settings, til_setting_t **res_se
return 0;
}
-
-
-til_module_t checkers_module = {
- .create_context = checkers_create_context,
- .destroy_context = checkers_destroy_context,
- .prepare_frame = checkers_prepare_frame,
- .render_fragment = checkers_render_fragment,
- .setup = checkers_setup,
- .name = "checkers",
- .description = "Checker-patterned overlay (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/compose/compose.c b/src/modules/compose/compose.c
index 5a10113..5420cc3 100644
--- a/src/modules/compose/compose.c
+++ b/src/modules/compose/compose.c
@@ -409,7 +409,7 @@ static int compose_setup(const til_settings_t *settings, til_setting_t **res_set
til_setting_t *layer_setting;
compose_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup) + n_layers * sizeof(*setup->layers), compose_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup) + n_layers * sizeof(*setup->layers), compose_setup_free, &compose_module);
if (!setup)
return -ENOMEM;
diff --git a/src/modules/drizzle/drizzle.c b/src/modules/drizzle/drizzle.c
index d85d904..9ca58f7 100644
--- a/src/modules/drizzle/drizzle.c
+++ b/src/modules/drizzle/drizzle.c
@@ -350,6 +350,23 @@ static void drizzle_finish_frame(til_module_context_t *context, til_stream_t *st
}
+static int drizzle_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t drizzle_module = {
+ .create_context = drizzle_create_context,
+ .destroy_context = drizzle_destroy_context,
+ .prepare_frame = drizzle_prepare_frame,
+ .render_fragment = drizzle_render_fragment,
+ .finish_frame = drizzle_finish_frame,
+ .name = "drizzle",
+ .description = "Classic 2D rain effect (threaded (poorly))",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .setup = drizzle_setup,
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int drizzle_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *viscosity;
@@ -402,7 +419,7 @@ static int drizzle_setup(const til_settings_t *settings, til_setting_t **res_set
drizzle_setup_t *setup;
int i;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &drizzle_module);
if (!setup)
return -ENOMEM;
@@ -424,17 +441,3 @@ static int drizzle_setup(const til_settings_t *settings, til_setting_t **res_set
return 0;
}
-
-
-til_module_t drizzle_module = {
- .create_context = drizzle_create_context,
- .destroy_context = drizzle_destroy_context,
- .prepare_frame = drizzle_prepare_frame,
- .render_fragment = drizzle_render_fragment,
- .finish_frame = drizzle_finish_frame,
- .name = "drizzle",
- .description = "Classic 2D rain effect (threaded (poorly))",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .setup = drizzle_setup,
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/flui2d/flui2d.c b/src/modules/flui2d/flui2d.c
index 147bb32..bfa36fb 100644
--- a/src/modules/flui2d/flui2d.c
+++ b/src/modules/flui2d/flui2d.c
@@ -398,6 +398,20 @@ static void flui2d_render_fragment(til_module_context_t *context, til_stream_t *
}
+static int flui2d_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t flui2d_module = {
+ .create_context = flui2d_create_context,
+ .prepare_frame = flui2d_prepare_frame,
+ .render_fragment = flui2d_render_fragment,
+ .setup = flui2d_setup,
+ .name = "flui2d",
+ .description = "Fluid dynamics simulation in 2D (threaded (poorly))",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+};
+
+
/* Settings hooks for configurable variables */
static int flui2d_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
@@ -523,7 +537,7 @@ static int flui2d_setup(const til_settings_t *settings, til_setting_t **res_sett
if (res_setup) {
flui2d_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &flui2d_module);
if (!setup)
return -ENOMEM;
@@ -554,14 +568,3 @@ static int flui2d_setup(const til_settings_t *settings, til_setting_t **res_sett
return 0;
}
-
-
-til_module_t flui2d_module = {
- .create_context = flui2d_create_context,
- .prepare_frame = flui2d_prepare_frame,
- .render_fragment = flui2d_render_fragment,
- .setup = flui2d_setup,
- .name = "flui2d",
- .description = "Fluid dynamics simulation in 2D (threaded (poorly))",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
-};
diff --git a/src/modules/mixer/mixer.c b/src/modules/mixer/mixer.c
index b9e4bfd..b3559c1 100644
--- a/src/modules/mixer/mixer.c
+++ b/src/modules/mixer/mixer.c
@@ -299,6 +299,22 @@ static void mixer_setup_free(til_setup_t *setup)
}
+static int mixer_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t mixer_module = {
+ .create_context = mixer_create_context,
+ .destroy_context = mixer_destroy_context,
+ .prepare_frame = mixer_prepare_frame,
+ .render_fragment = mixer_render_fragment,
+ .finish_frame = mixer_finish_frame,
+ .name = "mixer",
+ .description = "Module blender",
+ .setup = mixer_setup,
+ .flags = TIL_MODULE_EXPERIMENTAL,
+};
+
+
static int mixer_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *style_values[] = {
@@ -387,7 +403,7 @@ static int mixer_setup(const til_settings_t *settings, til_setting_t **res_setti
if (res_setup) {
mixer_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), mixer_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup), mixer_setup_free, &mixer_module);
if (!setup)
return -ENOMEM;
@@ -427,16 +443,3 @@ static int mixer_setup(const til_settings_t *settings, til_setting_t **res_setti
return 0;
}
-
-
-til_module_t mixer_module = {
- .create_context = mixer_create_context,
- .destroy_context = mixer_destroy_context,
- .prepare_frame = mixer_prepare_frame,
- .render_fragment = mixer_render_fragment,
- .finish_frame = mixer_finish_frame,
- .name = "mixer",
- .description = "Module blender",
- .setup = mixer_setup,
- .flags = TIL_MODULE_EXPERIMENTAL,
-};
diff --git a/src/modules/moire/moire.c b/src/modules/moire/moire.c
index 853b106..9924a10 100644
--- a/src/modules/moire/moire.c
+++ b/src/modules/moire/moire.c
@@ -113,6 +113,21 @@ static void moire_render_fragment(til_module_context_t *context, til_stream_t *s
}
+static int moire_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t moire_module = {
+ .create_context = moire_create_context,
+ .prepare_frame = moire_prepare_frame,
+ .render_fragment = moire_render_fragment,
+ .setup = moire_setup,
+ .name = "moire",
+ .description = "2D Moire interference patterns (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int moire_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *centers;
@@ -143,7 +158,7 @@ static int moire_setup(const til_settings_t *settings, til_setting_t **res_setti
if (res_setup) {
moire_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &moire_module);
if (!setup)
return -ENOMEM;
@@ -154,15 +169,3 @@ static int moire_setup(const til_settings_t *settings, til_setting_t **res_setti
return 0;
}
-
-
-til_module_t moire_module = {
- .create_context = moire_create_context,
- .prepare_frame = moire_prepare_frame,
- .render_fragment = moire_render_fragment,
- .setup = moire_setup,
- .name = "moire",
- .description = "2D Moire interference patterns (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/montage/montage.c b/src/modules/montage/montage.c
index 8efeec1..9864520 100644
--- a/src/modules/montage/montage.c
+++ b/src/modules/montage/montage.c
@@ -307,7 +307,7 @@ static int montage_setup(const til_settings_t *settings, til_setting_t **res_set
til_setting_t *tile_setting;
montage_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup) + n_tiles * sizeof(*setup->tiles), montage_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup) + n_tiles * sizeof(*setup->tiles), montage_setup_free, &montage_module);
if (!setup)
return -ENOMEM;
diff --git a/src/modules/pixbounce/pixbounce.c b/src/modules/pixbounce/pixbounce.c
index fcc3c5b..7dfceaf 100644
--- a/src/modules/pixbounce/pixbounce.c
+++ b/src/modules/pixbounce/pixbounce.c
@@ -315,6 +315,18 @@ static void pixbounce_render_fragment(til_module_context_t *context, til_stream_
ctxt->y = ctxt->y+ctxt->y_dir;
}
+int pixbounce_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+til_module_t pixbounce_module = {
+ .create_context = pixbounce_create_context,
+ .render_fragment = pixbounce_render_fragment,
+ .setup = pixbounce_setup,
+ .name = "pixbounce",
+ .description = "Pixmap bounce",
+ .author = "Philip J Freeman <elektron@halo.nu>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
int pixbounce_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *pixmap_size;
@@ -374,7 +386,7 @@ int pixbounce_setup(const til_settings_t *settings, til_setting_t **res_setting,
if (res_setup) {
pixbounce_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &pixbounce_module);
if (!setup)
return -ENOMEM;
@@ -405,13 +417,3 @@ int pixbounce_setup(const til_settings_t *settings, til_setting_t **res_setting,
return 0;
}
-
-til_module_t pixbounce_module = {
- .create_context = pixbounce_create_context,
- .render_fragment = pixbounce_render_fragment,
- .setup = pixbounce_setup,
- .name = "pixbounce",
- .description = "Pixmap bounce",
- .author = "Philip J Freeman <elektron@halo.nu>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/plato/plato.c b/src/modules/plato/plato.c
index a20137e..89661c3 100644
--- a/src/modules/plato/plato.c
+++ b/src/modules/plato/plato.c
@@ -691,6 +691,20 @@ static void plato_render_fragment(til_module_context_t *context, til_stream_t *s
}
+static int plato_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t plato_module = {
+ .create_context = plato_create_context,
+ .render_fragment = plato_render_fragment,
+ .setup = plato_setup,
+ .name = "plato",
+ .description = "Platonic solids rendered in 3D",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int plato_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *orbit_rate;
@@ -744,7 +758,7 @@ static int plato_setup(const til_settings_t *settings, til_setting_t **res_setti
if (res_setup) {
plato_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &plato_module);
if (!setup)
return -ENOMEM;
@@ -756,14 +770,3 @@ static int plato_setup(const til_settings_t *settings, til_setting_t **res_setti
return 0;
}
-
-
-til_module_t plato_module = {
- .create_context = plato_create_context,
- .render_fragment = plato_render_fragment,
- .setup = plato_setup,
- .name = "plato",
- .description = "Platonic solids rendered in 3D",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/rkt/rkt.c b/src/modules/rkt/rkt.c
index f5f73e7..45073ef 100644
--- a/src/modules/rkt/rkt.c
+++ b/src/modules/rkt/rkt.c
@@ -397,6 +397,20 @@ int rkt_scene_module_setup(const til_settings_t *settings, til_setting_t **res_s
}
+static int rkt_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t rkt_module = {
+ .create_context = rkt_create_context,
+ .destroy_context = rkt_destroy_context,
+ .render_fragment = rkt_render_fragment,
+ .name = "rkt",
+ .description = "GNU Rocket module sequencer",
+ .setup = rkt_setup,
+ .flags = TIL_MODULE_HERMETIC, /* this needs refinement esp. if rkt gets split into a player and editor */
+};
+
+
static int rkt_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const til_settings_t *scenes_settings;
@@ -596,7 +610,7 @@ static int rkt_setup(const til_settings_t *settings, til_setting_t **res_setting
rkt_setup_t *setup;
unsigned ibpm, irpb;
- setup = til_setup_new(settings, sizeof(*setup) + n_scenes * sizeof(*setup->scenes), rkt_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup) + n_scenes * sizeof(*setup->scenes), rkt_setup_free, &rkt_module);
if (!setup)
return -ENOMEM;
@@ -683,14 +697,3 @@ static int rkt_setup(const til_settings_t *settings, til_setting_t **res_setting
return 0;
}
-
-
-til_module_t rkt_module = {
- .create_context = rkt_create_context,
- .destroy_context = rkt_destroy_context,
- .render_fragment = rkt_render_fragment,
- .name = "rkt",
- .description = "GNU Rocket module sequencer",
- .setup = rkt_setup,
- .flags = TIL_MODULE_HERMETIC, /* this needs refinement esp. if rkt gets split into a player and editor */
-};
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c
index 8c9dd99..d60629c 100644
--- a/src/modules/roto/roto.c
+++ b/src/modules/roto/roto.c
@@ -419,6 +419,21 @@ static void roto_setup_free(til_setup_t *setup)
}
+static int roto_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t roto_module = {
+ .create_context = roto_create_context,
+ .destroy_context = roto_destroy_context,
+ .prepare_frame = roto_prepare_frame,
+ .render_fragment = roto_render_fragment,
+ .setup = roto_setup,
+ .name = "roto",
+ .description = "Anti-aliased tiled texture rotation (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+};
+
+
static int roto_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *fill_module, *fill_module_name;
@@ -497,7 +512,7 @@ static int roto_setup(const til_settings_t *settings, til_setting_t **res_settin
if (res_setup) {
roto_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), roto_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup), roto_setup_free, &roto_module);
if (!setup)
return -ENOMEM;
@@ -520,15 +535,3 @@ static int roto_setup(const til_settings_t *settings, til_setting_t **res_settin
return 0;
}
-
-
-til_module_t roto_module = {
- .create_context = roto_create_context,
- .destroy_context = roto_destroy_context,
- .prepare_frame = roto_prepare_frame,
- .render_fragment = roto_render_fragment,
- .setup = roto_setup,
- .name = "roto",
- .description = "Anti-aliased tiled texture rotation (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
-};
diff --git a/src/modules/rtv/rtv.c b/src/modules/rtv/rtv.c
index 445be0f..a9e8678 100644
--- a/src/modules/rtv/rtv.c
+++ b/src/modules/rtv/rtv.c
@@ -520,7 +520,7 @@ static int rtv_setup(const til_settings_t *settings, til_setting_t **res_setting
rtv_setup_t *setup;
/* FIXME: rtv_setup_t.snow_module needs freeing, so we need a bespoke free_func */
- setup = til_setup_new(settings, sizeof(*setup) + sizeof(setup->channels[0]), NULL);
+ setup = til_setup_new(settings, sizeof(*setup) + sizeof(setup->channels[0]), NULL, &rtv_module);
if (!setup)
return -ENOMEM;
diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c
index 56ad35a..e96d806 100644
--- a/src/modules/shapes/shapes.c
+++ b/src/modules/shapes/shapes.c
@@ -476,6 +476,23 @@ static void shapes_finish_frame(til_module_context_t *context, til_stream_t *str
}
+static int shapes_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t shapes_module = {
+ .create_context = shapes_create_context,
+ .destroy_context = shapes_destroy_context,
+ .prepare_frame = shapes_prepare_frame,
+ .render_fragment = shapes_render_fragment,
+ .finish_frame = shapes_finish_frame,
+ .setup = shapes_setup,
+ .name = "shapes",
+ .description = "Procedural 2D shapes (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int shapes_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *type;
@@ -684,7 +701,7 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett
shapes_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &shapes_module);
if (!setup)
return -ENOMEM;
@@ -717,17 +734,3 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett
return 0;
}
-
-
-til_module_t shapes_module = {
- .create_context = shapes_create_context,
- .destroy_context = shapes_destroy_context,
- .prepare_frame = shapes_prepare_frame,
- .render_fragment = shapes_render_fragment,
- .finish_frame = shapes_finish_frame,
- .setup = shapes_setup,
- .name = "shapes",
- .description = "Procedural 2D shapes (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/sparkler/sparkler.c b/src/modules/sparkler/sparkler.c
index 8cd1bf9..1e7e171 100644
--- a/src/modules/sparkler/sparkler.c
+++ b/src/modules/sparkler/sparkler.c
@@ -99,6 +99,21 @@ static void sparkler_render_fragment(til_module_context_t *context, til_stream_t
}
+static int sparkler_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t sparkler_module = {
+ .create_context = sparkler_create_context,
+ .destroy_context = sparkler_destroy_context,
+ .prepare_frame = sparkler_prepare_frame,
+ .render_fragment = sparkler_render_fragment,
+ .setup = sparkler_setup,
+ .name = "sparkler",
+ .description = "Particle system with spatial interactions (threaded (poorly))",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+};
+
+
/* Settings hooks for configurable variables */
static int sparkler_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
@@ -184,7 +199,7 @@ static int sparkler_setup(const til_settings_t *settings, til_setting_t **res_se
if (res_setup) {
sparkler_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &sparkler_module);
if (!setup)
return -ENOMEM;
@@ -206,15 +221,3 @@ static int sparkler_setup(const til_settings_t *settings, til_setting_t **res_se
return 0;
}
-
-
-til_module_t sparkler_module = {
- .create_context = sparkler_create_context,
- .destroy_context = sparkler_destroy_context,
- .prepare_frame = sparkler_prepare_frame,
- .render_fragment = sparkler_render_fragment,
- .setup = sparkler_setup,
- .name = "sparkler",
- .description = "Particle system with spatial interactions (threaded (poorly))",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
-};
diff --git a/src/modules/stars/stars.c b/src/modules/stars/stars.c
index 4e0b4fd..fff6792 100644
--- a/src/modules/stars/stars.c
+++ b/src/modules/stars/stars.c
@@ -248,6 +248,19 @@ static void stars_render_fragment(til_module_context_t *context, til_stream_t *s
}
}
+int stars_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+til_module_t stars_module = {
+ .create_context = stars_create_context,
+ .destroy_context = stars_destroy_context,
+ .render_fragment = stars_render_fragment,
+ .setup = stars_setup,
+ .name = "stars",
+ .description = "Basic starfield",
+ .author = "Philip J Freeman <elektron@halo.nu>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
int stars_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *rot_adj;
@@ -280,7 +293,7 @@ int stars_setup(const til_settings_t *settings, til_setting_t **res_setting, con
if (res_setup) {
stars_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &stars_module);
if (!setup)
return -ENOMEM;
@@ -291,14 +304,3 @@ int stars_setup(const til_settings_t *settings, til_setting_t **res_setting, con
return 0;
}
-
-til_module_t stars_module = {
- .create_context = stars_create_context,
- .destroy_context = stars_destroy_context,
- .render_fragment = stars_render_fragment,
- .setup = stars_setup,
- .name = "stars",
- .description = "Basic starfield",
- .author = "Philip J Freeman <elektron@halo.nu>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/strobe/strobe.c b/src/modules/strobe/strobe.c
index 1ed0b8b..3b90c2d 100644
--- a/src/modules/strobe/strobe.c
+++ b/src/modules/strobe/strobe.c
@@ -89,6 +89,22 @@ static void strobe_finish_frame(til_module_context_t *context, til_stream_t *str
}
+static int strobe_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t strobe_module = {
+ .create_context = strobe_create_context,
+ .prepare_frame = strobe_prepare_frame,
+ .render_fragment = strobe_render_fragment,
+ .finish_frame = strobe_finish_frame,
+ .setup = strobe_setup,
+ .name = "strobe",
+ .description = "Strobe light (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int strobe_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *period;
@@ -123,7 +139,7 @@ static int strobe_setup(const til_settings_t *settings, til_setting_t **res_sett
if (res_setup) {
strobe_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &strobe_module);
if (!setup)
return -ENOMEM;
@@ -134,16 +150,3 @@ static int strobe_setup(const til_settings_t *settings, til_setting_t **res_sett
return 0;
}
-
-
-til_module_t strobe_module = {
- .create_context = strobe_create_context,
- .prepare_frame = strobe_prepare_frame,
- .render_fragment = strobe_render_fragment,
- .finish_frame = strobe_finish_frame,
- .setup = strobe_setup,
- .name = "strobe",
- .description = "Strobe light (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/submit/submit.c b/src/modules/submit/submit.c
index a3f7b25..4952d2d 100644
--- a/src/modules/submit/submit.c
+++ b/src/modules/submit/submit.c
@@ -324,6 +324,21 @@ static void submit_render_fragment(til_module_context_t *context, til_stream_t *
}
+static int submit_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t submit_module = {
+ .create_context = submit_create_context,
+ .destroy_context = submit_destroy_context,
+ .prepare_frame = submit_prepare_frame,
+ .render_fragment = submit_render_fragment,
+ .name = "submit",
+ .description = "Cellular automata conquest game sim (threaded (poorly))",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .setup = submit_setup,
+};
+
+
static int submit_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *values[] = {
@@ -352,7 +367,7 @@ static int submit_setup(const til_settings_t *settings, til_setting_t **res_sett
if (res_setup) {
submit_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &submit_module);
if (!setup)
return -ENOMEM;
@@ -364,15 +379,3 @@ static int submit_setup(const til_settings_t *settings, til_setting_t **res_sett
return 0;
}
-
-
-til_module_t submit_module = {
- .create_context = submit_create_context,
- .destroy_context = submit_destroy_context,
- .prepare_frame = submit_prepare_frame,
- .render_fragment = submit_render_fragment,
- .name = "submit",
- .description = "Cellular automata conquest game sim (threaded (poorly))",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .setup = submit_setup,
-};
diff --git a/src/modules/swarm/swarm.c b/src/modules/swarm/swarm.c
index 97a04d0..9407168 100644
--- a/src/modules/swarm/swarm.c
+++ b/src/modules/swarm/swarm.c
@@ -414,6 +414,20 @@ static void swarm_render_fragment(til_module_context_t *context, til_stream_t *s
}
+static int swarm_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t swarm_module = {
+ .create_context = swarm_create_context,
+ .render_fragment = swarm_render_fragment,
+ .setup = swarm_setup,
+ .name = "swarm",
+ .description = "\"Boids\"-inspired particle swarm in 3D",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int swarm_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *styles[] = {
@@ -441,7 +455,7 @@ static int swarm_setup(const til_settings_t *settings, til_setting_t **res_setti
if (res_setup) {
swarm_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &swarm_module);
if (!setup)
return -ENOMEM;
@@ -455,14 +469,3 @@ static int swarm_setup(const til_settings_t *settings, til_setting_t **res_setti
return 0;
}
-
-
-til_module_t swarm_module = {
- .create_context = swarm_create_context,
- .render_fragment = swarm_render_fragment,
- .setup = swarm_setup,
- .name = "swarm",
- .description = "\"Boids\"-inspired particle swarm in 3D",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/modules/voronoi/voronoi.c b/src/modules/voronoi/voronoi.c
index b2eff94..e4621ab 100644
--- a/src/modules/voronoi/voronoi.c
+++ b/src/modules/voronoi/voronoi.c
@@ -349,6 +349,23 @@ static void voronoi_finish_frame(til_module_context_t *context, til_stream_t *st
}
+static int voronoi_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+til_module_t voronoi_module = {
+ .create_context = voronoi_create_context,
+ .destroy_context = voronoi_destroy_context,
+ .prepare_frame = voronoi_prepare_frame,
+ .render_fragment = voronoi_render_fragment,
+ .finish_frame = voronoi_finish_frame,
+ .setup = voronoi_setup,
+ .name = "voronoi",
+ .description = "Voronoi diagram (threaded)",
+ .author = "Vito Caputo <vcaputo@pengaru.com>",
+ .flags = TIL_MODULE_OVERLAYABLE,
+};
+
+
static int voronoi_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *n_cells;
@@ -403,7 +420,7 @@ static int voronoi_setup(const til_settings_t *settings, til_setting_t **res_set
if (res_setup) {
voronoi_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &voronoi_module);
if (!setup)
return -ENOMEM;
@@ -416,17 +433,3 @@ static int voronoi_setup(const til_settings_t *settings, til_setting_t **res_set
}
return 0;
}
-
-
-til_module_t voronoi_module = {
- .create_context = voronoi_create_context,
- .destroy_context = voronoi_destroy_context,
- .prepare_frame = voronoi_prepare_frame,
- .render_fragment = voronoi_render_fragment,
- .finish_frame = voronoi_finish_frame,
- .setup = voronoi_setup,
- .name = "voronoi",
- .description = "Voronoi diagram (threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .flags = TIL_MODULE_OVERLAYABLE,
-};
diff --git a/src/sdl_fb.c b/src/sdl_fb.c
index 6221a83..16609f8 100644
--- a/src/sdl_fb.c
+++ b/src/sdl_fb.c
@@ -36,92 +36,6 @@ typedef struct sdl_fb_t {
} sdl_fb_t;
-static int sdl_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
-{
- const char *fullscreen_values[] = {
- "off",
- "on",
- NULL
- };
- const char *fullscreen;
- const char *size;
- int r;
-
- r = til_settings_get_and_describe_value(settings,
- &(til_setting_spec_t){
- .name = "SDL fullscreen mode",
- .key = "fullscreen",
- .regex = NULL,
- .preferred = fullscreen_values[0],
- .values = fullscreen_values,
- .annotations = NULL
- },
- &fullscreen,
- res_setting,
- res_desc);
- if (r)
- return r;
-
- if (!strcasecmp(fullscreen, "off")) {
- r = til_settings_get_and_describe_value(settings,
- &(til_setting_spec_t){
- .name = "SDL window size",
- .key = "size",
- .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
- .preferred = "640x480",
- .values = NULL,
- .annotations = NULL
- },
- &size,
- res_setting,
- res_desc);
- if (r)
- return r;
- } else if ((size = til_settings_get_value_by_key(settings, "size", res_setting)) && !(*res_setting)->desc) {
- /* if fullscreen=on AND size=WxH is specified, we'll do a more legacy style SDL fullscreen
- * where it tries to change the video mode. But if size is unspecified, it'll be a desktop
- * style fullscreen where it just uses a fullscreen window in the existing video mode, and
- * we won't forcibly require a size= be specified.
- */
- /* FIXME TODO: this is all copy-n-pasta grossness that wouldn't need to exist if
- * til_settings_get_and_describe_value() just supported optional settings we only
- * describe when they're already present. It just needs something like an optional flag,
- * to be added in a future commit which will remove this hack.
- */
- r = til_setting_desc_new( settings,
- &(til_setting_spec_t){
- .name = "SDL window size",
- .key = "size",
- .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
- .preferred = "640x480",
- .values = NULL,
- .annotations = NULL
- }, res_desc);
- if (r < 0)
- return r;
-
- return 1;
- }
-
- if (res_setup) {
- sdl_fb_setup_t *setup;
-
- setup = til_setup_new(settings, sizeof(*setup), NULL);
- if (!setup)
- return -ENOMEM;
-
- if (!strcasecmp(fullscreen, "on"))
- setup->fullscreen = 1;
-
- if (size)
- sscanf(size, "%u%*[xX]%u", &setup->width, &setup->height);
-
- *res_setup = &setup->til_setup;
- }
-
- return 0;
-}
-
static int sdl_err_to_errno(int err)
{
switch (err) {
@@ -343,6 +257,9 @@ static int sdl_fb_page_flip(til_fb_t *fb, void *context, void *page)
}
+static int sdl_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
til_fb_ops_t sdl_fb_ops = {
.setup = sdl_fb_setup,
.init = sdl_fb_init,
@@ -353,3 +270,90 @@ til_fb_ops_t sdl_fb_ops = {
.page_free = sdl_fb_page_free,
.page_flip = sdl_fb_page_flip
};
+
+
+static int sdl_fb_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
+{
+ const char *fullscreen_values[] = {
+ "off",
+ "on",
+ NULL
+ };
+ const char *fullscreen;
+ const char *size;
+ int r;
+
+ r = til_settings_get_and_describe_value(settings,
+ &(til_setting_spec_t){
+ .name = "SDL fullscreen mode",
+ .key = "fullscreen",
+ .regex = NULL,
+ .preferred = fullscreen_values[0],
+ .values = fullscreen_values,
+ .annotations = NULL
+ },
+ &fullscreen,
+ res_setting,
+ res_desc);
+ if (r)
+ return r;
+
+ if (!strcasecmp(fullscreen, "off")) {
+ r = til_settings_get_and_describe_value(settings,
+ &(til_setting_spec_t){
+ .name = "SDL window size",
+ .key = "size",
+ .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
+ .preferred = "640x480",
+ .values = NULL,
+ .annotations = NULL
+ },
+ &size,
+ res_setting,
+ res_desc);
+ if (r)
+ return r;
+ } else if ((size = til_settings_get_value_by_key(settings, "size", res_setting)) && !(*res_setting)->desc) {
+ /* if fullscreen=on AND size=WxH is specified, we'll do a more legacy style SDL fullscreen
+ * where it tries to change the video mode. But if size is unspecified, it'll be a desktop
+ * style fullscreen where it just uses a fullscreen window in the existing video mode, and
+ * we won't forcibly require a size= be specified.
+ */
+ /* FIXME TODO: this is all copy-n-pasta grossness that wouldn't need to exist if
+ * til_settings_get_and_describe_value() just supported optional settings we only
+ * describe when they're already present. It just needs something like an optional flag,
+ * to be added in a future commit which will remove this hack.
+ */
+ r = til_setting_desc_new( settings,
+ &(til_setting_spec_t){
+ .name = "SDL window size",
+ .key = "size",
+ .regex = "[1-9][0-9]*[xX][1-9][0-9]*",
+ .preferred = "640x480",
+ .values = NULL,
+ .annotations = NULL
+ }, res_desc);
+ if (r < 0)
+ return r;
+
+ return 1;
+ }
+
+ if (res_setup) {
+ sdl_fb_setup_t *setup;
+
+ setup = til_setup_new(settings, sizeof(*setup), NULL, &sdl_fb_ops);
+ if (!setup)
+ return -ENOMEM;
+
+ if (!strcasecmp(fullscreen, "on"))
+ setup->fullscreen = 1;
+
+ if (size)
+ sscanf(size, "%u%*[xX]%u", &setup->width, &setup->height);
+
+ *res_setup = &setup->til_setup;
+ }
+
+ return 0;
+}
diff --git a/src/til.c b/src/til.c
index 4629dd7..3154733 100644
--- a/src/til.c
+++ b/src/til.c
@@ -250,6 +250,20 @@ static void _ref_setup_free(til_setup_t *setup)
}
+static int _ref_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
+
+
+static til_module_t _ref_module = {
+ .create_context = _ref_create_context,
+ .destroy_context = _ref_destroy_context,
+ .render_fragment = _ref_render_fragment,
+ .setup = _ref_setup,
+ .name = "ref",
+ .description = "built-in context referencer",
+ .author = "built-in",
+};
+
+
static int _ref_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup)
{
const char *path;
@@ -271,7 +285,7 @@ static int _ref_setup(const til_settings_t *settings, til_setting_t **res_settin
if (res_setup) {
_ref_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), _ref_setup_free);
+ setup = til_setup_new(settings, sizeof(*setup), _ref_setup_free, &_ref_module);
if (!setup)
return -ENOMEM;
@@ -289,17 +303,6 @@ static int _ref_setup(const til_settings_t *settings, til_setting_t **res_settin
}
-static til_module_t _ref_module = {
- .create_context = _ref_create_context,
- .destroy_context = _ref_destroy_context,
- .render_fragment = _ref_render_fragment,
- .setup = _ref_setup,
- .name = "ref",
- .description = "built-in context referencer",
- .author = "built-in",
-};
-
-
const til_module_t * til_lookup_module(const char *name)
{
static const til_module_t *builtins[] = {
@@ -658,7 +661,7 @@ int til_module_setup_randomize(const til_module_t *module, til_settings_t *setti
if (!module->setup) {
til_setup_t *setup;
- setup = til_setup_new(settings, sizeof(*setup), NULL);
+ setup = til_setup_new(settings, sizeof(*setup), NULL, module);
if (!setup)
r = -ENOMEM;
else
@@ -762,7 +765,7 @@ int til_module_setup_finalize(const til_module_t *module, const til_settings_t *
if (!module->setup) {
til_setup_t *setup;
- setup = til_setup_new(module_settings, sizeof(*setup), NULL);
+ setup = til_setup_new(module_settings, sizeof(*setup), NULL, module);
if (!setup)
return -ENOMEM;
diff --git a/src/til_setup.c b/src/til_setup.c
index bd57073..ce95366 100644
--- a/src/til_setup.c
+++ b/src/til_setup.c
@@ -22,7 +22,7 @@
* as the callers are generally using it in place of calloc(), and assign it to a
* container struct of some other type but having an embedded til_setup_t.
*/
-void * til_setup_new(const til_settings_t *settings, size_t size, void (*free_func)(til_setup_t *setup))
+void * til_setup_new(const til_settings_t *settings, size_t size, void (*free_func)(til_setup_t *setup), const void *creator)
{
char *path_buf = NULL;
size_t path_len;
@@ -53,6 +53,7 @@ void * til_setup_new(const til_settings_t *settings, size_t size, void (*free_fu
setup->path_hash = til_jenkins((uint8_t *)path_buf, path_len + 1 /* include the \0 */);
setup->refcount = 1;
setup->free = free_func;
+ setup->creator = creator;
return setup;
}
diff --git a/src/til_setup.h b/src/til_setup.h
index 06ed4ea..905dd6e 100644
--- a/src/til_setup.h
+++ b/src/til_setup.h
@@ -11,9 +11,10 @@ struct til_setup_t {
uint32_t path_hash;
unsigned refcount;
void (*free)(til_setup_t *setup);
+ const void *creator;
};
-void * til_setup_new(const til_settings_t *settings, size_t size, void (*free_func)(til_setup_t *setup));
+void * til_setup_new(const til_settings_t *settings, size_t size, void (*free_func)(til_setup_t *setup), const void *creator);
void * til_setup_ref(til_setup_t *setup);
void * til_setup_free(til_setup_t *setup);
© All Rights Reserved