diff options
authorVito Caputo <>2020-05-29 12:39:24 -0700
committerVito Caputo <>2020-05-29 12:39:24 -0700
commitb50c169621c3d6fba5c6ddf08a1acd80601c5c93 (patch)
parentfc879e25fd4b45ec3520b4bd0cbfb4bec4ad1590 (diff)
libstage: add stage, rename adopt->replace in stage_conf_t
In preparation for supporting caller-supplied stage memory, add another stage_t pointer to the conf called .stage. The naming of .adopt was always awkward and resulted from the reuse of the .parent pointer to indicate the stage to replace. Now that there's a .stage member, just rename .adopt to .replace, with the same semantics. At some point I need to firm up what .replace does with the other conf data. Currently, only the name, ops, and object, are updated. The existing active/locked/alpha etc are retained unchanged, ignored from the conf. This can be surprising/unexpected to someone performing a replace through the .conf, and it would probably be convenient to be able to set everything during a replace. So there should probably be a convenience helper for constructing a conf from an existing stage, which can then be overridden selectively while passing to a new().
2 files changed, 6 insertions, 6 deletions
diff --git a/src/stage.c b/src/stage.c
index 8a540a8..b072050 100644
--- a/src/stage.c
+++ b/src/stage.c
@@ -88,18 +88,18 @@ static void _stage_free(stage_t *stage)
/* returns a new stage, attached at the specified layer under parent if supplied */
/* layer has no effect when parent == NULL */
-/* if adopt is set, parent must be set and is instead replaced internally and returned */
+/* if replace is set, conf.stage must be set, its internals are replaced and it's returned as new */
stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object)
stage_t *stage;
assert(conf->parent || !conf->layer);
- assert(conf->parent || !conf->adopt);
+ assert(conf->stage || !conf->replace);
assert(conf->layer < STAGE_LAYERS_MAX);
- if (conf->adopt)
- return stage_replace(conf->parent, conf->name, ops, object);
+ if (conf->replace)
+ return stage_replace(conf->stage, conf->name, ops, object);
stage = _stage_new(conf->name, ops, object);
if (!stage)
diff --git a/src/stage.h b/src/stage.h
index 785ddf5..40f2057 100644
--- a/src/stage.h
+++ b/src/stage.h
@@ -33,14 +33,14 @@ typedef struct stage_ops_t {
} stage_ops_t;
typedef struct stage_conf_t {
- stage_t *parent;
+ stage_t *parent, *stage;
int layer;
const char *name;
float alpha;
unsigned active:1;
unsigned locked:1;
unsigned dirty:1;
- unsigned adopt:1;
+ unsigned replace:1;
} stage_conf_t;
stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object);
© 2021 All Rights Reserved