diff options
-rw-r--r-- | src/drm_fb.c | 69 | ||||
-rw-r--r-- | src/mem_fb.c | 79 | ||||
-rw-r--r-- | src/modules/blinds/blinds.c | 29 | ||||
-rw-r--r-- | src/modules/checkers/checkers.c | 31 | ||||
-rw-r--r-- | src/modules/compose/compose.c | 2 | ||||
-rw-r--r-- | src/modules/drizzle/drizzle.c | 33 | ||||
-rw-r--r-- | src/modules/flui2d/flui2d.c | 27 | ||||
-rw-r--r-- | src/modules/mixer/mixer.c | 31 | ||||
-rw-r--r-- | src/modules/moire/moire.c | 29 | ||||
-rw-r--r-- | src/modules/montage/montage.c | 2 | ||||
-rw-r--r-- | src/modules/pixbounce/pixbounce.c | 24 | ||||
-rw-r--r-- | src/modules/plato/plato.c | 27 | ||||
-rw-r--r-- | src/modules/rkt/rkt.c | 27 | ||||
-rw-r--r-- | src/modules/roto/roto.c | 29 | ||||
-rw-r--r-- | src/modules/rtv/rtv.c | 2 | ||||
-rw-r--r-- | src/modules/shapes/shapes.c | 33 | ||||
-rw-r--r-- | src/modules/sparkler/sparkler.c | 29 | ||||
-rw-r--r-- | src/modules/stars/stars.c | 26 | ||||
-rw-r--r-- | src/modules/strobe/strobe.c | 31 | ||||
-rw-r--r-- | src/modules/submit/submit.c | 29 | ||||
-rw-r--r-- | src/modules/swarm/swarm.c | 27 | ||||
-rw-r--r-- | src/modules/voronoi/voronoi.c | 33 | ||||
-rw-r--r-- | src/sdl_fb.c | 176 | ||||
-rw-r--r-- | src/til.c | 31 | ||||
-rw-r--r-- | src/til_setup.c | 3 | ||||
-rw-r--r-- | src/til_setup.h | 3 |
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; +} @@ -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); |