Files
benilla-octo/crates/benilla-app/assets/ui/MultiBars.xml
T
SamandClaude Fable 5 348f55e37e four extra action bars as options, and the bottom band gets one owner
- the four extra action bars become per-character options, off by default, on a new Action Bars options page — the toggles ride the server's own byte (`CMSG_SET_ACTIONBAR_TOGGLES` into `PLAYER_FIELD_BYTES`), so a fresh character's zero is the default for free; turning the bottom-left bar off gives the stance bar its previously unbuilt unraised look, end-caps and 64×64 rings
- bag windows stop drawing straight through a raised bottom bar: the bottom band has ONE owner — the manage pass — the bag stack joins it through a listener seam, and a guard test walks all eight raisable-bar combinations across 24 bar/tenant pairs and refuses overlap
- the item-push card takes the reference's real geometry, closing the gap 0887 measured
- resizable addon windows stop at their bounds instead of pinning and walking across the screen: four per-frame f32s with 0.0 the disable sentinel, the clamp on the interactive drag only with the residual rebated out of the drag delta, `<ResizeBounds>` in XML honoured — and `SetFontString`'s three raises land exactly as the bytes have them

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 18:12:19 +07:00

533 lines
42 KiB
XML

<Ui>
<!--
**The four extra action bars — MultiBarBottomLeft/BottomRight and the vertical
MultiBarRight/MultiBarLeft — are PLAYER OPTIONS, and all four ship OFF (decision 1500,
which reverses 0270 and the half of 1219 that made "hidden" unconditional).**
0270 made the two bottom bars unconditionally on and the toggles unshippable; 1219 added
the two vertical ones as unconditionally hidden frames for the addons that index them. Both
were the director's call at the time, and 1500 is the director's call now: the four bars
become rows on the Options window's Action Bars page, and a fresh character sees none of
them.
THE STORE IS THE SERVER'S, not a CVar and not a saved variable — verified against the real
1.12.1 binary by a wow-re §5 cross-check (three independent derivations, arbitrated;
wow-5875-re commit 417c2d31, node system/ui/scratch/action-bar-toggles.md):
- The four bits live in **PLAYER_FIELD_BYTES byte 2**, written with
**CMSG_SET_ACTIONBAR_TOGGLES (opcode 703)**. Per-character and server-persisted, which is
what makes "off by default" fall out for free: a fresh character's byte is 0.
- `SetActionBarToggles` takes exactly **FOUR** arguments (`cmp esi,4` at 0x4e770e) and packs
them as arg1→0x01, arg2→0x02, arg3→0x04, arg4→0x08. **A FIFTH argument is silently
DROPPED by the binding** — it never reaches the byte or the wire — even though the
reference's own options panel passes ALWAYS_SHOW_MULTIBARS as one. That is why the grid
option below is a saved variable and the four bars are not: the split is a verified
consequence of the binding's arity, not an authoring choice.
- `GetActionBarToggles` returns exactly FOUR values, each the Lua number `1` or `nil` —
never booleans, and four nils when not in world.
- The client NEVER writes that field locally and NOTHING fires on a change to it. So the
LIVE state is the four Lua globals below; `GetActionBarToggles()` is read ONCE, on
PLAYER_ENTERING_WORLD (UIParent.xml), purely as their seed. Nothing re-reads it.
The bar↔bit mapping is a FrameXML-layer rule — the binary is bar-agnostic: 0x01 →
MultiBarBottomLeft, 0x02 → MultiBarBottomRight, 0x04 → MultiBarRight, 0x08 → MultiBarLeft,
and **MultiBarLeft shows only when bar 3 is ALSO on** (confirmed by reading the install's
own MultiActionBars.lua l.73, `if ( SHOW_MULTI_ACTIONBAR_3 and SHOW_MULTI_ACTIONBAR_4 )`).
That conjunction is not arbitrary: MultiBarLeft's TOPRIGHT hangs off MultiBarRight's
TOPLEFT, so on its own it would be a column of buttons anchored to a bar that is not there.
Geometry + slot ranges QUOTED from the real 1.12 FrameXML (extracted from patch.MPQ):
- ref-MultiActionBars.xml l.36-39/496-513: each bar a 500x38 frame; BottomLeft's
BOTTOMLEFT anchors to ActionButton1's TOPLEFT +(0,17); BottomRight's LEFT anchors to
BottomLeft's RIGHT +(10,0); 12 buttons chained BOTTOMLEFT then LEFT-of-prev-RIGHT +6.
- ref-ActionButton.lua l.6-9/446-467 (ActionButton_GetPagedID): BottomLeft = page 6 ⇒
actions 61..72; BottomRight = page 5 ⇒ actions 49..60. The bases below feed
BenillaActionButton_Action (ActionBar.xml), which carries the ref's parent-name fork
as per-button data.
- Buttons reuse BenillaActionButtonTemplate + the whole ActionBar.xml handler set: same
click/drag/keyless-use, same feedback layer (state/usable/cooldown/flash), fanned from
MainMenuBar's bar-level events via the BENILLA_ACTION_BUTTONS roster each button
joins at OnLoad.
Ref divergences (deliberate, mirroring ActionBar.xml's SCOPE notes):
- MULTIACTIONBAR1/2BUTTON1-12 are BINDABLE since 1008 (the ref's own commands, registered
in crate::bindings::commands with the ref's runOnUp pair below); they ship UNBOUND like
the ref (no MULTIACTIONBAR* line in any of the install's bindings-cache.wtf files), so
out of the box the hotkey corner still carries the ref's range dot — a bound slot wears
its abbreviated label exactly like the main bar (ActionBar.xml's PaintHotkey law).
- Empty wells hide (the ref's own default) and appear as drop-target rings only while the
grid is asked for — a held cursor payload, or ALWAYS_SHOW_MULTIBARS below — unlike the
main bar's always-visible wells (its art has sockets; floating rings over bare world
would not read as a bar).
- MULTIACTIONBAR3/4BUTTON (the vertical bars' commands) still stay OUT of
`bindings::commands`. 1008's honest tree held while those bars could never be shown, and
it holds differently now that they can: the keybind screen lists what the player can
reach, and a bar behind an option is reachable. Registering them is a separate slice with
its own default-bindings question; until then painting a hotkey from an unregistered
command is a no-op (GetBindingKey answers nil) and the label is simply blank.
-->
<Script><![CDATA[
-- ref ActionButton.lua:6-7 — BOTTOMLEFT_ACTIONBAR_PAGE = 6, BOTTOMRIGHT_ACTIONBAR_PAGE = 5;
-- base = (page - 1) * 12.
BENILLA_MULTIBAR_BOTTOMLEFT_BASE = 60
BENILLA_MULTIBAR_BOTTOMRIGHT_BASE = 48
-- ref ActionButton.lua:8-9 — LEFT_ACTIONBAR_PAGE = 4, RIGHT_ACTIONBAR_PAGE = 3.
BENILLA_MULTIBAR_LEFT_BASE = 36
BENILLA_MULTIBAR_RIGHT_BASE = 24
-- ref MultiActionBars.lua:1 — every extra bar is twelve wells wide.
NUM_MULTIBAR_BUTTONS = 12
-- ── The four toggles: LIVE state, seeded once from the server byte ──────────────────────
-- These names are the REFERENCE's and they are a published contract, not a private cache —
-- the addon corpus reads and writes them directly. Bartender2.lua:45-48 sets all four to 1
-- at load (it takes the bars over), and CT_BarMod reads each one by name in three separate
-- places to decide whether a button of ours is its business (CT_BarMod.lua:232-235,
-- 1573-1576, 1624-1627). So the names are fixed and the VALUES have to be what the corpus
-- expects: 1 or nil, exactly what GetActionBarToggles returns, never true/false.
--
-- nil here = OFF, which is also the whole of "off by default": a fresh character's server
-- byte is 0, and the seed on PLAYER_ENTERING_WORLD (UIParent.xml) writes these four back
-- to nil. Declared explicitly anyway rather than left absent — an undeclared global reads
-- nil too, but then nothing in this file says the state exists.
SHOW_MULTI_ACTIONBAR_1 = nil
SHOW_MULTI_ACTIONBAR_2 = nil
SHOW_MULTI_ACTIONBAR_3 = nil
SHOW_MULTI_ACTIONBAR_4 = nil
-- The FIFTH switch, and the one with a different store — see the header: the engine
-- binding drops a fifth argument, so this one has no server side and is an ordinary
-- saved-variable global, exactly as the reference makes it (UIOptionsFrame.lua l.106-107
-- assigns "0" and RegisterForSave's it). It holds the four bars' EMPTY wells open so the
-- player can see the shape of a bar they have not filled yet. String "1"/"0", because that
-- is what the options row's uvar store writes; zBar reads it as either
-- (zActionButton.lua:61 tests both spellings) and so does the reader below.
--
-- This assignment is also the row's registered DEFAULT: OptionsGlobalRow_OnLoad captures
-- the file-scope value at load, so this line is the single source of it.
ALWAYS_SHOW_MULTIBARS = "0"
-- The four bars in toggle (and bit) order, each paired with the main-bar page it takes OUT
-- of the paging cycle while it is up — a page a multibar already displays must not also be
-- reachable on the main bar, or paging up shows you the twelve actions already on screen
-- beside it. ActionBar.xml declares VIEWABLE_ACTION_BAR_PAGES with all six viewable (all
-- four bars start hidden) and this file does the arithmetic from there.
BENILLA_MULTIBARS = {
{frame = "MultiBarBottomLeft", page = BOTTOMLEFT_ACTIONBAR_PAGE},
{frame = "MultiBarBottomRight", page = BOTTOMRIGHT_ACTIONBAR_PAGE},
{frame = "MultiBarRight", page = RIGHT_ACTIONBAR_PAGE},
{frame = "MultiBarLeft", page = LEFT_ACTIONBAR_PAGE},
}
-- One bar: on screen or not, and the main-bar page it owns settled to match. Split out so
-- MultiActionBar_Update below reads as the four-line list it actually is — which is where
-- the one thing a reader must not miss lives (bar 4's compound condition).
function BenillaMultiBar_Settle(bar, up)
local frame = getglobal(bar.frame)
if up then
frame:Show()
VIEWABLE_ACTION_BAR_PAGES[bar.page] = nil
else
frame:Hide()
VIEWABLE_ACTION_BAR_PAGES[bar.page] = 1
end
end
-- Re-derive all four bars from the four globals. Every writer of that state calls this —
-- the options rows, the PLAYER_ENTERING_WORLD seed, and any addon that sets a global and
-- asks for the bars back (the reference's own contract, and Bartender2 relies on it).
--
-- **The manage pass runs from HERE, not from per-bar OnShow/OnHide**, and that is a choice
-- worth naming because both work. A bar coming up or going down moves the cast bar, the
-- chat frames, the stance/pet row and the bag stack's corner
-- (UIPARENT_MANAGED_FRAME_POSITIONS), and the pass reads the bars' own :IsShown() rather
-- than these globals — so it must run AFTER the last Show/Hide, not four times in the
-- middle of them. One call at the end of the one function that moves them is that; four
-- OnShow/OnHide hooks would fire the pass up to four times per click, and three of those
-- times against a half-applied state. The reference reaches the same place from the other
-- side: its options panel calls MultiActionBar_Update() and UIParent_ManageFramePositions()
-- back to back at every one of its five click sites (UIOptionsFrame.xml l.665-666 et al).
function MultiActionBar_Update()
local bars = BENILLA_MULTIBARS
BenillaMultiBar_Settle(bars[1], SHOW_MULTI_ACTIONBAR_1)
BenillaMultiBar_Settle(bars[2], SHOW_MULTI_ACTIONBAR_2)
BenillaMultiBar_Settle(bars[3], SHOW_MULTI_ACTIONBAR_3)
-- Bar 4 is the one bar with a COMPOUND condition (ref MultiActionBars.lua l.73) — see
-- the header for why MultiBarLeft cannot stand without MultiBarRight under it.
BenillaMultiBar_Settle(bars[4], SHOW_MULTI_ACTIONBAR_3 and SHOW_MULTI_ACTIONBAR_4)
UIParent_ManageFramePositions()
end
-- ── The empty-well grid over the four bars ──────────────────────────────────────────────
-- The three verbs are the reference's own published names and signatures, and the corpus
-- is why they are worth shipping as such: CT_BarMod REPLACES MultiActionBar_UpdateGrid
-- wholesale (CT_BarMod.lua:1649) and zBar WRAPS ShowAllGrids/HideAllGrids around its own
-- bars (zActionButton.lua:83-94), both by name and both expecting this shape. The
-- per-button half lives in ActionBar.xml (ActionButton_ShowGrid/_HideGrid over
-- `button.showgrid`), which is where the reference keeps it too.
function MultiActionBar_UpdateGrid(barName, show)
for i = 1, NUM_MULTIBAR_BUTTONS do
local button = getglobal(barName .. "Button" .. i)
if show then
ActionButton_ShowGrid(button)
else
ActionButton_HideGrid(button)
end
end
end
function MultiActionBar_ShowAllGrids()
for _, bar in ipairs(BENILLA_MULTIBARS) do
MultiActionBar_UpdateGrid(bar.frame, 1)
end
end
function MultiActionBar_HideAllGrids()
for _, bar in ipairs(BENILLA_MULTIBARS) do
MultiActionBar_UpdateGrid(bar.frame)
end
end
-- The option's apply: re-derive the grid from ALWAYS_SHOW_MULTIBARS. Run on every write of
-- that global (the row's applyFunc) and once at startup over the restored saved value —
-- the reference does the same restore by hand in its VARIABLES_LOADED ladder
-- (UIOptionsFrame.lua l.217-220); ours is OptionsFrame_ApplySavedSettings' walk.
--
-- Both spellings tested because the global is published and the two stores disagree: our
-- options row writes the STRING "1", while an addon setting it writes the number (zBar
-- tests both for exactly this reason, zActionButton.lua:61).
--
-- The `held` latch is ours and it is what makes this option a WELL-BEHAVED holder of the
-- count: one asker may hold at most one. Without it, re-applying an "off" that was already
-- off decrements every button again — so applying defaults while a payload is in hand would
-- close the wells that payload is holding open. The reference has exactly that flaw; the
-- latch also means the startup apply of the default "0" is a no-op instead of a decrement.
BENILLA_MULTIBAR_GRID_HELD = nil
function MultiActionBar_UpdateGridVisibility()
local want
if ALWAYS_SHOW_MULTIBARS == "1" or ALWAYS_SHOW_MULTIBARS == 1 then want = 1 end
if want == BENILLA_MULTIBAR_GRID_HELD then return end
BENILLA_MULTIBAR_GRID_HELD = want
if want then
MultiActionBar_ShowAllGrids()
return
end
MultiActionBar_HideAllGrids()
end
-- ── The write half of a bar toggle (the Options rows' setter) ───────────────────────────
-- The reference has no counterpart: its panel edits SHOW_MULTI_ACTIONBAR_n inline in each
-- checkbox's OnClick and batches ONE SetActionBarToggles into UIOptionsFrame_Save. Our
-- window commits on the click (0961's grammar, no Save button), so the whole edit — the
-- global, the bars, the packet — is this one function and the rows pass it a bar index.
--
-- `value` is the row's "1"/"0" STRING (OptionsRow_Set hands an API row its own string), and
-- the number/boolean spellings are tolerated because this is reachable from addon code too.
-- What is stored is 1 or nil and nothing else: that is what GetActionBarToggles returns and
-- what the corpus expects to read back (see the globals' own comment above).
--
-- **FOUR arguments.** Not five. The reference passes ALWAYS_SHOW_MULTIBARS as a fifth and
-- the binding drops it on the floor (`cmp esi,4` at 0x4e770e) — see the header. The whole
-- byte is re-sent every time because the packet carries the byte, not a delta.
function BenillaMultiBar_SetShown(bar, value)
local on
if value and value ~= "0" and value ~= 0 then on = 1 end
setglobal("SHOW_MULTI_ACTIONBAR_" .. bar, on)
MultiActionBar_Update()
SetActionBarToggles(SHOW_MULTI_ACTIONBAR_1, SHOW_MULTI_ACTIONBAR_2,
SHOW_MULTI_ACTIONBAR_3, SHOW_MULTI_ACTIONBAR_4)
end
-- The MULTIACTIONBAR keybind pair — ref MultiActionBars.lua:24-45 MultiActionButtonDown/Up,
-- the same NORMAL→PUSHED debounce dance as the main bar's ActionButtonDown/Up
-- (ActionBar.xml — the ref's MacroFrame_SaveMacro hook is not modeled there either).
-- Driven by the binding dispatch (crate::bindings, Kind::EdgeUpDown — decision 1008).
--
-- `bar` IS THE WHOLE FRAME-NAME PREFIX, not a suffix (decision 1199). The reference resolves
-- `getglobal(bar.."Button"..id)` and its own Bindings.xml passes "MultiBarBottomLeft"; ours
-- used to pass "BottomLeft" and splice "MultiBar" on in here. Same arity, different MEANING
-- — the silent kind of wrong shape: zBar calls `MultiActionButtonDown("zBar"..barid, id)`
-- and under the old splice built the nonexistent frame name "MultiBarzBar1Button1". The
-- caller now names the bar in full, exactly as the reference's binding does, so a third-
-- party bar can address these at all. `onSelf` rides to UseAction like ActionButtonUp's.
function MultiActionButtonDown(bar, id)
local button = getglobal(bar .. "Button" .. id)
if ( button:GetButtonState() == "NORMAL" ) then
button:SetButtonState("PUSHED")
end
end
function MultiActionButtonUp(bar, id, onSelf)
local button = getglobal(bar .. "Button" .. id)
if ( button:GetButtonState() == "PUSHED" ) then
button:SetButtonState("NORMAL")
UseAction(BenillaActionButton_Action(button), 0, onSelf)
-- Ref MultiActionButtonUp:39-43: the checked ring reflects the use immediately.
BenillaActionButton_UpdateState(button)
end
end
]]></Script>
<!-- frameStrata HIGH on both bottom bars is the ref's own (`MultiActionBars.xml` l.36 and l.151,
HorizontalMultiBar1/2). They share the bottom band with the bag windows, which are MEDIUM on
both sides by design — and both sides carry deep nested button trees, so co-tenanting one
stratum is exactly the level-outranks-insertion collision decision 0597 fixed for the party
frame. HIGH is what keeps the bars above an open bag.
`hidden="true"` on ALL FOUR bars since 1500 — the reference's own posture for every one of
them (its HorizontalMultiBar1/2 templates carry it too, l.36/l.151), and the shipped state
a character with a zero toggle byte lands in. MultiActionBar_Update is the only thing that
opens one. -->
<Frame name="MultiBarBottomLeft" frameStrata="HIGH" hidden="true">
<Size><AbsDimension x="500" y="38"/></Size>
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="ActionButton1" relativePoint="TOPLEFT"><Offset><AbsDimension x="0" y="17"/></Offset></Anchor>
</Anchors>
<Frames>
<CheckButton name="MultiBarBottomLeftButton1" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 1, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton2" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton1" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 2, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton3" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton2" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 3, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton4" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton3" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 4, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton5" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton4" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 5, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton6" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton5" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 6, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton7" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton6" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 7, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton8" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton7" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 8, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton9" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton8" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 9, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton10" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton9" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 10, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton11" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton10" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 11, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomLeftButton12" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomLeftButton11" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 12, BENILLA_MULTIBAR_BOTTOMLEFT_BASE, "MULTIACTIONBAR1BUTTON")</OnLoad></Scripts>
</CheckButton>
</Frames>
</Frame>
<!-- HIGH and hidden, same as BottomLeft above (ref `MultiActionBars.xml` l.151). -->
<Frame name="MultiBarBottomRight" frameStrata="HIGH" hidden="true">
<Size><AbsDimension x="500" y="38"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="MultiBarBottomLeft" relativePoint="RIGHT"><Offset><AbsDimension x="10" y="0"/></Offset></Anchor>
</Anchors>
<Frames>
<CheckButton name="MultiBarBottomRightButton1" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 1, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton2" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton1" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 2, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton3" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton2" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 3, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton4" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton3" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 4, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton5" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton4" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 5, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton6" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton5" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 6, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton7" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton6" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 7, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton8" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton7" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 8, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton9" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton8" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 9, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton10" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton9" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 10, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton11" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton10" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 11, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarBottomRightButton12" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="LEFT" relativeTo="MultiBarBottomRightButton11" relativePoint="RIGHT"><Offset><AbsDimension x="6" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 12, BENILLA_MULTIBAR_BOTTOMRIGHT_BASE, "MULTIACTIONBAR2BUTTON")</OnLoad></Scripts>
</CheckButton>
</Frames>
</Frame>
<!-- **The two VERTICAL bars — now the same kind of thing as the two above them.**
They were scoped out first (a bar nobody asked for should not exist), then 1219 built them
as real frames that shipped unconditionally hidden — because the reference does not choose
between "shown" and "absent": `MultiActionBars.xml` l.515/523 instantiates BOTH as real
`parent="UIParent"` frames whose templates (VerticalMultiBar3/4, l.266/381) carry
`hidden="true"`, and they stay hidden until SHOW_MULTI_ACTIONBAR_3/4 says otherwise.
What 1219 bought, and still buys, is that Atlas, Bartender2 and FuBartender2 stopped DYING
at session start on `MultiBarLeft` — Atlas at `Atlas.lua:387`
(`MultiBarLeft:SetFrameStrata("MEDIUM")`), Bartender2 at `Bartender2.lua:74`
(`MultiBarLeft:ClearAllPoints()`). Neither shows the bar; both only need it to be there.
Five more addons index `MultiBarRight` (decision 1218's corrected ranking).
What 1500 changed is only the last sentence of that story: "hidden, and nothing can show
it" has become "hidden, until the player ticks its row" — SHOW_MULTI_ACTIONBAR_3/4 and the
Options page's two Right ActionBar rows. `MultiBarLeft` still needs `MultiBarRight` under
it (the header's conjunction), which is why its row is a dependent child of bar 3's.
Pages from ref-ActionButton.lua l.8-9: LEFT_ACTIONBAR_PAGE = 4 (actions 37..48),
RIGHT_ACTIONBAR_PAGE = 3 (actions 25..36). Geometry from ref-MultiActionBars.xml: a 38x500
frame, button 1 at TOPRIGHT, each next TOP-to-BOTTOM of the previous at -6. -->
<Frame name="MultiBarRight" frameStrata="HIGH" hidden="true">
<Size><AbsDimension x="38" y="500"/></Size>
<Anchors>
<Anchor point="BOTTOMRIGHT"><Offset><AbsDimension x="-7" y="98"/></Offset></Anchor>
</Anchors>
<Frames>
<CheckButton name="MultiBarRightButton1" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOPRIGHT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 1, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton2" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton1" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 2, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton3" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton2" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 3, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton4" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton3" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 4, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton5" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton4" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 5, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton6" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton5" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 6, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton7" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton6" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 7, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton8" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton7" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 8, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton9" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton8" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 9, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton10" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton9" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 10, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton11" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton10" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 11, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarRightButton12" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarRightButton11" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 12, BENILLA_MULTIBAR_RIGHT_BASE, "MULTIACTIONBAR3BUTTON")</OnLoad></Scripts>
</CheckButton>
</Frames>
</Frame>
<Frame name="MultiBarLeft" frameStrata="HIGH" hidden="true">
<Size><AbsDimension x="38" y="500"/></Size>
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="MultiBarRight" relativePoint="TOPLEFT"><Offset><AbsDimension x="-5" y="0"/></Offset></Anchor>
</Anchors>
<Frames>
<CheckButton name="MultiBarLeftButton1" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOPRIGHT" relativePoint="TOPRIGHT"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 1, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton2" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton1" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 2, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton3" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton2" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 3, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton4" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton3" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 4, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton5" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton4" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 5, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton6" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton5" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 6, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton7" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton6" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 7, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton8" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton7" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 8, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton9" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton8" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 9, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton10" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton9" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 10, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton11" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton10" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 11, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
<CheckButton name="MultiBarLeftButton12" inherits="BenillaActionButtonTemplate">
<Anchors><Anchor point="TOP" relativeTo="MultiBarLeftButton11" relativePoint="BOTTOM"><Offset><AbsDimension x="0" y="-6"/></Offset></Anchor></Anchors>
<Scripts><OnLoad>BenillaActionButton_OnLoad(self, 12, BENILLA_MULTIBAR_LEFT_BASE, "MULTIACTIONBAR4BUTTON")</OnLoad></Scripts>
</CheckButton>
</Frames>
</Frame>
</Ui>