Fix rare crash dragging number-buttons
authorCampbell Barton <ideasman42@gmail.com>
Mon, 1 Dec 2014 22:30:54 +0000 (23:30 +0100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 1 Dec 2014 22:39:06 +0000 (23:39 +0100)
Could happen dragging shape-keys UIList & the lower slider at once.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_utils.c

index b4792155e5592fd72426ecf67ae321074e7ec270..42f67379dfd3964ec864c63bc59b9f919c2c5a59 100644 (file)
@@ -1000,6 +1000,7 @@ void UI_butstore_free(uiBlock *block, uiButStore *bs);
 bool UI_butstore_is_valid(uiButStore *bs);
 bool UI_butstore_is_registered(uiBlock *block, uiBut *but);
 void UI_butstore_register(uiButStore *bs_handle, uiBut **but_p);
+bool UI_butstore_register_update(uiBlock *block, uiBut *but_dst, const uiBut *but_src);
 void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p);
 
 
index 93f5a8e58d65d184cbd458934741c95ee54edb45..92017e7a96724c50947f619ef72573e4d7c8855f 100644 (file)
@@ -723,6 +723,10 @@ static bool ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBu
 
                ui_but_update_linklines(block, oldbut, but);
 
+               if (!BLI_listbase_is_empty(&block->butstore)) {
+                       UI_butstore_register_update(block, oldbut, but);
+               }
+
                /* move/copy string from the new button to the old */
                /* needed for alt+mouse wheel over enums */
                if (but->str != but->strdata) {
index 854f17633704e525d2ddcb3ad3a0218129126620..6cd5f5a7e05580c6e21e9d46822c02aeb310aaab 100644 (file)
@@ -389,6 +389,27 @@ void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p)
        BLI_assert(0);
 }
 
+/**
+ * Update the pointer for a registered button.
+ */
+bool UI_butstore_register_update(uiBlock *block, uiBut *but_dst, const uiBut *but_src)
+{
+       uiButStore *bs_handle;
+       bool found = false;
+
+       for (bs_handle = block->butstore.first; bs_handle; bs_handle = bs_handle->next) {
+               uiButStoreElem *bs_elem;
+               for (bs_elem = bs_handle->items.first; bs_elem; bs_elem = bs_elem->next) {
+                       if (*bs_elem->but_p == but_src) {
+                               *bs_elem->but_p = but_dst;
+                               found = true;
+                       }
+               }
+       }
+
+       return found;
+}
+
 /**
  * NULL all pointers, don't free since the owner needs to be able to inspect.
  */