(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", centerType = "LR",
gridWidth = 5, gridWidth = 5,
rowSpace = 1, rowSpace = 1,
columnSpace = 1 columnSpace = 1,
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
} }
Private.regionPrototype.AddAlphaToDefault(default); Private.regionPrototype.AddAlphaToDefault(default);
+1
View File
@@ -21,6 +21,7 @@ local default = {
borderSize = 2, borderSize = 2,
borderBackdrop = "Blizzard Tooltip", borderBackdrop = "Blizzard Tooltip",
scale = 1, scale = 1,
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
}; };
Private.regionPrototype.AddAlphaToDefault(default); Private.regionPrototype.AddAlphaToDefault(default);
+25 -26
View File
@@ -1244,7 +1244,7 @@ end
local WeakAurasFrame = CreateFrame("Frame", "WeakAurasFrame", UIParent); local WeakAurasFrame = CreateFrame("Frame", "WeakAurasFrame", UIParent);
Private.frames["WeakAuras Main Frame"] = WeakAurasFrame; Private.frames["WeakAuras Main Frame"] = WeakAurasFrame;
WeakAurasFrame:SetAllPoints(UIParent); WeakAurasFrame:SetAllPoints(UIParent);
WeakAurasFrame:SetFrameStrata("BACKGROUND"); WeakAurasFrame:SetFrameLevel(0)
local loadedFrame = CreateFrame("Frame"); local loadedFrame = CreateFrame("Frame");
Private.frames["Addon Initialization Handler"] = loadedFrame; Private.frames["Addon Initialization Handler"] = loadedFrame;
@@ -4159,56 +4159,55 @@ function Private.ValueToPath(data, path, value)
end end
end end
Private.frameLevels = {}; Private.frameLevels = {}
local function SetFrameLevel(id, frameLevel) local function SetFrameLevel(id, frameLevel)
frameLevel = math.min(120, frameLevel) frameLevel = math.min(120, frameLevel)
if (Private.frameLevels[id] == frameLevel) then if Private.frameLevels[id] == frameLevel then
return; return
end 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) Private.ApplyFrameLevel(Private.regions[id].region, frameLevel)
end end
if (clones[id]) then if clones[id] then
for i,v in pairs(clones[id]) do for _, v in pairs(clones[id]) do
Private.ApplyFrameLevel(v, frameLevel) Private.ApplyFrameLevel(v, frameLevel)
end end
end end
Private.frameLevels[id] = frameLevel; Private.frameLevels[id] = frameLevel
end 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) SetFrameLevel(data.id, frameLevel)
local offset
if data.sharedFrameLevel then if not data.controlledChildren then
offset = 0 return
else
offset = 4
end end
for _, childId in ipairs(data.controlledChildren) do for _, childId in ipairs(data.controlledChildren) do
local childData = WeakAuras.GetData(childId) local childData = WeakAuras.GetData(childId)
if childData.regionType ~= "group" and childData.regionType ~= "dynamicgroup" then if childData then
frameLevel = frameLevel + offset ApplyDepthBasedFrameLevels(childData, depth + 1)
SetFrameLevel(childId, frameLevel)
else
frameLevel = frameLevel + offset
local endFrameLevel = FixGroupChildrenOrderImpl(childData, frameLevel)
if not data.sharedFrameLevel then
frameLevel = endFrameLevel
end end
end end
end end
return frameLevel
end
function Private.FixGroupChildrenOrderForGroup(data) function Private.FixGroupChildrenOrderForGroup(data)
if data.parent then if data.parent then
return return
end end
FixGroupChildrenOrderImpl(data, 0) ApplyDepthBasedFrameLevels(data, 0)
end end
local function GetFrameLevelFor(id) local function GetFrameLevelFor(id)
return Private.frameLevels[id] or 5; return Private.frameLevels[id] or 5
end end
function Private.ApplyFrameLevel(region, frameLevel) function Private.ApplyFrameLevel(region, frameLevel)
@@ -561,12 +561,11 @@ local function createOptions(id, data)
name = L["Flat Framelevels"], name = L["Flat Framelevels"],
desc = L["The group and all direct children will share the same base frame level."], desc = L["The group and all direct children will share the same base frame level."],
order = 30, order = 30,
set = function(info, v) get = function()
data.sharedFrameLevel = v return true
WeakAuras.Add(data) end,
for parent in OptionsPrivate.Private.TraverseParents(data) do set = function()
WeakAuras.Add(parent) -- Frame levels are flattened by default and cannot be changed on this version
end
end end
}, },
endHeader = { endHeader = {
+5 -6
View File
@@ -603,12 +603,11 @@ local function createOptions(id, data)
name = L["Flat Framelevels"], name = L["Flat Framelevels"],
desc = L["The group and all direct children will share the same base frame level."], desc = L["The group and all direct children will share the same base frame level."],
order = 47, order = 47,
set = function(info, v) get = function()
data.sharedFrameLevel = v return true
WeakAuras.Add(data) end,
for parent in OptionsPrivate.Private.TraverseParents(data) do set = function()
WeakAuras.Add(parent) -- Frame levels are flattened by default and cannot be changed on this version
end
end end
}, },
endHeader = { endHeader = {