示例#1
0
static void *ctx_wm_python_context_get(const bContext *C, const char *member, void *fall_through)
{
#ifdef WITH_PYTHON
	bContextDataResult result;

	if (C && CTX_py_dict_get(C)) {
		memset(&result, 0, sizeof(bContextDataResult));
		BPY_context_member_get((bContext *)C, member, &result);
		if (result.ptr.data)
			return result.ptr.data;
	}
#endif

	return fall_through;
}
示例#2
0
文件: context.c 项目: BHCLL/blendocv
static int ctx_data_get(bContext *C, const char *member, bContextDataResult *result)
{
	int done= 0, recursion= C->data.recursion;
	int ret= 0;

	memset(result, 0, sizeof(bContextDataResult));
#ifdef WITH_PYTHON
	if(CTX_py_dict_get(C)) {
		return BPY_context_member_get(C, member, result);
//		if (BPY_context_member_get(C, member, result))
//			return 1;
	}
#endif
	/* we check recursion to ensure that we do not get infinite
	 * loops requesting data from ourselfs in a context callback */

	/* Ok, this looks evil...
	 * if(ret) done= -(-ret | -done);
	 *
	 * Values in order of importance
	 * (0, -1, 1) - Where 1 is highest priority
	 * */
	if(done!=1 && recursion < 1 && C->wm.store) {
		bContextStoreEntry *entry;

		C->data.recursion= 1;

		entry= BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name));
		if(entry) {
			result->ptr= entry->ptr;
			done= 1;
		}
	}
	if(done!=1 && recursion < 2 && C->wm.region) {
		C->data.recursion= 2;
		if(C->wm.region->type && C->wm.region->type->context) {
			ret = C->wm.region->type->context(C, member, result);
			if(ret) done= -(-ret | -done);

		}
	}
	if(done!=1 && recursion < 3 && C->wm.area) {
		C->data.recursion= 3;
		if(C->wm.area->type && C->wm.area->type->context) {
			ret = C->wm.area->type->context(C, member, result);
			if(ret) done= -(-ret | -done);
		}
	}
	if(done!=1 && recursion < 4 && C->wm.screen) {
		bContextDataCallback cb= C->wm.screen->context;
		C->data.recursion= 4;
		if(cb) {
			ret = cb(C, member, result);
			if(ret) done= -(-ret | -done);
		}
	}

	C->data.recursion= recursion;

	return done;
}