diff options
| -rw-r--r-- | src/stage.c | 27 | ||||
| -rw-r--r-- | src/stage.h | 1 | 
2 files changed, 28 insertions, 0 deletions
| diff --git a/src/stage.c b/src/stage.c index 10a7f0a..a2c6e2d 100644 --- a/src/stage.c +++ b/src/stage.c @@ -310,3 +310,30 @@ stage_t * stage_lookup_name(stage_t *stage, const char *name)  	return NULL;  } + + +/* lookup a stage by an opaque key using the per-stage match_func when present, + * returns first match, does not support multiple matches. + * Intended for rudimentary non-overlapping spatial searches like picking of + * basic 2D UI elements. + */ +stage_t * stage_lookup_key(stage_t *stage, void *key) +{ +	assert(stage); + +	if (stage->match && stage->match(stage, stage->object, key)) +		return stage; + +	for (int i = 0; i < STAGE_LAYERS_MAX; i++) { +		stage_t	*s; + +		DLL_FOR_EACH_ENTRY(&stage->layers[i], s, stage_t, layer) { +			stage_t	*match = stage_lookup_key(s, key); + +			if (match) +				return match; +		} +	} + +	return NULL; +} diff --git a/src/stage.h b/src/stage.h index b273b7b..31f134a 100644 --- a/src/stage.h +++ b/src/stage.h @@ -41,5 +41,6 @@ void stage_set_locked(stage_t *stage, int locked);  int stage_get_locked(const stage_t *stage);  void stage_set_layer(stage_t *stage, int layer);  stage_t * stage_lookup_name(stage_t *stage, const char *name); +stage_t * stage_lookup_key(stage_t *stage, void *key);  #endif | 
