(fix/WeakAuras): Resolve long-standing frame level overflow

Switches frame level assignment to depth-based ordering to avoid overflow
and ensure deterministic ordering. WeakAurasFrame now correctly lives on
FrameStrata MEDIUM without interfering with Blizzard UI elements.

(cherry picked from commit e92edf5700ad70587a71c3a403e5cc672dbc9e8e)
This commit is contained in:
NoM0Re
2025-12-24 23:34:24 -07:00
committed by andrew6180
parent aca47d69fd
commit 1836ba84d8
6 changed files with 38 additions and 48 deletions
-9
View File
@@ -1,9 +0,0 @@
-- Fix FrameStrata of ChatFrame
for i = 1, NUM_CHAT_WINDOWS do
local chatFrame = _G["ChatFrame" .. i]
if chatFrame and type(chatFrame.GetFrameStrata) == "function" and type(chatFrame.SetFrameStrata) == "function" then
if chatFrame:GetFrameStrata() == "BACKGROUND" then
chatFrame:SetFrameStrata("MEDIUM")
end
end
end
+2 -1
View File
@@ -41,7 +41,8 @@ local default = {
centerType = "LR",
gridWidth = 5,
rowSpace = 1,
columnSpace = 1
columnSpace = 1,
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
}
Private.regionPrototype.AddAlphaToDefault(default);
+1
View File
@@ -21,6 +21,7 @@ local default = {
borderSize = 2,
borderBackdrop = "Blizzard Tooltip",
scale = 1,
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
};
Private.regionPrototype.AddAlphaToDefault(default);
+25 -26
View File
@@ -1244,7 +1244,7 @@ end
local WeakAurasFrame = CreateFrame("Frame", "WeakAurasFrame", UIParent);
Private.frames["WeakAuras Main Frame"] = WeakAurasFrame;
WeakAurasFrame:SetAllPoints(UIParent);
WeakAurasFrame:SetFrameStrata("BACKGROUND");
WeakAurasFrame:SetFrameLevel(0)
local loadedFrame = CreateFrame("Frame");
Private.frames["Addon Initialization Handler"] = loadedFrame;
@@ -4159,56 +4159,55 @@ function Private.ValueToPath(data, path, value)
end
end
Private.frameLevels = {};
Private.frameLevels = {}
local function SetFrameLevel(id, frameLevel)
frameLevel = math.min(120, frameLevel)
if (Private.frameLevels[id] == frameLevel) then
return;
if Private.frameLevels[id] == frameLevel then
return
end
if (Private.regions[id] and Private.regions[id].region) then
if Private.regions[id] and Private.regions[id].region then
Private.ApplyFrameLevel(Private.regions[id].region, frameLevel)
end
if (clones[id]) then
for i,v in pairs(clones[id]) do
if clones[id] then
for _, v in pairs(clones[id]) do
Private.ApplyFrameLevel(v, frameLevel)
end
end
Private.frameLevels[id] = frameLevel;
Private.frameLevels[id] = frameLevel
end
local function FixGroupChildrenOrderImpl(data, frameLevel)
-- DepthBasedFrameLevels:
-- Root Group (0)
-- ├─ Aura (4)
-- ├─ Child Group (4)
-- │ ├─ Aura (8)
-- │ └─ Aura (8)
-- Root Aura (0)
local function ApplyDepthBasedFrameLevels(data, depth)
local frameLevel = depth * 4
SetFrameLevel(data.id, frameLevel)
local offset
if data.sharedFrameLevel then
offset = 0
else
offset = 4
if not data.controlledChildren then
return
end
for _, childId in ipairs(data.controlledChildren) do
local childData = WeakAuras.GetData(childId)
if childData.regionType ~= "group" and childData.regionType ~= "dynamicgroup" then
frameLevel = frameLevel + offset
SetFrameLevel(childId, frameLevel)
else
frameLevel = frameLevel + offset
local endFrameLevel = FixGroupChildrenOrderImpl(childData, frameLevel)
if not data.sharedFrameLevel then
frameLevel = endFrameLevel
end
if childData then
ApplyDepthBasedFrameLevels(childData, depth + 1)
end
end
return frameLevel
end
function Private.FixGroupChildrenOrderForGroup(data)
if data.parent then
return
end
FixGroupChildrenOrderImpl(data, 0)
ApplyDepthBasedFrameLevels(data, 0)
end
local function GetFrameLevelFor(id)
return Private.frameLevels[id] or 5;
return Private.frameLevels[id] or 5
end
function Private.ApplyFrameLevel(region, frameLevel)