13#include <fmt/format.h>
46#include "RNA_prototypes.hh"
145 if (contexts.is_empty()) {
146 contexts.append(std::make_unique<bContextStore>());
148 else if (contexts.last()->used) {
149 auto new_ctx = std::make_unique<bContextStore>(
bContextStore{contexts.last()->entries,
false});
150 contexts.append(std::move(new_ctx));
153 return contexts.last().get();
208 if (entry->name ==
name && std::holds_alternative<PointerRNA>(entry->value)) {
222 if (entry->name ==
name && std::holds_alternative<T>(entry->value)) {
223 return &std::get<T>(entry->value);
251 return C->data.py_init;
255 C->data.py_init = value;
260 return C->data.py_context;
264 return C->data.py_context_orig;
272 C->data.py_context = value;
273 C->data.py_context_orig = value;
303 std::string member_name;
310 &ptr_copy, name_prop, name_buf,
sizeof(name_buf),
nullptr);
313 if (
name != name_buf) {
320 if (!member_name.empty()) {
321 return fmt::format(
"<{}(\"{}\") at 0x{:x}>",
324 reinterpret_cast<uintptr_t
>(
result.ptr.data));
328 "<{} at 0x{:x}>", rna_type_name,
reinterpret_cast<uintptr_t
>(
result.ptr.data));
336 return fmt::format(
"[{} item(s)]",
result.list.size());
339 if (!
result.str.is_empty()) {
340 return "\"" +
result.str +
"\"";
352 return fmt::format(
"<Property({}.{}[{}])>", rna_type_name, prop_name,
result.index);
355 return fmt::format(
"<Property({}.{})>", rna_type_name, prop_name);
359 return "<Property(None)>";
363 if (
result.int_value.has_value()) {
364 return std::to_string(
result.int_value.value());
388 const char *value_desc = value_repr.c_str();
392 std::optional<std::string> python_location;
396 const char *location = python_location ? python_location->c_str() :
"unknown:0";
398 const char *location =
"unknown:0";
402 const char *
format =
"%s: %s=%s";
417 void *return_data =
nullptr;
418 bool found_member =
false;
428 return_data =
result.ptr.data;
432 "PyContext '%s' is a '%s', expected a '%s'",
450 fallback_result.
ptr.
data = fall_through;
454 return_data = fall_through;
473 int done = 0, recursion =
C->data.recursion;
504 if (done != 1 && recursion < 1 && C->wm.store) {
505 C->data.recursion = 1;
519 result->int_value = int_value;
525 C->data.recursion = 2;
529 done = -(-
ret | -done);
533 if (done != 1 && recursion < 3 && (area =
CTX_wm_area(
C))) {
534 C->data.recursion = 3;
538 done = -(-
ret | -done);
545 C->data.recursion = 4;
549 done = -(-
ret | -done);
554 C->data.recursion = recursion;
588 *pointer =
result.ptr.data;
603 *list = std::move(
result.list);
631 for (
PointerRNA &ctx_object : ctx_object_list) {
634 if (base !=
nullptr) {
641 *list = std::move(
result.list);
666 "member '%s' is '%s', not '%s'",
697 const char *propname)
733 std::optional<int64_t> *r_int_value,
745 *r_int_value =
result.int_value;
763 if ((use_all ==
false) &&
STREQ(member,
"scene")) {
772 link->
data = (
void *)member;
777 const bool use_store,
788 memset(&lb, 0,
sizeof(lb));
791 char name_buf[256], *
name;
802 if (
name != name_buf) {
808 if (use_store &&
C->wm.store) {
817 for (a = 0;
result.dir[a]; a++) {
826 for (a = 0;
result.dir[a]; a++) {
836 for (a = 0;
result.dir[a]; a++) {
857 return member[0] ==
'\0';
894 if (func(
C, &list)) {
925 return C->wm.manager;
930 return C->wm.manager->runtime->is_interface_locked;
969 return (region) ? region->
regiondata :
nullptr;
974 return C->wm.region_popup;
979 return C->wm.gizmo_group;
984 return C->wm.manager ?
C->wm.manager->runtime->message_bus :
nullptr;
990 return &(
C->wm.manager->runtime->reports);
1165 C->wm.window =
nullptr;
1166 C->wm.screen =
nullptr;
1167 C->wm.area =
nullptr;
1168 C->wm.region =
nullptr;
1172# define PYCTX_REGION_MEMBERS "region", "region_data"
1173# define PYCTX_AREA_MEMBERS "area", "space_data", PYCTX_REGION_MEMBERS
1174# define PYCTX_SCREEN_MEMBERS "screen", PYCTX_AREA_MEMBERS
1175# define PYCTX_WINDOW_MEMBERS "window", "scene", "workspace", PYCTX_SCREEN_MEMBERS
1182 C->data.scene = win->
scene;
1186 C->wm.area =
nullptr;
1187 C->wm.region =
nullptr;
1190 if (
C->data.py_context !=
nullptr) {
1191 const char *
members[] = {PYCTX_WINDOW_MEMBERS};
1200 C->wm.screen = screen;
1201 C->wm.area =
nullptr;
1202 C->wm.region =
nullptr;
1205 if (
C->data.py_context !=
nullptr) {
1206 const char *
members[] = {PYCTX_SCREEN_MEMBERS};
1216 C->wm.region =
nullptr;
1219 if (
C->data.py_context !=
nullptr) {
1220 const char *
members[] = {PYCTX_AREA_MEMBERS};
1229 C->wm.region = region;
1232 if (
C->data.py_context !=
nullptr) {
1233 const char *
members[] = {PYCTX_REGION_MEMBERS};
1243 C->wm.region_popup = region_popup;
1248 C->wm.gizmo_group = gzgroup;
1254 if (
params->free_fn !=
nullptr) {
1257 params->get_fn =
nullptr;
1258 params->free_fn =
nullptr;
1259 params->user_data =
nullptr;
1261 C->wm.operator_poll_msg =
nullptr;
1267 C->wm.operator_poll_msg = msg;
1274 C->wm.operator_poll_msg_dyn_params = *
params;
1280 if (
params->get_fn !=
nullptr) {
1282 if (msg !=
nullptr) {
1289 return IFACE_(
C->wm.operator_poll_msg);
1301 return C->data.main;
1306 C->data.main = bmain;
1317 return C->data.scene;
1366 return layer_collection;
1382 if (layer_collection) {
1397 switch (obedit->
type) {
1494 "grease_pencil_edit",
1503 "greasepencil_paint",
1504 "greasepencil_edit",
1505 "greasepencil_sculpt",
1506 "greasepencil_weight",
1507 "greasepencil_vertex",
1509 "grease_pencil_paint",
1510 "grease_pencil_sculpt",
1511 "grease_pencil_weight",
1512 "grease_pencil_vertex",
1516 "Must have a string for each context mode")
1524 C->data.scene = scene;
1527 if (
C->data.py_context !=
nullptr) {
1528 const char *
members[] = {
"scene"};
1538 return toolsettings;
1618 if (ob ==
nullptr) {
1754 C->data.log_access = enable;
1759 return C->data.log_access;
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
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_assert_unreachable()
#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)
std::optional< std::string > BPY_python_current_file_and_line(void)
bool BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
#define CLOG_WARN(clg_ref,...)
#define CLOG_AT_LEVEL_NOCHECK(clg_ref, verbose_level,...)
#define CLOG_CHECK(clg_ref, verbose_level,...)
#define CLG_LOGREF_DECLARE_GLOBAL(var, id)
#define CLOG_TRACE(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)
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)
void CTX_member_logging_set(bContext *C, bool enable)
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)
static void ctx_member_log_access(const bContext *C, const char *member, const bContextDataResult &result)
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)
void CTX_data_prop_set(bContextDataResult *result, PropertyRNA *prop, int index)
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)
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_data_type_set(bContextDataResult *result, ContextDataType type)
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)
bool CTX_py_init_get(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)
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)
ContextDataType CTX_data_type_get(bContextDataResult *result)
void CTX_data_collection_remap_property(blender::MutableSpan< PointerRNA > collection_pointers, const char *propname)
void CTX_wm_area_set(bContext *C, ScrArea *area)
static std::string ctx_result_brief_repr(const bContextDataResult &result)
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)
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, ContextDataType *r_type)
void CTX_wm_region_set(bContext *C, ARegion *region)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
bool CTX_member_logging_get(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)
Scene * CTX_data_sequencer_scene(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)
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
CLG_LogRef * BKE_LOG_CONTEXT
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
char * RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen, int *r_len)
const char * RNA_struct_identifier(const StructRNA *type)
PropertyRNA * RNA_struct_name_property(const StructRNA *type)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PropertyRNA * RNA_struct_iterator_property(StructRNA *type)
const char * RNA_property_identifier(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
ARegionRuntimeHandle * runtime
struct Collection * collection
struct Collection * master_collection
struct ToolSettings * toolsettings
bContextDataCallback context
struct Scene * sequencer_scene
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
wmGizmoGroup * gizmo_group
wmWindowManager * manager
struct bContext::@342215117220227010050134206372242253175123130242 wm
struct WorkSpaceInstanceHook * workspace_hook