[Bf-blender-cvs] [1239cab11ff] master: Fix T75203: Crash when changing active keying set

Julian Eisel noreply at git.blender.org
Wed Apr 8 23:25:03 CEST 2020


Commit: 1239cab11ff97faec708c7a4cf11007ac2b37108
Author: Julian Eisel
Date:   Wed Apr 8 23:08:32 2020 +0200
Branches: master
https://developer.blender.org/rB1239cab11ff97faec708c7a4cf11007ac2b37108

Fix T75203: Crash when changing active keying set

When updating the active button, the search data wasn't updated, so it
kept using the old pointers. A check in `ui_rna_collection_search_cb()`
relied on this incorrect behavior so I had to fix that too. Note that
the previous commit was also needed for the second fix to work.

Caused by c46dcdf8871e.

===================================================================

M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_layout.c
M	source/blender/editors/interface/interface_utils.c

===================================================================

diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 339124db355..18666daa8b8 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -790,6 +790,9 @@ static bool ui_but_update_from_old_block(const bContext *C,
 
     SWAP(ListBase, but->extra_op_icons, oldbut->extra_op_icons);
 
+    SWAP(uiButSearchArgFreeFunc, oldbut->search_arg_free_func, but->search_arg_free_func);
+    SWAP(void *, oldbut->search_arg, but->search_arg);
+
     /* copy hardmin for list rows to prevent 'sticking' highlight to mouse position
      * when scrolling without moving mouse (see [#28432]) */
     if (ELEM(oldbut->type, UI_BTYPE_ROW, UI_BTYPE_LISTROW)) {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 942f19eb4e9..5573d9b2edb 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -1014,7 +1014,11 @@ typedef struct uiRNACollectionSearch {
   PointerRNA search_ptr;
   PropertyRNA *search_prop;
 
-  bool *but_changed; /* pointer to uiBut.changed */
+  uiBut *search_but;
+  /* Let UI_butstore_ API update search_but pointer above over redraws. */
+  uiButStore *butstore;
+  /* Block has to be stored for freeing butstore (uiBut.block doesn't work with undo). */
+  uiBlock *butstore_block;
 } uiRNACollectionSearch;
 void ui_rna_collection_search_cb(const struct bContext *C,
                                  void *arg,
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 44def6a2c09..92779c83d9a 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2577,6 +2577,13 @@ static void search_id_collection(StructRNA *ptype, PointerRNA *r_ptr, PropertyRN
   RNA_STRUCT_END;
 }
 
+static void ui_rna_collection_search_free_cb(void *ptr)
+{
+  uiRNACollectionSearch *coll_search = ptr;
+  UI_butstore_free(coll_search->butstore_block, coll_search->butstore);
+  MEM_freeN(ptr);
+}
+
 void ui_but_add_search(
     uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *searchptr, PropertyRNA *searchprop)
 {
@@ -2609,7 +2616,10 @@ void ui_but_add_search(
     coll_search->target_prop = prop;
     coll_search->search_ptr = *searchptr;
     coll_search->search_prop = searchprop;
-    coll_search->but_changed = &but->changed;
+    coll_search->search_but = but;
+    coll_search->butstore_block = but->block;
+    coll_search->butstore = UI_butstore_create(coll_search->butstore_block);
+    UI_butstore_register(coll_search->butstore, &coll_search->search_but);
 
     if (RNA_property_type(prop) == PROP_ENUM) {
       /* XXX, this will have a menu string,
@@ -2621,7 +2631,7 @@ void ui_but_add_search(
                            ui_searchbox_create_generic,
                            ui_rna_collection_search_cb,
                            coll_search,
-                           MEM_freeN,
+                           ui_rna_collection_search_free_cb,
                            NULL,
                            NULL);
   }
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 67cb91a3cc4..2d687781b61 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -399,7 +399,7 @@ void ui_rna_collection_search_cb(const struct bContext *C,
   int i = 0, iconid = 0, flag = RNA_property_flag(data->target_prop);
   ListBase *items_list = MEM_callocN(sizeof(ListBase), "items_list");
   CollItemSearch *cis;
-  const bool skip_filter = (data->but_changed && !(*data->but_changed));
+  const bool skip_filter = data->search_but && !data->search_but->changed;
 
   /* build a temporary list of relevant items first */
   RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) {



More information about the Bf-blender-cvs mailing list