- the bag windows are the reference's own `ContainerFrame.xml` running off the player's patch chain — decision 1751 makes the stock 1.12 UI off the install the end state and `assets/ui` scaffolding that retires file-by-file (86 files against the 99-file stock corpus, 72% of the 1128-function global surface already built) — via one ordered manifest, `benilla.toc`, where a bare name is a file we ship and an `Interface\FrameXML\` path is the player's own file; the windows on screen are `ContainerFrame1..12`, the bank's six copy-pasted popouts fold into them at ids 5..10, net −750 lines, and the swap forced real engine verbs into being rather than stubs (`SetBagPortaitTexture` with its id-0 no-texture arm, `GameTooltip:AppendText`, `SetButtonPulse`, and a `<Model>` whose file is the cooldown indicator materializing as the native sweep, which three corpus addons inherit) - the 1.12 walk toggle lands: `TOGGLERUN` latches one bit with `ToggleRun`'s own silent refusal chain (dead, rooted, on a live server spline), and the walk animation was never missing at all — the flag reaches it through exactly one channel, the speed (`0x5fd100` picks Walk over Run on `speed > 2 × walkSpeed`); pinning it caught our remote extrapolator with the two min rungs backwards — `min(walk, run)` runs BEFORE the backward min, so a walking backpedaller moves at 2.5 yd/s where we would have played them the Run clip at 4.5 — and one shared `current_speed` now keeps the local controller and the extrapolator from ever disagreeing about it - the instance and raid lockout messages exist — six packets that were dropped as unknown opcodes now land, four of them as the CHAT_MSG_SYSTEM lines the client composes itself, which is why no Lua handler ever surfaced them — plus `IsInInstance`, `ResetInstances`, and the unit popup's "Reset all instances" row behind the reference's own predicate; where the binary contradicts vmangos: the ownership flag means "any instance bind" but vmangos only ever names raid binds, so the row was dead for every character without a raid lockout — term 1 is now also satisfied by our own eyes, walking out of a party dungeon the server itself bound us to - opening the world map showed 3D world at the sheet's margins: `BlackoutWorld` was parented to the very `UIParent` a fullscreen panel hides, and three more frames had crossed the same boundary — the shared dropdown lists (so the map's continent and zone pickers answered a click with nothing at all), the master-looter menu, and the screenshot confirmation, which could never appear during a cinematic; `frame_flag_gate` now checks the parent seat against the reference both ways a frame acquires one (the attribute, template-inherited included, and `<Frames>` nesting), and its first harvest took 30 divergences down to three accepted ones Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
122 lines
6.0 KiB
XML
122 lines
6.0 KiB
XML
<Ui>
|
|
<!--
|
|
Print screen's UI half (decision 1487) — the centred "Screen Captured" line, and the
|
|
`TakeScreenshot()` the SCREENSHOT binding runs.
|
|
|
|
WHAT THE REFERENCE DOES, and why this file's ordering is the whole feature. Its
|
|
Bindings.xml maps SCREENSHOT to `TakeScreenshot()`; that function hides this frame, THEN
|
|
asks the engine to capture; the engine answers later with SCREENSHOT_SUCCEEDED or
|
|
SCREENSHOT_FAILED, and only then does the text appear. So the message can never be in the
|
|
picture, on either path:
|
|
|
|
· the ordinary press — the outcome event lands frames after the readback, because the
|
|
readback is asynchronous (`crate::screenshot`'s writer reports through a channel);
|
|
· the double press inside the 1.5 s fade — the PREVIOUS shot's text is still on screen,
|
|
and the Hide() below is what takes it off before the shutter.
|
|
|
|
That second case is the one worth naming: it is the only way a "Screen Captured" could ever
|
|
have reached a file, and it is why `TakeScreenshot` hides rather than just letting the fade
|
|
run out. B261 asked for exactly this contract.
|
|
|
|
PROVENANCE. The mechanism, the globals' names, the 1.5 s fade and the two strings are the
|
|
reference's (its WorldFrame.xml/.lua carry them; the strings are GlobalStrings.lua l.3395-6,
|
|
quoted as data like every other user-visible byte in this tree). The code is ours: the
|
|
reference recomputes elapsed from `GetTime() - this.startTime` on every tick and ignores the
|
|
elapsed its OnUpdate is handed — we accumulate the handed value instead, which is one clock
|
|
read fewer per frame and one field fewer on the frame.
|
|
|
|
SEATING. `parent="WorldFrame" setAllPoints="true"` with a CENTER-anchored string — the
|
|
reference's own nesting (WorldFrame.xml l.42, inside WorldFrame's `<Frames>`), and it is
|
|
load-bearing rather than decorative. That file's header states the law in one line:
|
|
"Children of the world frame are visible even when the UI is turned off." benilla's
|
|
WorldFrame is a stub (UIParent.xml) rather than the 3D layer, but it is a stub with the
|
|
property that matters here — top-level, so nothing hides it.
|
|
|
|
This read `parent="UIParent"` until 1757, on a note that argued the two seats are the same
|
|
because both frames are full-screen and their CENTERs coincide. That was true of the
|
|
GEOMETRY and blind to the rest: decision 1734 restored `SetFullScreenFrame`'s
|
|
`UIParent:Hide()`, so under a fullscreen panel the UIParent seat is a hidden one — and the
|
|
case that exposes it is this frame's own, because `CinematicFrame` answers the SCREENSHOT
|
|
key by hand (`RunBinding`, 1701) precisely so a fly-by can be captured, and the
|
|
confirmation for that capture could never appear. TOOLTIP strata is the reference's own —
|
|
the confirmation has to be readable over whatever panel is open, and an explicit strata is
|
|
not dragged down by a BACKGROUND-strata parent.
|
|
-->
|
|
<Script>
|
|
<![CDATA[
|
|
-- The two lines this frame can show, byte-exact from the 1.12 enUS GlobalStrings
|
|
-- (interface.MPQ `GlobalStrings.lua`, line-cited) — user-visible text, so its bytes are the
|
|
-- contract. Note the capital C: it is "Screen Captured", not "Screen captured".
|
|
SCREENSHOT_SUCCESS = "Screen Captured"; -- GlobalStrings.lua:3396
|
|
SCREENSHOT_FAILURE = "Screen Capture Failed";-- GlobalStrings.lua:3395
|
|
|
|
-- Seconds the line takes to fade from full to gone. The reference's own value, and a
|
|
-- GLOBAL there too — an addon may read or retune it, so it keeps the name.
|
|
SCREENSHOT_STATUS_FADETIME = 1.5;
|
|
|
|
-- The SCREENSHOT binding's body. Hide first, capture second: see the header.
|
|
function TakeScreenshot()
|
|
if ( ScreenshotStatus:IsVisible() ) then
|
|
ScreenshotStatus:Hide();
|
|
end
|
|
Screenshot();
|
|
end
|
|
|
|
function ScreenshotStatus_OnLoad()
|
|
this:RegisterEvent("SCREENSHOT_SUCCEEDED");
|
|
this:RegisterEvent("SCREENSHOT_FAILED");
|
|
end
|
|
|
|
function ScreenshotStatus_OnEvent(event)
|
|
if ( event == "SCREENSHOT_FAILED" ) then
|
|
ScreenshotStatusText:SetText(SCREENSHOT_FAILURE);
|
|
else
|
|
ScreenshotStatusText:SetText(SCREENSHOT_SUCCESS);
|
|
end
|
|
-- The fade restarts from full on every outcome, so a second shot re-announces itself
|
|
-- at full strength instead of inheriting whatever alpha the last one had faded to.
|
|
this.fade = 0;
|
|
this:SetAlpha(1.0);
|
|
this:Show();
|
|
end
|
|
|
|
function ScreenshotStatus_OnUpdate(elapsed)
|
|
local fade = (this.fade or 0) + (elapsed or 0);
|
|
this.fade = fade;
|
|
if ( fade >= SCREENSHOT_STATUS_FADETIME ) then
|
|
this:Hide();
|
|
return;
|
|
end
|
|
this:SetAlpha(1.0 - fade / SCREENSHOT_STATUS_FADETIME);
|
|
end
|
|
]]>
|
|
</Script>
|
|
|
|
<Frame name="ScreenshotStatus" parent="WorldFrame" setAllPoints="true" frameStrata="TOOLTIP" hidden="true">
|
|
<Layers>
|
|
<Layer level="ARTWORK">
|
|
<FontString name="ScreenshotStatusText" inherits="SystemFont">
|
|
<Anchors>
|
|
<Anchor point="CENTER" relativeTo="UIParent">
|
|
<Offset>
|
|
<AbsDimension x="0" y="0"/>
|
|
</Offset>
|
|
</Anchor>
|
|
</Anchors>
|
|
</FontString>
|
|
</Layer>
|
|
</Layers>
|
|
<Scripts>
|
|
<OnLoad>
|
|
ScreenshotStatus_OnLoad();
|
|
</OnLoad>
|
|
<OnEvent>
|
|
ScreenshotStatus_OnEvent(event);
|
|
</OnEvent>
|
|
<OnUpdate>
|
|
ScreenshotStatus_OnUpdate(arg1);
|
|
</OnUpdate>
|
|
</Scripts>
|
|
</Frame>
|
|
</Ui>
|