From 4864e216e055e40f48c3826fce5dfff85e135e90 Mon Sep 17 00:00:00 2001 From: Glyalith Date: Mon, 7 Sep 2026 14:53:10 -0600 Subject: [PATCH] actionbars: throttle the arg1==0 slot-changed full walk too Every other ACTIONBAR_SLOT_CHANGED slot is throttled to ~4/sec with trailing coalescing, but arg1 == 0 ("all slots changed") was explicitly exempted as "rare and always passes." It isn't rare: a loadout manager that swaps talents, gear, and an action bar layout together can fire it several times in a burst, and each firing is an unthrottled full walk over every bar and button (~140+), painting texture/desat/usable-tint/ count/action-text on each one. Give arg1 == 0 the same throttle under its own key (0 is not a real action slot number, so it can't collide with per-slot state): leading edge still passes immediately, repeats within the window coalesce to one trailing re-dispatch. Reported by Embrace on 9.0.7: EllesmereUIActionBars freezing the game for 15-20 seconds when applying a BTWLoadouts loadout with Action Bars visibility set to Mouseover or Show When Spellbook Is Open, accompanied by repeated "exceeded its execution time limit" warnings through Blizzard's UpdateAction/OnActionBarSlotChanged. Full walk cost is independent of bar visibility mode, so this should help regardless, but I have not reproduced the Always-vs-Mouseover difference myself -- if it persists after this, the visibility/fade path needs its own look. --- EllesmereUIActionBars/EllesmereUIActionBars.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/EllesmereUIActionBars/EllesmereUIActionBars.lua b/EllesmereUIActionBars/EllesmereUIActionBars.lua index a12d25373..46970fa14 100644 --- a/EllesmereUIActionBars/EllesmereUIActionBars.lua +++ b/EllesmereUIActionBars/EllesmereUIActionBars.lua @@ -5057,9 +5057,12 @@ do -- bug whenever One Button Assist sits on a bar). Leading edge passes -- immediately (drag-drop/spec-swap bursts hit distinct slots, each passing -- instantly); repeats for the SAME slot inside the window defer to ONE - -- trailing re-dispatch, so the slot's final content always paints. arg1 - -- == 0 ("all slots") is rare and always passes. - if event == "ACTIONBAR_SLOT_CHANGED" and arg1 and arg1 ~= 0 then + -- trailing re-dispatch, so the slot's final content always paints. arg1 == 0 + -- ("all slots") shares this throttle under its own key (0 is not a real + -- slot number): a loadout swap changing talents/gear/bars at once can fire + -- it repeatedly, and unthrottled that was a full ~140-button walk per + -- firing with no coalescing (freeze reported via BTWLoadouts, Embrace 9.0.7). + if event == "ACTIONBAR_SLOT_CHANGED" and arg1 then local now = GetTime() local nextAt = ns._slotNext if not nextAt then nextAt = {}; ns._slotNext = nextAt end