47#include "RNA_prototypes.hh"
109 bContext *C = MEM_cnew<bContext>(__func__);
116 bContext *newC = MEM_cnew<bContext>(__func__);
141 if (contexts.is_empty()) {
142 contexts.append(std::make_unique<bContextStore>());
144 else if (contexts.last()->used) {
145 auto new_ctx = std::make_unique<bContextStore>(
bContextStore{contexts.last()->entries,
false});
146 contexts.append(std::move(new_ctx));
149 return contexts.last().get();
194 for (
auto entry = store->entries.rbegin(); entry != store->entries.rend(); ++entry) {
195 if (entry->name == name && std::holds_alternative<PointerRNA>(entry->value)) {
208 for (
auto entry = store->entries.rbegin(); entry != store->entries.rend(); ++entry) {
209 if (entry->name == name && std::holds_alternative<std::string>(entry->value)) {
210 return std::get<std::string>(entry->value);
220 return C->data.py_init;
224 C->data.py_init = value;
229 return C->data.py_context;
233 return C->data.py_context_orig;
241 C->data.py_context = value;
242 C->data.py_context_orig = value;
272 if (result.ptr.data) {
274 return result.ptr.data;
278 "PyContext '%s' is a '%s', expected a '%s'",
301 int done = 0, recursion = C->data.recursion;
327 if (done != 1 && recursion < 1 && C->wm.store) {
328 C->data.recursion = 1;
346 if (done != 1 && recursion < 2 && (region =
CTX_wm_region(C))) {
347 C->data.recursion = 2;
348 if (region->type && region->type->context) {
349 ret = region->type->context(C, member, result);
351 done = -(-
ret | -done);
355 if (done != 1 && recursion < 3 && (area =
CTX_wm_area(C))) {
356 C->data.recursion = 3;
357 if (area->type && area->type->context) {
358 ret = area->type->context(C, member, result);
360 done = -(-
ret | -done);
365 if (done != 1 && recursion < 4 && (screen =
CTX_wm_screen(C))) {
367 C->data.recursion = 4;
369 ret = cb(C, member, result);
371 done = -(-
ret | -done);
376 C->data.recursion = recursion;
386 return result.ptr.data;
403 *pointer = result.ptr.data;
418 *list = std::move(result.list);
446 for (
PointerRNA &ctx_object : ctx_object_list) {
449 if (base !=
nullptr) {
456 *list = std::move(result.list);
481 "member '%s' is '%s', not '%s'",
512 const char *propname)
545 *r_prop = result.prop;
546 *r_index = result.index;
548 *r_type = result.type;
564 if ((use_all ==
false) &&
STREQ(member,
"scene")) {
572 link = MEM_cnew<LinkData>(__func__);
573 link->
data = (
void *)member;
578 const bool use_store,
589 memset(&lb, 0,
sizeof(lb));
592 char name_buf[256], *name;
603 if (name != name_buf) {
609 if (use_store && C->wm.store) {
614 if ((region =
CTX_wm_region(C)) && region->type && region->type->context) {
615 region->type->context(C,
"", &result);
618 for (a = 0; result.dir[a]; a++) {
623 if ((area =
CTX_wm_area(C)) && area->type && area->type->context) {
624 area->type->context(C,
"", &result);
627 for (a = 0; result.dir[a]; a++) {
637 for (a = 0; result.dir[a]; a++) {
658 return member[0] ==
'\0';
688 result->list.append(*
ptr);
695 if (func(C, &list)) {
704 result->index = index;
726 return C->wm.manager;
731 return C->wm.manager->
runtime->is_interface_locked;
759 return (area) ?
static_cast<SpaceLink *
>(area->spacedata.first) :
nullptr;
770 return (region) ? region->regiondata :
nullptr;
775 return C->wm.region_popup;
780 return C->wm.gizmo_group;
785 return C->wm.manager ? C->wm.manager->message_bus :
nullptr;
791 return &(C->wm.manager->runtime->reports);
801 return static_cast<View3D *
>(area->spacedata.first);
823 return static_cast<SpaceText *
>(area->spacedata.first);
832 return static_cast<SpaceConsole *
>(area->spacedata.first);
841 return static_cast<SpaceImage *
>(area->spacedata.first);
859 return static_cast<SpaceFile *
>(area->spacedata.first);
867 if (area && area->spacetype ==
SPACE_SEQ) {
868 return static_cast<SpaceSeq *
>(area->spacedata.first);
885 if (area && area->spacetype ==
SPACE_NLA) {
886 return static_cast<SpaceNla *
>(area->spacedata.first);
895 return static_cast<SpaceNode *
>(area->spacedata.first);
904 return static_cast<SpaceGraph *
>(area->spacedata.first);
913 return static_cast<SpaceAction *
>(area->spacedata.first);
922 return static_cast<SpaceInfo *
>(area->spacedata.first);
940 return static_cast<SpaceClip *
>(area->spacedata.first);
949 return static_cast<SpaceTopBar *
>(area->spacedata.first);
966 C->wm.window =
nullptr;
967 C->wm.screen =
nullptr;
968 C->wm.area =
nullptr;
969 C->wm.region =
nullptr;
973# define PYCTX_REGION_MEMBERS "region", "region_data"
974# define PYCTX_AREA_MEMBERS "area", "space_data", PYCTX_REGION_MEMBERS
975# define PYCTX_SCREEN_MEMBERS "screen", PYCTX_AREA_MEMBERS
976# define PYCTX_WINDOW_MEMBERS "window", "scene", "workspace", PYCTX_SCREEN_MEMBERS
987 C->wm.area =
nullptr;
988 C->wm.region =
nullptr;
991 if (C->data.py_context !=
nullptr) {
992 const char *
members[] = {PYCTX_WINDOW_MEMBERS};
1001 C->wm.screen = screen;
1002 C->wm.area =
nullptr;
1003 C->wm.region =
nullptr;
1006 if (C->data.py_context !=
nullptr) {
1007 const char *
members[] = {PYCTX_SCREEN_MEMBERS};
1017 C->wm.region =
nullptr;
1020 if (C->data.py_context !=
nullptr) {
1021 const char *
members[] = {PYCTX_AREA_MEMBERS};
1030 C->wm.region = region;
1033 if (C->data.py_context !=
nullptr) {
1034 const char *
members[] = {PYCTX_REGION_MEMBERS};
1044 C->wm.region_popup = region_popup;
1049 C->wm.gizmo_group = gzgroup;
1055 if (
params->free_fn !=
nullptr) {
1058 params->get_fn =
nullptr;
1059 params->free_fn =
nullptr;
1060 params->user_data =
nullptr;
1062 C->wm.operator_poll_msg =
nullptr;
1068 C->wm.operator_poll_msg = msg;
1075 C->wm.operator_poll_msg_dyn_params = *
params;
1081 if (
params->get_fn !=
nullptr) {
1083 if (msg !=
nullptr) {
1090 return IFACE_(C->wm.operator_poll_msg);
1102 return C->data.main;
1107 C->data.main = bmain;
1118 return C->data.scene;
1154 return layer_collection;
1170 if (layer_collection) {
1176 return scene->master_collection;
1185 switch (obedit->
type) {
1294 "grease_pencil_edit",
1303 "greasepencil_paint",
1304 "greasepencil_edit",
1305 "greasepencil_sculpt",
1306 "greasepencil_weight",
1307 "greasepencil_vertex",
1309 "grease_pencil_paint",
1310 "grease_pencil_sculpt",
1311 "grease_pencil_weight",
1312 "grease_pencil_vertex",
1316 "Must have a string for each context mode")
1324 C->data.scene =
scene;
1327 if (C->data.py_context !=
nullptr) {
1328 const char *
members[] = {
"scene"};
1339 return scene->toolsettings;
1414 if (ob ==
nullptr) {
1508 if (asset_handle_p) {
1510 return *asset_handle_p;
1520 if (file && file->asset) {
1525 *r_is_valid =
false;
1541 return handle.file_data->asset;
const char * CTX_data_mode_string(const bContext *C)
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_POINT_CLOUD
@ CTX_MODE_SCULPT_GPENCIL_LEGACY
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_PAINT_GPENCIL_LEGACY
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_EDIT_GPENCIL_LEGACY
int(*)(const bContext *C, const char *member, bContextDataResult *result) bContextDataCallback
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_DATA_TYPE_COLLECTION
bool BKE_view_layer_has_collection(const ViewLayer *view_layer, const Collection *collection)
LayerCollection * BKE_layer_collection_get_active(ViewLayer *view_layer)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ViewLayer * BKE_view_layer_default_view(const Scene *scene)
ViewLayer * BKE_view_layer_find(const Scene *scene, const char *layer_name)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
Depsgraph * BKE_scene_ensure_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer)
Depsgraph * BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer)
void BKE_sound_init_main(struct Main *bmain)
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
WorkSpace * BKE_workspace_active_get(WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define BLI_STATIC_ASSERT(a, msg)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_thread_is_main(void)
void BPY_context_dict_clear_members_array(void **dict_p, void *dict_orig, const char *context_members[], uint context_members_len)
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
#define CLOG_WARN(clg_ref,...)
void DEG_make_active(Depsgraph *depsgraph)
Object groups, one object can be in many groups at once.
@ OB_MODE_VERTEX_GREASE_PENCIL
@ OB_MODE_EDIT_GPENCIL_LEGACY
@ OB_MODE_PAINT_GREASE_PENCIL
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_WEIGHT_GREASE_PENCIL
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define RNA_PROP_BEGIN(sptr, itemptr, prop)
constexpr PointerRNA PointerRNA_NULL
bContextStore * CTX_store_add_all(Vector< std::unique_ptr< bContextStore > > &contexts, const bContextStore *context)
short CTX_data_type_get(bContextDataResult *result)
SpaceGraph * CTX_wm_space_graph(const bContext *C)
Image * CTX_data_edit_image(const bContext *C)
bool CTX_data_selectable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
Depsgraph * CTX_data_expect_evaluated_depsgraph(const bContext *C)
void CTX_data_main_set(bContext *C, Main *bmain)
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
void CTX_wm_gizmo_group_set(bContext *C, wmGizmoGroup *gzgroup)
void CTX_py_state_push(bContext *C, bContext_PyState *pystate, void *value)
WorkSpace * CTX_wm_workspace(const bContext *C)
const PointerRNA * CTX_store_ptr_lookup(const bContextStore *store, const blender::StringRefNull name, const StructRNA *type)
bool CTX_data_visible_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_wm_interface_locked(const bContext *C)
SpaceText * CTX_wm_space_text(const bContext *C)
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
bool CTX_data_selected_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bPoseChannel * CTX_data_active_pose_bone(const bContext *C)
PointerRNA CTX_data_pointer_get_type_silent(const bContext *C, const char *member, StructRNA *type)
SpaceUserPref * CTX_wm_space_userpref(const bContext *C)
SpaceTopBar * CTX_wm_space_topbar(const bContext *C)
void CTX_data_id_list_add(bContextDataResult *result, ID *id)
SpaceImage * CTX_wm_space_image(const bContext *C)
bool CTX_data_equals(const char *member, const char *str)
ReportList * CTX_wm_reports(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
SpaceNla * CTX_wm_space_nla(const bContext *C)
bool CTX_data_visible_bases(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_visible_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Mask * CTX_data_edit_mask(const bContext *C)
bool CTX_py_init_get(bContext *C)
void CTX_data_prop_set(bContextDataResult *result, PropertyRNA *prop, int index)
static AssetHandle ctx_wm_asset_handle(const bContext *C, bool *r_is_valid)
void CTX_data_pointer_set(bContextDataResult *result, ID *id, StructRNA *type, void *data)
LayerCollection * CTX_data_layer_collection(const bContext *C)
bool CTX_data_selected_pose_bones_from_active_object(const bContext *C, blender::Vector< PointerRNA > *list)
SpaceOutliner * CTX_wm_space_outliner(const bContext *C)
bContextStore * CTX_store_add(Vector< std::unique_ptr< bContextStore > > &contexts, const blender::StringRefNull name, const PointerRNA *ptr)
static void * ctx_wm_python_context_get(const bContext *C, const char *member, const StructRNA *member_type, void *fall_through)
static eContextResult ctx_data_get(bContext *C, const char *member, bContextDataResult *result)
CacheFile * CTX_data_edit_cachefile(const bContext *C)
MovieClip * CTX_data_edit_movieclip(const bContext *C)
bool CTX_data_dir(const char *member)
static void data_dir_add(ListBase *lb, const char *member, const bool use_all)
void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
void * CTX_wm_region_data(const bContext *C)
static const char * data_mode_strings[]
void CTX_py_state_pop(bContext *C, bContext_PyState *pystate)
SpaceAction * CTX_wm_space_action(const bContext *C)
SpaceConsole * CTX_wm_space_console(const bContext *C)
void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
ARegion * CTX_wm_region_popup(const bContext *C)
void CTX_wm_operator_poll_msg_clear(bContext *C)
void CTX_py_init_set(bContext *C, bool value)
SpaceFile * CTX_wm_space_file(const bContext *C)
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
SpaceNode * CTX_wm_space_node(const bContext *C)
bContext * CTX_copy(const bContext *C)
SpaceProperties * CTX_wm_space_properties(const bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
bool CTX_data_editable_bones(const bContext *C, blender::Vector< PointerRNA > *list)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
static bool ctx_data_base_collection_get(const bContext *C, const char *member, Vector< PointerRNA > *list)
static bContextStore * ctx_store_extend(Vector< std::unique_ptr< bContextStore > > &contexts)
static void * ctx_data_pointer_get(const bContext *C, const char *member)
void CTX_free(bContext *C)
Object * CTX_data_active_object(const bContext *C)
Vector< PointerRNA > CTX_data_collection_get(const bContext *C, const char *member)
ListBase CTX_data_dir_get(const bContext *C)
const AssetLibraryReference * CTX_wm_asset_library_ref(const bContext *C)
void CTX_wm_operator_poll_msg_set_dynamic(bContext *C, const bContextPollMsgDyn_Params *params)
Text * CTX_data_edit_text(const bContext *C)
blender::asset_system::AssetRepresentation * CTX_wm_asset(const bContext *C)
RenderEngineType * CTX_data_engine_type(const bContext *C)
SpaceLink * CTX_wm_space_data(const bContext *C)
void CTX_wm_screen_set(bContext *C, bScreen *screen)
void CTX_data_scene_set(bContext *C, Scene *scene)
Scene * CTX_data_scene(const bContext *C)
static bool ctx_data_pointer_verify(const bContext *C, const char *member, void **pointer)
ListBase CTX_data_dir_get_ex(const bContext *C, const bool use_store, const bool use_rna, const bool use_all)
int ctx_data_list_count(const bContext *C, bool(*func)(const bContext *, blender::Vector< PointerRNA > *))
SpaceSeq * CTX_wm_space_seq(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
void CTX_data_list_add(bContextDataResult *result, ID *id, StructRNA *type, void *data)
bool CTX_data_selectable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Base * CTX_data_active_base(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, const eObjectMode object_mode)
void CTX_wm_window_set(bContext *C, wmWindow *win)
bool CTX_data_selected_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Main * CTX_data_main(const bContext *C)
bool CTX_data_selected_editable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_visible_pose_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_editable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_editable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
void * CTX_py_dict_get_orig(const bContext *C)
static bool ctx_data_collection_get(const bContext *C, const char *member, Vector< PointerRNA > *list)
const bContextStore * CTX_store_get(const bContext *C)
void CTX_data_list_add_ptr(bContextDataResult *result, const PointerRNA *ptr)
bool CTX_data_selected_nodes(const bContext *C, blender::Vector< PointerRNA > *list)
const char * CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free)
void CTX_data_pointer_set_ptr(bContextDataResult *result, const PointerRNA *ptr)
void CTX_store_set(bContext *C, const bContextStore *store)
wmGizmoGroup * CTX_wm_gizmo_group(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
bool CTX_data_selected_editable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
SpaceInfo * CTX_wm_space_info(const bContext *C)
bool CTX_data_selected_pose_bones(const bContext *C, blender::Vector< PointerRNA > *list)
void CTX_data_collection_remap_property(blender::MutableSpan< PointerRNA > collection_pointers, const char *propname)
void CTX_wm_area_set(bContext *C, ScrArea *area)
SpaceClip * CTX_wm_space_clip(const bContext *C)
bool CTX_data_selected_bases(const bContext *C, blender::Vector< PointerRNA > *list)
EditBone * CTX_data_active_bone(const bContext *C)
std::optional< blender::StringRefNull > CTX_store_string_lookup(const bContextStore *store, const blender::StringRefNull name)
void CTX_wm_region_set(bContext *C, ARegion *region)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
Collection * CTX_data_collection(const bContext *C)
bool CTX_data_selected_editable_bones(const bContext *C, blender::Vector< PointerRNA > *list)
void * CTX_py_dict_get(const bContext *C)
Depsgraph * CTX_data_depsgraph_on_load(const bContext *C)
SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, Vector< PointerRNA > *r_lb, PropertyRNA **r_prop, int *r_index, blender::StringRef *r_str, short *r_type)
std::optional< blender::StringRefNull > CTX_data_string_get(const bContext *C, const char *member)
wmMsgBus * CTX_wm_message_bus(const bContext *C)
void CTX_data_type_set(bContextDataResult *result, short type)
void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup)
View3D * CTX_wm_view3d(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
bool CTX_data_selected_ids(const bContext *C, blender::Vector< PointerRNA > *list)
void append(const T &value)
const Depsgraph * depsgraph
RenderEngineType * RE_engines_find(const char *idname)
void MEM_freeN(void *vmemh)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
char * RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, int *r_len)
const char * RNA_struct_identifier(const StructRNA *type)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
PropertyRNA * RNA_struct_iterator_property(StructRNA *type)
PointerRNA RNA_id_pointer_create(ID *id)
struct Collection * collection
blender::StringRefNull str
Vector< PointerRNA > list
blender::Vector< bContextStoreEntry > entries
const char * operator_poll_msg
bContextPollMsgDyn_Params operator_poll_msg_dyn_params
const bContextStore * store
struct bContext::@80 data
wmGizmoGroup * gizmo_group
wmWindowManager * manager
WindowManagerRuntimeHandle * runtime
struct WorkSpaceInstanceHook * workspace_hook