diff --git a/crates/benilla-app/assets/ui/ChatFrame.xml b/crates/benilla-app/assets/ui/ChatFrame.xml
index 734e2e3c..563db094 100644
--- a/crates/benilla-app/assets/ui/ChatFrame.xml
+++ b/crates/benilla-app/assets/ui/ChatFrame.xml
@@ -847,7 +847,7 @@
-- declared width as `noResize` + a fixed list width (UIDropDownMenu.xml l.672-679),
-- so transcribing it would pin the menu at 50 px and cut "Background" in half. In the
-- reference, MENU mode never draws the capsule at all, so its width is inert there.
- -- `BenillaFriendsDropDown` (FriendsFrame.xml) is already this same shape.
+ -- `FriendsDropDown` (FriendsFrame.xml) is already this same shape.
function FCFOptionsDropDown_OnLoad()
this.initialize = FCFOptionsDropDown_Initialize
this.displayMode = "MENU"
diff --git a/crates/benilla-app/assets/ui/ComboFrame.xml b/crates/benilla-app/assets/ui/ComboFrame.xml
deleted file mode 100644
index 020b9aba..00000000
--- a/crates/benilla-app/assets/ui/ComboFrame.xml
+++ /dev/null
@@ -1,199 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:RegisterEvent("PLAYER_TARGET_CHANGED");
- this:RegisterEvent("PLAYER_COMBO_POINTS");
- ComboPoint1Highlight:SetAlpha(0);
- ComboPoint1Shine:SetAlpha(0);
-
-
- ComboPointsFrame_OnEvent();
-
-
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/DurabilityFrame.xml b/crates/benilla-app/assets/ui/DurabilityFrame.xml
deleted file mode 100644
index a5850189..00000000
--- a/crates/benilla-app/assets/ui/DurabilityFrame.xml
+++ /dev/null
@@ -1,324 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetFrameLevel(this:GetFrameLevel() - 1)
- this:RegisterEvent("UPDATE_INVENTORY_ALERTS")
- this:RegisterEvent("PLAYER_ENTERING_WORLD")
-
-
- DurabilityFrame_SetAlerts()
- -- benilla re-manages the HUD right-stack on every alert recompute. The ref keeps
- -- the durability seat (and the quest tracker stacked under it) fresh because it
- -- fires UIParent_ManageFramePositions from dozens of OnShow/OnHide sites; benilla
- -- fires it from only a handful, so a showSeparate glyph that arrives AFTER the
- -- frame is already shown — equipment streams in per-slot at login, the weapon
- -- often breaking before the shield's slot lands — would otherwise leave
- -- durabilityOffset stale and hang the shield off the screen's right edge
- -- (director-caught). SetAlerts's own Show()/Hide() only re-manages on a
- -- shown-state transition, which a mere glyph-set change is not.
- UIParent_ManageFramePositions()
-
-
- UIParent_ManageFramePositions()
-
-
- UIParent_ManageFramePositions()
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/Fonts.xml b/crates/benilla-app/assets/ui/Fonts.xml
index cbacae2e..83894284 100644
--- a/crates/benilla-app/assets/ui/Fonts.xml
+++ b/crates/benilla-app/assets/ui/Fonts.xml
@@ -135,10 +135,31 @@
-- iterates it). Still zero corpus addons, so the demand here is ours, not theirs.
CHAT_FONT_HEIGHTS = { 12, 14, 16, 18 }
- -- The two OTHER tables the reference's Fonts.xml `
diff --git a/crates/benilla-app/assets/ui/FriendsFrame.xml b/crates/benilla-app/assets/ui/FriendsFrame.xml
index e9baaa03..155a1b8a 100644
--- a/crates/benilla-app/assets/ui/FriendsFrame.xml
+++ b/crates/benilla-app/assets/ui/FriendsFrame.xml
@@ -36,7 +36,7 @@
GuildRegistrar / PetitionFrame / TabardFrame, no charter or emblem path. Nothing in it
is reachable until you are IN a guild, which is what this file now covers.
· The row right-click menu IS the shared UnitPopup "FRIEND" menu, addressed by name
- (see `BenillaFriendsFrame_ShowDropdown`). Its TARGET row stays hidden by UnitPopup's
+ (see `FriendsFrame_ShowDropdown`). Its TARGET row stays hidden by UnitPopup's
own deferred set; its GUILD_PROMOTE/GUILD_LEAVE rows are live but gate themselves on
`GuildFrame:IsVisible()`, so a friends-list or /who row still opens
Whisper / Invite / Cancel and a guild roster row opens more.
@@ -274,6 +274,16 @@
end
-- ── The row right-click menu (ref FriendsFrame_ShowDropdown l.35-47) ───────────────────
+ -- **The reference's own names, in the reference's own file, since 1751 window 6.** These
+ -- three carried a `Benilla` prefix for one reason: our ItemRef.xml declared a second
+ -- private copy of the same pair under the plain names, loaded 262 entries earlier, and
+ -- two definitions of one name is the collision this manifest's order exists to settle.
+ -- That window is the reference's own file now and its `SetItemRef` calls
+ -- `FriendsFrame_ShowDropdown` by name — so the duplicate is deleted, the one body answers
+ -- to the name its home file publishes in 1.12, and `FriendsDropDown` is seated where the
+ -- reference seats it (which retired a `frame_flag_gate` KNOWN entry whose whole reasoning
+ -- was that forward-parent problem).
+
-- A row's right-click opens the shared UnitPopup "FRIEND" menu addressed by NAME rather
-- than by a unit token — which is the whole reason that menu exists: a friend or a /who
-- hit is a name with no unit behind it (they need not even be in the world). The kit
@@ -282,22 +292,23 @@
--
-- `connected` gates the whole menu, ref-verbatim: there is nothing to offer an offline
-- player. A /who hit is by definition online, so that call passes 1.
- function BenillaFriendsFrame_ShowDropdown(name, connected)
+ function FriendsFrame_ShowDropdown(name, connected)
HideDropDownMenu(1)
if not connected or not name or name == "" then
return
end
- BenillaFriendsDropDown.initialize = BenillaFriendsFrameDropDown_Initialize
- BenillaFriendsDropDown.displayMode = "MENU"
- BenillaFriendsDropDown.name = name
- ToggleDropDownMenu(1, nil, BenillaFriendsDropDown, "cursor")
+ FriendsDropDown.initialize = FriendsFrameDropDown_Initialize
+ FriendsDropDown.displayMode = "MENU"
+ FriendsDropDown.name = name
+ ToggleDropDownMenu(1, nil, FriendsDropDown, "cursor")
end
- function BenillaFriendsFrameDropDown_Initialize()
+ function FriendsFrameDropDown_Initialize()
UnitPopup_ShowMenu(getglobal(UIDROPDOWNMENU_OPEN_MENU), "FRIEND", nil,
- BenillaFriendsDropDown.name)
+ FriendsDropDown.name)
end
+
-- ── The window's repaint (ref FriendsFrame_Update l.81-126) ────────────────────────────
-- Each tab swaps the four corner art textures as well as the sub-frame: the ref reuses one
-- 384x512 window shell for lists that want different bottom art.
@@ -820,7 +831,7 @@
local guildIndex = this.guildIndex
local name, rank, rankIndex, level, class, zone, note, officernote, online =
GetGuildRosterInfo(guildIndex)
- BenillaFriendsFrame_ShowDropdown(name, online)
+ FriendsFrame_ShowDropdown(name, online)
return
end
GuildFrame.previousSelectedGuildMember = GuildFrame.selectedGuildMember
@@ -1308,7 +1319,7 @@
function FriendsFrameFriendButton_OnClick(button)
if button == "RightButton" then
local name, _, _, _, connected = GetFriendInfo(this:GetID())
- BenillaFriendsFrame_ShowDropdown(name, connected)
+ FriendsFrame_ShowDropdown(name, connected)
return
end
SetSelectedFriend(this:GetID())
@@ -1324,7 +1335,7 @@
local name = getglobal(this:GetName() .. "Name"):GetText()
if button == "RightButton" then
-- A /who hit is online by construction, so the menu is never gated shut here.
- BenillaFriendsFrame_ShowDropdown(name, 1)
+ FriendsFrame_ShowDropdown(name, 1)
return
end
WhoFrame.selectedWho = this.whoIndex
@@ -2081,7 +2092,7 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this.timeOfDay = 0;
- this:SetFrameLevel(this:GetFrameLevel() + 2);
- GameTimeFrame_Update();
-
-
- GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT");
- GameTimeFrame_UpdateTooltip(GetGameTime());
-
-
- GameTooltip:Hide();
-
-
- GameTimeFrame_Update();
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/ItemRef.xml b/crates/benilla-app/assets/ui/ItemRef.xml
deleted file mode 100644
index ba279778..00000000
--- a/crates/benilla-app/assets/ui/ItemRef.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- GameTooltip_OnLoad(self)
- self:SetPadding(16)
-
-
-
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/ItemTextFrame.xml b/crates/benilla-app/assets/ui/ItemTextFrame.xml
deleted file mode 100644
index 6906cca7..00000000
--- a/crates/benilla-app/assets/ui/ItemTextFrame.xml
+++ /dev/null
@@ -1,416 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ScrollFrame_OnLoad()
- this.scrollBarHideable = 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetFrameLevel(this:GetFrameLevel()+1)
-
-
-
-
-
-
-
-
-
- ItemTextFrame_OnLoad()
- ItemTextFrame_OnEvent(event)
- ItemTextFrame_OnUpdate(arg1)
- PlaySound("igMainMenuOpen")
-
- CloseItemText()
- PlaySound("igMainMenuClose")
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/MirrorTimer.xml b/crates/benilla-app/assets/ui/MirrorTimer.xml
deleted file mode 100644
index 3dc1fd37..00000000
--- a/crates/benilla-app/assets/ui/MirrorTimer.xml
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetFrameLevel(this:GetFrameLevel() - 1)
-
-
-
-
-
- MirrorTimerFrame_OnLoad()
- MirrorTimerFrame_OnEvent()
- MirrorTimerFrame_OnUpdate(this, arg1)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MirrorTimerDriver_OnLoad()
- MirrorTimerDriver_OnEvent()
-
-
-
diff --git a/crates/benilla-app/assets/ui/RaidFrame.xml b/crates/benilla-app/assets/ui/RaidFrame.xml
index f7553390..ff5a2adb 100644
--- a/crates/benilla-app/assets/ui/RaidFrame.xml
+++ b/crates/benilla-app/assets/ui/RaidFrame.xml
@@ -796,7 +796,7 @@
-
diff --git a/crates/benilla-app/assets/ui/UIParent.xml b/crates/benilla-app/assets/ui/UIParent.xml
index 54a5e7dd..a9e2c22e 100644
--- a/crates/benilla-app/assets/ui/UIParent.xml
+++ b/crates/benilla-app/assets/ui/UIParent.xml
@@ -32,6 +32,8 @@
+ this:RegisterEvent("VARIABLES_LOADED")
+ this:RegisterEvent("MIRROR_TIMER_START")
this:RegisterEvent("PLAYER_ENTERING_WORLD")
this:RegisterEvent("READY_CHECK")
@@ -205,6 +207,32 @@
-- ~25 per-window harnesses that load this file load no bars; the binding itself is engine
-- level and always installed. Decision 1500.
function UIParent_OnEvent(event)
+ -- The reference's own first arm (UIParent.lua l.230-235). `LocalizeFrames` comes from
+ -- the sourced `Interface\FrameXML\Localization.xml` (1751 window 5) and is the file
+ -- that sets `TwentyFourHourTime` and the locale's frame adjustments; nothing called it
+ -- here before, which is why GameTime.xml used to set that global itself and why
+ -- HelpFrame.xml's header records a family of strings that never arrived. Guarded like
+ -- every other cross-file reach in this function: the per-window harnesses load
+ -- UIParent.xml with no chain behind it. `UpdateNameplates` is the ref's other call in
+ -- this arm and is not bound here — left absent rather than stubbed (1203).
+ if ( event == "VARIABLES_LOADED" ) then
+ if ( LocalizeFrames ) then
+ LocalizeFrames()
+ end
+ return
+ end
+ -- The mirror bars' START driver (ref UIParent.lua l.97 + l.374-377). It lived on a
+ -- hidden `MirrorTimerDriver` frame in our own MirrorTimer.xml until 1751 window 7,
+ -- on the reasoning that "our UIParent.xml is script-only — it has no frame of its own
+ -- to register events on". That stopped being true when this file grew a real UIParent
+ -- frame with a Scripts block, so the driver came home and the extra frame is gone.
+ -- `MirrorTimer_Show` is the sourced `Interface\FrameXML\MirrorTimer.lua`'s.
+ if ( event == "MIRROR_TIMER_START" ) then
+ if ( MirrorTimer_Show ) then
+ MirrorTimer_Show(arg1, arg2, arg3, arg4, arg5, arg6)
+ end
+ return
+ end
if ( event == "PLAYER_ENTERING_WORLD" ) then
SHOW_MULTI_ACTIONBAR_1, SHOW_MULTI_ACTIONBAR_2, SHOW_MULTI_ACTIONBAR_3,
SHOW_MULTI_ACTIONBAR_4 = GetActionBarToggles()
@@ -292,6 +320,88 @@
table.insert(UIPARENT_MANAGED_POSITION_LISTENERS, fn)
end
+ -- ── GetMaterialTextColors (ref UIParent.lua l.1880-1888) ─────────────────────────────
+ --
+ -- The page ink and the title ink for a readable's material. Transcribed here rather than
+ -- left absent because the sourced `Interface\FrameXML\ItemTextFrame.xml` (1751 window 9)
+ -- calls it, and it belongs in this file because it belongs in `UIParent.lua`. The two
+ -- tables it reads are the reference's own, in the reference's own home — our Fonts.xml,
+ -- which grew them with the same window.
+ --
+ -- The fallback is BOTH-or-neither on purpose (the reference's own `not(a and b)`), so an
+ -- unrecognised material never gets one table's colour and the other's default.
+ function GetMaterialTextColors(material)
+ local textColor = MATERIAL_TEXT_COLOR_TABLE[material]
+ local titleColor = MATERIAL_TITLETEXT_COLOR_TABLE[material]
+ if ( not (textColor and titleColor) ) then
+ textColor = MATERIAL_TEXT_COLOR_TABLE["Default"]
+ titleColor = MATERIAL_TITLETEXT_COLOR_TABLE["Default"]
+ end
+ return textColor, titleColor
+ end
+
+ -- ── ValidateFramePosition (ref UIParent.lua l.1513-1557) ─────────────────────────────
+ --
+ -- Shove a frame the player has dragged mostly off the screen back on. Transcribed here
+ -- rather than left absent because its one caller in 1.12 is the sourced
+ -- `Interface\FrameXML\ItemRef.xml`'s OnDragStop (l.48) — so with that window migrated
+ -- (1751, window 6) a player dragging a chat-link tooltip would otherwise hit a nil global,
+ -- which is a raise on an ordinary gesture rather than a loud missing feature. It belongs
+ -- in this file because it belongs in `UIParent.lua`, which this file is our copy of.
+ --
+ -- Verbatim, quirks included. Two are worth naming so nobody "fixes" them later:
+ -- · the two axes are exclusive, not additive — a frame off BOTH corners takes the
+ -- `not newAnchorX` branch and re-derives x from `left`, so only one axis moves per
+ -- drop. That is the reference's own control flow (l.1544-1548), not a transcription
+ -- slip.
+ -- · the bottom test is against `MainMenuBar:GetHeight()`, so this raises with no action
+ -- bar loaded. The reference has the same dependency; the harnesses that drive
+ -- ItemRefTooltip load ActionBar.xml for it.
+ function ValidateFramePosition(frame, offscreenPadding, returnOffscreen)
+ if ( not frame ) then
+ return
+ end
+ local left = frame:GetLeft()
+ local right = frame:GetRight()
+ local top = frame:GetTop()
+ local bottom = frame:GetBottom()
+ local newAnchorX, newAnchorY
+ if ( not offscreenPadding ) then
+ offscreenPadding = 15
+ end
+ if ( top < (0 + MainMenuBar:GetHeight() + offscreenPadding) ) then
+ -- Off the bottom of the screen
+ newAnchorY = MainMenuBar:GetHeight() + frame:GetHeight() - GetScreenHeight()
+ elseif ( bottom > GetScreenHeight() ) then
+ -- Off the top of the screen
+ newAnchorY = 0
+ end
+ if ( right < 0 ) then
+ -- Off the left of the screen
+ newAnchorX = 0
+ elseif ( left > GetScreenWidth() ) then
+ -- Off the right of the screen
+ newAnchorX = GetScreenWidth() - frame:GetWidth()
+ end
+ if ( newAnchorX or newAnchorY ) then
+ if ( returnOffscreen ) then
+ return 1
+ else
+ if ( not newAnchorX ) then
+ newAnchorX = left
+ elseif ( not newAnchorY ) then
+ newAnchorY = top - GetScreenHeight()
+ end
+ frame:ClearAllPoints()
+ frame:SetPoint("TOPLEFT", nil, "TOPLEFT", newAnchorX, newAnchorY)
+ end
+ else
+ if ( returnOffscreen ) then
+ return nil
+ end
+ end
+ end
+
function UIParent_ManageFramePositions()
-- Frames that affect offsets in y axis
local yOffsetFrames = {}
diff --git a/crates/benilla-app/assets/ui/UiPanels.xml b/crates/benilla-app/assets/ui/UiPanels.xml
index 13835054..0b99154c 100644
--- a/crates/benilla-app/assets/ui/UiPanels.xml
+++ b/crates/benilla-app/assets/ui/UiPanels.xml
@@ -972,9 +972,15 @@
-- the StaticPopupDialogs registry + StaticPopup_Show(which, arg1, arg2) + the OnUpdate
-- countdown/StartDelay machinery — the death arc's dialogs exercise nearly all of it, and
-- StaticPopup_Show/StaticPopupDialogs are 1.14 addon-API surface (0068). v1 scope:
- -- · TWO dialog instances (STATICPOPUP_NUMDIALOGS = 2; the ref runs 4) — the deepest
- -- nesting exercised so far is decline-res re-showing DEATH (Show precedes the click's
- -- hide, so a free second instance is required). Grow toward 4 when a third coexists.
+ -- · FOUR dialog instances, the reference's own count. It was 2 for a long time, on the
+ -- reasoning that the deepest nesting exercised was decline-res re-showing DEATH (Show
+ -- precedes the click's hide, so a free second instance is required) and that it should
+ -- "grow toward 4 when a third coexists". 1751 window 7 supplied that third caller from
+ -- an unexpected direction: the reference's own `MirrorTimer_Show` bounds its free-bar
+ -- search by this constant rather than by `MIRRORTIMER_NUMTIMERS` (MirrorTimer.lua
+ -- l.32, a copy-paste from StaticPopup.lua), so at 2 the third mirror bar was
+ -- unreachable for a new timer. The coupling is the reference's bug and this is not the
+ -- file to fix it in; matching its count is.
-- · info fields honored: text, button1, button2, DisplayButton2, OnShow(data),
-- OnHide(data), OnAccept(data, data2) (truthy return = keep open — RECOVER_CORPSE
-- waits for the server, XP_LOSS's first Accept re-asks), OnCancel(data, reason)
@@ -1007,7 +1013,7 @@
-- · Resize runs per tick while shown, not only on text swaps: GetHeight's measure has a
-- frame of latency (the measured-width convention below), so the height self-corrects
-- the frame after any text change.
- STATICPOPUP_NUMDIALOGS = 2
+ STATICPOPUP_NUMDIALOGS = 4
StaticPopupDialogs = {}
local function StaticPopupTimeUnit(n, minutes)
@@ -2448,6 +2454,19 @@
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ZoneSplashFrame_OnLoad();
-
-
- ZoneTextFrame_OnEvent(event);
-
-
- FadingFrame_OnUpdate();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SubZoneTextFrame_OnLoad();
-
-
- SubZoneTextFrame_OnEvent();
-
-
- FadingFrame_OnUpdate();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- AutoFollowStatus_OnLoad();
-
-
- AutoFollowStatus_OnEvent(event);
-
-
- AutoFollowStatus_OnUpdate(arg1);
-
-
-
-
diff --git a/crates/benilla-app/assets/ui/benilla.toc b/crates/benilla-app/assets/ui/benilla.toc
index 71bbf7e3..1ad9d32e 100644
--- a/crates/benilla-app/assets/ui/benilla.toc
+++ b/crates/benilla-app/assets/ui/benilla.toc
@@ -39,6 +39,22 @@
# The named virtual Font objects (decision 0084) — must load first so any FontString's
# `inherits="GameFontNormal"` resolves against a registered object.
Fonts.xml
+# ══ THE LOCALE ADJUSTMENTS — the reference's own, off the player's chain (1751, window 5) ══
+# `Localize()` (which this file also CALLS at load, exactly as the reference's own two-part
+# `