44#include "RNA_prototypes.hh"
138 if (contexts.is_empty()) {
139 contexts.append(std::make_unique<bContextStore>());
141 else if (contexts.last()->used) {
142 auto new_ctx = std::make_unique<bContextStore>(
bContextStore{contexts.last()->entries,
false});
143 contexts.append(std::move(new_ctx));
146 return contexts.last().get();
201 if (entry->name == name && std::holds_alternative<PointerRNA>(entry->value)) {
215 if (entry->name == name && std::holds_alternative<T>(entry->value)) {
216 return &std::get<T>(entry->value);
244 return C->data.py_init;
248 C->data.py_init = value;
253 return C->data.py_context;
257 return C->data.py_context_orig;
265 C->data.py_context = value;
266 C->data.py_context_orig = value;
303 "PyContext '%s' is a '%s', expected a '%s'",
326 int done = 0, recursion =
C->data.recursion;
352 if (done != 1 && recursion < 1 && C->wm.store) {
353 C->data.recursion = 1;
367 result->int_value = int_value;
373 C->data.recursion = 2;
377 done = -(-
ret | -done);
381 if (done != 1 && recursion < 3 && (area =
CTX_wm_area(
C))) {
382 C->data.recursion = 3;
386 done = -(-
ret | -done);
393 C->data.recursion = 4;
397 done = -(-
ret | -done);
402 C->data.recursion = recursion;
429 *pointer =
result.ptr.data;
444 *list = std::move(
result.list);
472 for (
PointerRNA &ctx_object : ctx_object_list) {
475 if (base !=
nullptr) {
482 *list = std::move(
result.list);
507 "member '%s' is '%s', not '%s'",
538 const char *propname)
574 std::optional<int64_t> *r_int_value,
586 *r_int_value =
result.int_value;
604 if ((use_all ==
false) &&
STREQ(member,
"scene")) {
613 link->
data = (
void *)member;
618 const bool use_store,
629 memset(&lb, 0,
sizeof(lb));
632 char name_buf[256], *name;
643 if (name != name_buf) {
649 if (use_store &&
C->wm.store) {
658 for (a = 0;
result.dir[a]; a++) {
667 for (a = 0;
result.dir[a]; a++) {
677 for (a = 0;
result.dir[a]; a++) {
698 return member[0] ==
'\0';
735 if (func(
C, &list)) {
766 return C->wm.manager;
771 return C->wm.manager->runtime->is_interface_locked;
810 return (region) ? region->
regiondata :
nullptr;
815 return C->wm.region_popup;
820 return C->wm.gizmo_group;
825 return C->wm.manager ?
C->wm.manager->message_bus :
nullptr;
831 return &(
C->wm.manager->runtime->reports);
1006 C->wm.window =
nullptr;
1007 C->wm.screen =
nullptr;
1008 C->wm.area =
nullptr;
1009 C->wm.region =
nullptr;
1013# define PYCTX_REGION_MEMBERS "region", "region_data"
1014# define PYCTX_AREA_MEMBERS "area", "space_data", PYCTX_REGION_MEMBERS
1015# define PYCTX_SCREEN_MEMBERS "screen", PYCTX_AREA_MEMBERS
1016# define PYCTX_WINDOW_MEMBERS "window", "scene", "workspace", PYCTX_SCREEN_MEMBERS
1023 C->data.scene = win->
scene;
1027 C->wm.area =
nullptr;
1028 C->wm.region =
nullptr;
1031 if (
C->data.py_context !=
nullptr) {
1032 const char *
members[] = {PYCTX_WINDOW_MEMBERS};
1041 C->wm.screen = screen;
1042 C->wm.area =
nullptr;
1043 C->wm.region =
nullptr;
1046 if (
C->data.py_context !=
nullptr) {
1047 const char *
members[] = {PYCTX_SCREEN_MEMBERS};
1057 C->wm.region =
nullptr;
1060 if (
C->data.py_context !=
nullptr) {
1061 const char *
members[] = {PYCTX_AREA_MEMBERS};
1070 C->wm.region = region;
1073 if (
C->data.py_context !=
nullptr) {
1074 const char *
members[] = {PYCTX_REGION_MEMBERS};
1084 C->wm.region_popup = region_popup;
1089 C->wm.gizmo_group = gzgroup;
1095 if (
params->free_fn !=
nullptr) {
1098 params->get_fn =
nullptr;
1099 params->free_fn =
nullptr;
1100 params->user_data =
nullptr;
1102 C->wm.operator_poll_msg =
nullptr;
1108 C->wm.operator_poll_msg = msg;
1115 C->wm.operator_poll_msg_dyn_params = *
params;
1121 if (
params->get_fn !=
nullptr) {
1123 if (msg !=
nullptr) {
1130 return IFACE_(
C->wm.operator_poll_msg);
1142 return C->data.main;
1147 C->data.main = bmain;
1158 return C->data.scene;
1194 return layer_collection;
1210 if (layer_collection) {
1225 switch (obedit->
type) {
1322 "grease_pencil_edit",
1331 "greasepencil_paint",
1332 "greasepencil_edit",
1333 "greasepencil_sculpt",
1334 "greasepencil_weight",
1335 "greasepencil_vertex",
1337 "grease_pencil_paint",
1338 "grease_pencil_sculpt",
1339 "grease_pencil_weight",
1340 "grease_pencil_vertex",
1344 "Must have a string for each context mode")
1352 C->data.scene = scene;
1355 if (
C->data.py_context !=
nullptr) {
1356 const char *
members[] = {
"scene"};
1442 if (ob ==
nullptr) {
1536 if (asset_handle_p) {
1538 return *asset_handle_p;
1548 if (file && file->
asset) {
1553 *r_is_valid =
false;
1569 return handle.file_data->asset;
const char * CTX_data_mode_string(const bContext *C)
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_EDIT_POINTCLOUD
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_EDIT_GPENCIL_LEGACY
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_DATA_TYPE_COLLECTION
int(*)(const bContext *C, const char *member, bContextDataResult *result) bContextDataCallback
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_refresh_callback_bmain(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 ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(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)
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)
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)
std::optional< int64_t > CTX_store_int_lookup(const bContextStore *store, const blender::StringRef name)
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, std::optional< int64_t > *r_int_value, short *r_type)
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)
std::optional< int64_t > CTX_data_int_get(const bContext *C, const char *member)
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)
const PointerRNA * CTX_store_ptr_lookup(const bContextStore *store, const blender::StringRef name, const StructRNA *type)
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)
const T * ctx_store_lookup_impl(const bContextStore *store, const blender::StringRef name)
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)
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)
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)
std::optional< blender::StringRefNull > CTX_store_string_lookup(const bContextStore *store, const blender::StringRef name)
bContextStore * CTX_store_add(Vector< std::unique_ptr< bContextStore > > &contexts, const blender::StringRef name, const PointerRNA *ptr)
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)
BMesh const char void * data
BPy_StructRNA * depsgraph
std::reverse_iterator< T * > rbegin()
void append(const T &value)
std::reverse_iterator< T * > rend()
RenderEngineType * RE_engines_find(const char *idname)
void * MEM_callocN(size_t len, const char *str)
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 PointerRNA PointerRNA_NULL
const char * RNA_struct_identifier(const StructRNA *type)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PropertyRNA * RNA_struct_iterator_property(StructRNA *type)
PointerRNA RNA_id_pointer_create(ID *id)
ARegionRuntimeHandle * runtime
AssetRepresentationHandle * asset
struct Collection * collection
struct Collection * master_collection
struct ToolSettings * toolsettings
bContextDataCallback context
std::optional< int64_t > int_value
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::@356210030170374202354026020347217254375374146133 wm
wmGizmoGroup * gizmo_group
wmWindowManager * manager
struct WorkSpaceInstanceHook * workspace_hook