Commit: 8e717ce55aee27cc97b44770026792f65dd106ca
Author: Julian Eisel
Date:   Fri May 13 17:48:10 2022 +0200
Branches: blender-v3.2-release
https://developer.blender.org/rB8e717ce55aee27cc97b44770026792f65dd106ca

Fix crash when displaying some button tooltips

Steps to reproduce were:
- Factory startup
- Right-click in 3D View
- Move the mouse over "Shade Flat", wait for the tooltip

The changed logic in 4680331749aa to lookup an active button was
incorrect. It didn't respect the priority of active button candidates.

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

M       source/blender/editors/interface/interface_handlers.c

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

diff --git a/source/blender/editors/interface/interface_handlers.c 
b/source/blender/editors/interface/interface_handlers.c
index 9d30ad992c9..d2dfa3c2285 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8709,28 +8709,36 @@ static uiBut *ui_context_button_active(const ARegion 
*region, bool (*but_check_c
   uiBut *but_found = NULL;
 
   while (region) {
-    uiBut *activebut = NULL;
+    /* Follow this exact priority (from highest to lowest priority):
+     * 1) Active-override button (#UI_BUT_ACTIVE_OVERRIDE).
+     * 2) The real active button.
+     * 3) The previously active button (#UI_BUT_LAST_ACTIVE).
+     */
+    uiBut *active_but_override = NULL;
+    uiBut *active_but_real = NULL;
+    uiBut *active_but_last = NULL;
 
     /* find active button */
     LISTBASE_FOREACH (uiBlock *, block, &region->uiblocks) {
       LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
         if (but->flag & UI_BUT_ACTIVE_OVERRIDE) {
-          activebut = but;
-          break;
+          active_but_override = but;
         }
         if (but->active) {
-          activebut = but;
-          break;
+          active_but_real = but;
         }
         if (but->flag & UI_BUT_LAST_ACTIVE) {
-          activebut = but;
-          break;
+          active_but_last = but;
         }
       }
+    }
 
-      if (activebut) {
-        break;
-      }
+    uiBut *activebut = active_but_override;
+    if (!activebut) {
+      activebut = active_but_real;
+    }
+    if (!activebut) {
+      activebut = active_but_last;
     }
 
     if (activebut && (but_check_cb == NULL || but_check_cb(activebut))) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to