diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-05-06 06:55:09 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-05-06 06:55:09 +0400 |
commit | 22c22d49617ac1f33037492e27c41f185618cffa (patch) | |
tree | 5b4b9c3e35e7e387bd0161e5ea354b9d1e587122 | |
parent | 8751d1d92749a6ddf8a15031212ad26a50b41328 (diff) |
fix [#27304] uiItemsFullEnumO: operator missing srna ''
python strings are not static so dont hold pointers to them within blenders UI.
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 7dc27805b40..a33068ae3fd 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1496,8 +1496,10 @@ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc typedef struct MenuItemLevel { int opcontext; - const char *opname; - const char *propname; + /* dont use pointers to the strings because python can dynamically + * allocate strings and free before the menu draws, see [#27304] */ + char opname[OP_MAX_TYPENAME]; + char propname[MAX_IDPROP_NAME]; PointerRNA rnapoin; } MenuItemLevel; @@ -1514,9 +1516,14 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, wmOperatorType *ot= WM_operatortype_find(opname, 1); MenuItemLevel *lvl; - if(!ot || !ot->srna) { + if(!ot) { + ui_item_disabled(layout, opname); + RNA_warning("uiItemMenuEnumO: unknown operator '%s'\n", opname); + return; + } + if(!ot->srna) { ui_item_disabled(layout, opname); - RNA_warning("uiItemMenuEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", name); + RNA_warning("uiItemMenuEnumO: operator missing srna '%s'\n", opname); return; } @@ -1526,8 +1533,8 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, icon= ICON_BLANK1; lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel"); - lvl->opname= opname; - lvl->propname= propname; + BLI_strncpy(lvl->opname, opname, sizeof(lvl->opname)); + BLI_strncpy(lvl->propname, propname, sizeof(lvl->propname)); lvl->opcontext= layout->root->opcontext; ui_item_menu(layout, name, icon, menu_item_enum_opname_menu, NULL, lvl); @@ -1560,7 +1567,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel"); lvl->rnapoin= *ptr; - lvl->propname= propname; + BLI_strncpy(lvl->propname, propname, sizeof(lvl->propname)); lvl->opcontext= layout->root->opcontext; ui_item_menu(layout, name, icon, menu_item_enum_rna_menu, NULL, lvl); |