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>2021-04-06 06:08:35 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-04-06 06:08:35 +0300
commit3f3b4745b6ad99a0503fba4793d0f1febedadebc (patch)
tree1ac8c9bebab29866711195d280efbbe93ab84317 /source/blender/makesrna
parent074b0b6da0a435faa225900ba2347e46f1fce973 (diff)
Fix T87187: Area.type & ui_type empty area access fails
Reading Area.type & ui_type printed an error from `pyrna_enum_to_py` and returned an empty string. As empty is a valid value, include it in the property enum list.
Diffstat (limited to 'source/blender/makesrna')
-rw-r--r--source/blender/makesrna/intern/rna_screen.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index 6cf1d7a923b..fba1d3cda9a 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -112,18 +112,6 @@ static bool rna_Screen_fullscreen_get(PointerRNA *ptr)
return (screen->state == SCREENMAXIMIZED);
}
-/* UI compatible list: should not be needed, but for now we need to keep EMPTY
- * at least in the static version of this enum for python scripts. */
-static const EnumPropertyItem *rna_Area_type_itemf(bContext *UNUSED(C),
- PointerRNA *UNUSED(ptr),
- PropertyRNA *UNUSED(prop),
- bool *r_free)
-{
- /* +1 to skip SPACE_EMPTY */
- *r_free = false;
- return rna_enum_space_type_items + 1;
-}
-
static int rna_Area_type_get(PointerRNA *ptr)
{
ScrArea *area = (ScrArea *)ptr->data;
@@ -142,6 +130,11 @@ static void rna_Area_type_set(PointerRNA *ptr, int value)
}
ScrArea *area = (ScrArea *)ptr->data;
+ /* Empty areas are locked. */
+ if ((value == SPACE_EMPTY) || (area->spacetype == SPACE_EMPTY)) {
+ return;
+ }
+
area->butspacetype = value;
}
@@ -188,16 +181,20 @@ static void rna_Area_type_update(bContext *C, PointerRNA *ptr)
}
static const EnumPropertyItem *rna_Area_ui_type_itemf(bContext *C,
- PointerRNA *UNUSED(ptr),
+ PointerRNA *ptr,
PropertyRNA *UNUSED(prop),
bool *r_free)
{
EnumPropertyItem *item = NULL;
int totitem = 0;
- /* +1 to skip SPACE_EMPTY */
- for (const EnumPropertyItem *item_from = rna_enum_space_type_items + 1; item_from->identifier;
- item_from++) {
+ ScrArea *area = (ScrArea *)ptr->data;
+ const EnumPropertyItem *item_from = rna_enum_space_type_items;
+ if (area->spacetype != SPACE_EMPTY) {
+ item_from += 1; /* +1 to skip SPACE_EMPTY */
+ }
+
+ for (; item_from->identifier; item_from++) {
if (ELEM(item_from->value, SPACE_TOPBAR, SPACE_STATUSBAR)) {
continue;
}
@@ -224,6 +221,10 @@ static const EnumPropertyItem *rna_Area_ui_type_itemf(bContext *C,
static int rna_Area_ui_type_get(PointerRNA *ptr)
{
ScrArea *area = ptr->data;
+ /* This is for the Python API which may inspect empty areas. */
+ if (UNLIKELY(area->spacetype == SPACE_EMPTY)) {
+ return SPACE_EMPTY;
+ }
const int area_type = rna_Area_type_get(ptr);
const bool area_changing = area->butspacetype != SPACE_EMPTY;
int value = area_type << 16;
@@ -252,6 +253,10 @@ static void rna_Area_ui_type_set(PointerRNA *ptr, int value)
{
ScrArea *area = ptr->data;
const int space_type = value >> 16;
+ /* Empty areas are locked. */
+ if ((space_type == SPACE_EMPTY) || (area->spacetype == SPACE_EMPTY)) {
+ return;
+ }
SpaceType *st = BKE_spacetype_from_id(space_type);
rna_Area_type_set(ptr, space_type);
@@ -380,12 +385,17 @@ static void rna_def_area(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", HEADER_NO_PULLDOWN);
RNA_def_property_ui_text(prop, "Show Menus", "Show menus in the header");
+ /* Note on space type use of #SPACE_EMPTY, this is not visible to the user,
+ * and script authors should be able to assign this value, however the value may be set
+ * and needs to be read back by script authors.
+ *
+ * This happens when an area is full-screen (when #ScrArea.full is set).
+ * in this case reading the empty value is needed, but it should never be set, see: T87187. */
prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "spacetype");
RNA_def_property_enum_items(prop, rna_enum_space_type_items);
RNA_def_property_enum_default(prop, SPACE_VIEW3D);
- RNA_def_property_enum_funcs(
- prop, "rna_Area_type_get", "rna_Area_type_set", "rna_Area_type_itemf");
+ RNA_def_property_enum_funcs(prop, "rna_Area_type_get", "rna_Area_type_set", NULL);
RNA_def_property_ui_text(prop, "Editor Type", "Current editor type for this area");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);