summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am2
-rw-r--r--src/til.c198
-rw-r--r--src/til.h1
-rw-r--r--src/til_builtins.c167
4 files changed, 183 insertions, 185 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 094f295..fee59f5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
SUBDIRS = libs modules
noinst_LTLIBRARIES = libtil.la
-libtil_la_SOURCES = til.c til.h til_args.c til_args.h til_fb.c til_fb.h til_jenkins.c til_jenkins.h til_limits.h til_module_context.c til_module_context.h til_settings.h til_settings.c til_setup.c til_setup.h til_str.c til_str.h til_stream.c til_stream.h til_tap.h til_threads.c til_threads.h til_util.c til_util.h
+libtil_la_SOURCES = til.c til.h til_args.c til_args.h til_builtins.c til_fb.c til_fb.h til_jenkins.c til_jenkins.h til_limits.h til_module_context.c til_module_context.h til_settings.h til_settings.c til_setup.c til_setup.h til_str.c til_str.h til_stream.c til_stream.h til_tap.h til_threads.c til_threads.h til_util.c til_util.h
libtil_la_CPPFLAGS = -I@top_srcdir@/src
libtil_la_LIBADD = modules/blinds/libblinds.la modules/checkers/libcheckers.la modules/compose/libcompose.la modules/drizzle/libdrizzle.la modules/flui2d/libflui2d.la modules/julia/libjulia.la modules/meta2d/libmeta2d.la modules/mixer/libmixer.la modules/moire/libmoire.la modules/montage/libmontage.la modules/pixbounce/libpixbounce.la modules/plasma/libplasma.la modules/plato/libplato.la modules/ray/libray.la modules/rkt/librkt.la modules/roto/libroto.la modules/rtv/librtv.la modules/shapes/libshapes.la modules/signals/libsignals.la modules/snow/libsnow.la modules/sparkler/libsparkler.la modules/spiro/libspiro.la modules/stars/libstars.la modules/strobe/libstrobe.la modules/submit/libsubmit.la modules/swab/libswab.la modules/swarm/libswarm.la modules/voronoi/libvoronoi.la libs/grid/libgrid.la libs/puddle/libpuddle.la libs/ray/libray.la libs/rocket/librocket.la libs/sig/libsig.la libs/txt/libtxt.la libs/ascii/libascii.la libs/din/libdin.la
diff --git a/src/til.c b/src/til.c
index 3154733..100621d 100644
--- a/src/til.c
+++ b/src/til.c
@@ -57,6 +57,11 @@ extern til_module_t swab_module;
extern til_module_t swarm_module;
extern til_module_t voronoi_module;
+/* built-ins (til_builtins.c) */
+extern til_module_t _blank_module;
+extern til_module_t _noop_module;
+extern til_module_t _ref_module;
+
static const til_module_t *modules[] = {
&blinds_module,
&checkers_module,
@@ -86,6 +91,11 @@ static const til_module_t *modules[] = {
&swab_module,
&swarm_module,
&voronoi_module,
+
+ /* built-ins at the end */
+ &_blank_module,
+ &_noop_module,
+ &_ref_module,
};
@@ -143,193 +153,13 @@ unsigned til_ticks_now(void)
}
-/* "blank" built-in module */
-static void _blank_prepare_frame(til_module_context_t *context, til_stream_t *stream, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
-{
- *res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
-}
-
-
-static void _blank_render_fragment(til_module_context_t *context, til_stream_t *stream, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
-{
- til_fb_fragment_clear(*fragment_ptr);
-}
-
-
-static til_module_t _blank_module = {
- .prepare_frame = _blank_prepare_frame,
- .render_fragment = _blank_render_fragment,
- .name = "blank",
- .description = "built-in blanker",
- .author = "built-in",
-};
-
-
-/* "noop" built-in module */
-static til_module_t _noop_module = {
- .name = "noop",
- .description = "built-in nothing-doer",
- .author = "built-in",
-};
-
-
-/* "ref" built-in module */
-#include "libs/txt/txt.h" /* for rendering some diagnostics */
-
-typedef struct _ref_setup_t {
- til_setup_t til_setup;
-
- char *path;
-} _ref_setup_t;
-
-
-typedef struct _ref_context_t {
- til_module_context_t til_module_context;
-
- til_module_context_t *ref;
-} _ref_context_t;
-
-
-static til_module_context_t * _ref_create_context(const til_module_t *module, til_stream_t *stream, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
-{
- _ref_context_t *ctxt;
-
- ctxt = til_module_context_new(module, sizeof(*ctxt), stream, seed, ticks, n_cpus, setup);
- if (!ctxt)
- return NULL;
-
- return &ctxt->til_module_context;
-}
-
-
-static void _ref_destroy_context(til_module_context_t *context)
-{
- _ref_context_t *ctxt = (_ref_context_t *)context;
-
- ctxt->ref = til_module_context_free(ctxt->ref);
- free(context);
-}
-
-
-static void _ref_render_fragment(til_module_context_t *context, til_stream_t *stream, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
-{
- _ref_context_t *ctxt = (_ref_context_t *)context;
- _ref_setup_t *s = (_ref_setup_t *)context->setup;
-
- if (!ctxt->ref) {
- int r;
-
- /* TODO: switch to til_stream_find_module_context(), this clones concept is DOA. */
- r = til_stream_find_module_contexts(stream, s->path, 1, &ctxt->ref);
- if (r < 0) {
- txt_t *msg = txt_newf("%s: BAD PATH \"%s\"", context->setup->path, s->path);
-
- til_fb_fragment_clear(*fragment_ptr);
- txt_render_fragment(msg, *fragment_ptr, 0xffffffff,
- 0, 0,
- (txt_align_t){
- .horiz = TXT_HALIGN_LEFT,
- .vert = TXT_VALIGN_TOP,
- });
- txt_free(msg);
- /* TODO: maybe print all available contexts into the fragment? */
- return;
- }
- }
-
- til_module_render_limited(ctxt->ref, stream, ticks, context->n_cpus, fragment_ptr);
-}
-
-
-static void _ref_setup_free(til_setup_t *setup)
-{
- _ref_setup_t *s = (_ref_setup_t *)setup;
-
- free(s->path);
- free(s);
-}
-
-
-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;
- int r;
-
- r = til_settings_get_and_describe_value(settings,
- &(til_setting_spec_t){
- .name = "Context path to reference",
- .key = "path",
- .regex = "[a-zA-Z0-9/_]+",
- .preferred = "",
- },
- &path,
- res_setting,
- res_desc);
- if (r)
- return r;
-
- if (res_setup) {
- _ref_setup_t *setup;
-
- setup = til_setup_new(settings, sizeof(*setup), _ref_setup_free, &_ref_module);
- if (!setup)
- return -ENOMEM;
-
- setup->path = strdup(path);
- if (!setup->path) {
- til_setup_free(&setup->til_setup);
-
- return -ENOMEM;
- }
-
- *res_setup = &setup->til_setup;
- }
-
- return 0;
-}
-
-
const til_module_t * til_lookup_module(const char *name)
{
- static const til_module_t *builtins[] = {
- &_blank_module,
- &_noop_module,
- &_ref_module,
- };
- static struct {
- const til_module_t **modules;
- size_t n_modules;
- } module_lists[] = {
- {
- builtins,
- nelems(builtins),
- },
- { modules,
- nelems(modules),
- }
- };
-
assert(name);
- for (size_t n = 0; n < nelems(module_lists); n++) {
- for (size_t i = 0; i < module_lists[n].n_modules; i++) {
- if (!strcasecmp(name, module_lists[n].modules[i]->name))
- return module_lists[n].modules[i];
- }
+ for (size_t i = 0; i < nelems(modules); i++) {
+ if (!strcasecmp(name, modules[i]->name))
+ return modules[i];
}
return NULL;
@@ -615,7 +445,7 @@ int til_module_setup(const til_settings_t *settings, til_setting_t **res_setting
res_setting,
res_desc,
res_setup,
- "Renderer Module",
+ "Renderer module",
parent ? TIL_DEFAULT_NESTED_MODULE : TIL_DEFAULT_ROOT_MODULE,
(TIL_MODULE_EXPERIMENTAL | (parent ? TIL_MODULE_HERMETIC : 0)),
NULL);
diff --git a/src/til.h b/src/til.h
index da62456..1b39c06 100644
--- a/src/til.h
+++ b/src/til.h
@@ -23,6 +23,7 @@ typedef struct til_stream_t til_stream_t;
#define TIL_MODULE_OVERLAYABLE 1u /* module is appropriate for overlay use */
#define TIL_MODULE_HERMETIC 2u /* module doesn't work readily with other modules / requires manual settings */
#define TIL_MODULE_EXPERIMENTAL 4u /* module is buggy / unfinished */
+#define TIL_MODULE_BUILTIN 8u /* module is implements "built-in" libtil functionality not intended to be interesting by itself */
struct til_module_t {
til_module_context_t * (*create_context)(const til_module_t *module, til_stream_t *stream, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
diff --git a/src/til_builtins.c b/src/til_builtins.c
new file mode 100644
index 0000000..7a36d23
--- /dev/null
+++ b/src/til_builtins.c
@@ -0,0 +1,167 @@
+#include "til.h"
+#include "til_fb.h"
+#include "til_module_context.h"
+#include "til_settings.h"
+#include "til_stream.h"
+
+#include "libs/txt/txt.h" /* for rendering some diagnostics (ref built-in)) */
+
+
+/* "blank" built-in module */
+static void _blank_prepare_frame(til_module_context_t *context, til_stream_t *stream, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
+{
+ *res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
+}
+
+
+static void _blank_render_fragment(til_module_context_t *context, til_stream_t *stream, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
+{
+ til_fb_fragment_clear(*fragment_ptr);
+}
+
+
+til_module_t _blank_module = {
+ .prepare_frame = _blank_prepare_frame,
+ .render_fragment = _blank_render_fragment,
+ .name = "blank",
+ .description = "Blanker (built-in)",
+ .author = "built-in",
+};
+
+
+/* "noop" built-in module */
+til_module_t _noop_module = {
+ .name = "noop",
+ .description = "Nothing-doer (built-in)",
+ .author = "built-in",
+ .flags = TIL_MODULE_BUILTIN,
+};
+
+
+/* "ref" built-in module */
+typedef struct _ref_setup_t {
+ til_setup_t til_setup;
+
+ char *path;
+} _ref_setup_t;
+
+
+typedef struct _ref_context_t {
+ til_module_context_t til_module_context;
+
+ til_module_context_t *ref;
+} _ref_context_t;
+
+
+static til_module_context_t * _ref_create_context(const til_module_t *module, til_stream_t *stream, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+{
+ _ref_context_t *ctxt;
+
+ ctxt = til_module_context_new(module, sizeof(*ctxt), stream, seed, ticks, n_cpus, setup);
+ if (!ctxt)
+ return NULL;
+
+ return &ctxt->til_module_context;
+}
+
+
+static void _ref_destroy_context(til_module_context_t *context)
+{
+ _ref_context_t *ctxt = (_ref_context_t *)context;
+
+ ctxt->ref = til_module_context_free(ctxt->ref);
+ free(context);
+}
+
+
+static void _ref_render_fragment(til_module_context_t *context, til_stream_t *stream, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
+{
+ _ref_context_t *ctxt = (_ref_context_t *)context;
+ _ref_setup_t *s = (_ref_setup_t *)context->setup;
+
+ if (!ctxt->ref) {
+ int r;
+
+ /* TODO: switch to til_stream_find_module_context(), this clones concept is DOA. */
+ r = til_stream_find_module_contexts(stream, s->path, 1, &ctxt->ref);
+ if (r < 0) {
+ txt_t *msg = txt_newf("%s: BAD PATH \"%s\"", context->setup->path, s->path);
+
+ til_fb_fragment_clear(*fragment_ptr);
+ txt_render_fragment(msg, *fragment_ptr, 0xffffffff,
+ 0, 0,
+ (txt_align_t){
+ .horiz = TXT_HALIGN_LEFT,
+ .vert = TXT_VALIGN_TOP,
+ });
+ txt_free(msg);
+ /* TODO: maybe print all available contexts into the fragment? */
+ return;
+ }
+ }
+
+ til_module_render_limited(ctxt->ref, stream, ticks, context->n_cpus, fragment_ptr);
+}
+
+
+static void _ref_setup_free(til_setup_t *setup)
+{
+ _ref_setup_t *s = (_ref_setup_t *)setup;
+
+ free(s->path);
+ free(s);
+}
+
+
+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);
+
+
+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 = "Context referencer (built-in)",
+ .author = "built-in",
+ .flags = TIL_MODULE_BUILTIN,
+};
+
+
+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;
+ int r;
+
+ r = til_settings_get_and_describe_value(settings,
+ &(til_setting_spec_t){
+ .name = "Context path to reference",
+ .key = "path",
+ .regex = "[a-zA-Z0-9/_]+",
+ .preferred = "",
+ },
+ &path,
+ res_setting,
+ res_desc);
+ if (r)
+ return r;
+
+ if (res_setup) {
+ _ref_setup_t *setup;
+
+ setup = til_setup_new(settings, sizeof(*setup), _ref_setup_free, &_ref_module);
+ if (!setup)
+ return -ENOMEM;
+
+ setup->path = strdup(path);
+ if (!setup->path) {
+ til_setup_free(&setup->til_setup);
+
+ return -ENOMEM;
+ }
+
+ *res_setup = &setup->til_setup;
+ }
+
+ return 0;
+}
© All Rights Reserved