Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-05-06 06:55:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-05-06 06:55:09 +0400
commit22c22d49617ac1f33037492e27c41f185618cffa (patch)
tree5b4b9c3e35e7e387bd0161e5ea354b9d1e587122
parent8751d1d92749a6ddf8a15031212ad26a50b41328 (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.c21
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);