diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_context.h | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_screen.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/context.c | 19 |
3 files changed, 34 insertions, 16 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index f3e4a18b9bd..5c534803781 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -74,9 +74,26 @@ typedef struct bContext bContext; struct bContextDataResult; typedef struct bContextDataResult bContextDataResult; -typedef int (*bContextDataCallback)(const bContext *C, - const char *member, - bContextDataResult *result); +/* Result of context lookups. + * The specific values are important, and used implicitly in ctx_data_get(). Some functions also + * still accept/return `int` instead, to ensure that the compiler uses the correct storage size + * when mixing C/C++ code. */ +typedef enum eContextResult { + /* The context member was found, and its data is available. */ + CTX_RESULT_OK = 1, + + /* The context member was not found. */ + CTX_RESULT_MEMBER_NOT_FOUND = 0, + + /* The context member was found, but its data is not available. + * For example, "active_bone" is a valid context member, but has not data in Object mode. */ + CTX_RESULT_NO_DATA = -1, +} eContextResult; + +/* Function mapping a context member name to its value. */ +typedef int /*eContextResult*/ (*bContextDataCallback)(const bContext *C, + const char *member, + bContextDataResult *result); typedef struct bContextStoreEntry { struct bContextStoreEntry *next, *prev; @@ -213,7 +230,7 @@ ListBase CTX_data_dir_get_ex(const bContext *C, const bool use_rna, const bool use_all); ListBase CTX_data_dir_get(const bContext *C); -int CTX_data_get( +int /*eContextResult*/ CTX_data_get( const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type); void CTX_data_id_pointer_set(bContextDataResult *result, struct ID *id); diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index bcc58ecf2c5..35a3d0415a8 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -26,6 +26,8 @@ #include "RNA_types.h" +#include "BKE_context.h" + #ifdef __cplusplus extern "C" { #endif @@ -106,7 +108,7 @@ typedef struct SpaceType { void (*gizmos)(void); /* return context data */ - int (*context)(const struct bContext *C, const char *member, struct bContextDataResult *result); + bContextDataCallback context; /* Used when we want to replace an ID by another (or NULL). */ void (*id_remap)(struct ScrArea *area, @@ -181,7 +183,7 @@ typedef struct ARegionType { void (*cursor)(struct wmWindow *win, struct ScrArea *area, struct ARegion *region); /* return context data */ - int (*context)(const struct bContext *C, const char *member, struct bContextDataResult *result); + bContextDataCallback context; /* Is called whenever the current visible View2D's region changes. * diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 17ac8d7bedc..2002a49293f 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -294,7 +294,7 @@ static void *ctx_wm_python_context_get(const bContext *C, return fall_through; } -static int ctx_data_get(bContext *C, const char *member, bContextDataResult *result) +static eContextResult ctx_data_get(bContext *C, const char *member, bContextDataResult *result) { bScreen *screen; ScrArea *area; @@ -374,7 +374,7 @@ static void *ctx_data_pointer_get(const bContext *C, const char *member) { bContextDataResult result; - if (C && ctx_data_get((bContext *)C, member, &result) == 1) { + if (C && ctx_data_get((bContext *)C, member, &result) == CTX_RESULT_OK) { BLI_assert(result.type == CTX_DATA_TYPE_POINTER); return result.ptr.data; } @@ -391,7 +391,7 @@ static int ctx_data_pointer_verify(const bContext *C, const char *member, void * *pointer = NULL; return 1; } - if (ctx_data_get((bContext *)C, member, &result) == 1) { + if (ctx_data_get((bContext *)C, member, &result) == CTX_RESULT_OK) { BLI_assert(result.type == CTX_DATA_TYPE_POINTER); *pointer = result.ptr.data; return 1; @@ -405,7 +405,7 @@ static int ctx_data_collection_get(const bContext *C, const char *member, ListBa { bContextDataResult result; - if (ctx_data_get((bContext *)C, member, &result) == 1) { + if (ctx_data_get((bContext *)C, member, &result) == CTX_RESULT_OK) { BLI_assert(result.type == CTX_DATA_TYPE_COLLECTION); *list = result.list; return 1; @@ -453,7 +453,7 @@ PointerRNA CTX_data_pointer_get(const bContext *C, const char *member) { bContextDataResult result; - if (ctx_data_get((bContext *)C, member, &result) == 1) { + if (ctx_data_get((bContext *)C, member, &result) == CTX_RESULT_OK) { BLI_assert(result.type == CTX_DATA_TYPE_POINTER); return result.ptr; } @@ -495,7 +495,7 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member) { bContextDataResult result; - if (ctx_data_get((bContext *)C, member, &result) == 1) { + if (ctx_data_get((bContext *)C, member, &result) == CTX_RESULT_OK) { BLI_assert(result.type == CTX_DATA_TYPE_COLLECTION); return result.list; } @@ -504,14 +504,13 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member) return list; } -/* 1:found, -1:found but not set, 0:not found */ -int CTX_data_get( +int /*eContextResult*/ CTX_data_get( const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type) { bContextDataResult result; - int ret = ctx_data_get((bContext *)C, member, &result); + eContextResult ret = ctx_data_get((bContext *)C, member, &result); - if (ret == 1) { + if (ret == CTX_RESULT_OK) { *r_ptr = result.ptr; *r_lb = result.list; *r_type = result.type; |