diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stage.c | 5 | ||||
-rw-r--r-- | src/stage.h | 1 |
2 files changed, 6 insertions, 0 deletions
diff --git a/src/stage.c b/src/stage.c index 13519b9..8a540a8 100644 --- a/src/stage.c +++ b/src/stage.c @@ -88,14 +88,19 @@ 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 */ stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object) { stage_t *stage; assert(conf); assert(conf->parent || !conf->layer); + assert(conf->parent || !conf->adopt); assert(conf->layer < STAGE_LAYERS_MAX); + if (conf->adopt) + return stage_replace(conf->parent, conf->name, ops, object); + stage = _stage_new(conf->name, ops, object); if (!stage) return NULL; diff --git a/src/stage.h b/src/stage.h index ec0a72b..785ddf5 100644 --- a/src/stage.h +++ b/src/stage.h @@ -40,6 +40,7 @@ typedef struct stage_conf_t { unsigned active:1; unsigned locked:1; unsigned dirty:1; + unsigned adopt:1; } stage_conf_t; stage_t * stage_new(const stage_conf_t *conf, const stage_ops_t *ops, void *object); |