From 164eb7e6245324706514ae6c9824becc688dfd3a Mon Sep 17 00:00:00 2001 From: grom Date: Sun, 1 Nov 2026 14:45:49 -0700 Subject: [PATCH] ui: the ClassicAPI-era templates addons inherit by name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `CreateFrame(): Couldn't find inherited node "DialogBorderOpaqueTemplate"` is where OpenMapClassic stopped — on its first file, inside Ace3, before a line of its own code ran. It is not that addon's problem: `BackdropTemplate` is named **unguarded** by Ace3 itself (`AceGUIContainer-Frame.lua:179` and `:206`, `AceGUIContainer-DropDownGroup.lua:128`), so every Ace3 addon on this install hits it. `assets/ui` does not grow, so this file carries its reason on that wall's own list: there is no stock 1.12 file to migrate from, because 1.12 has neither template. They are the same kind of surface as `script/compat/`'s verbs and live in XML only because `inherits=` is resolved by the loader and cannot be answered from Lua. **`BackdropTemplate` is correctly empty.** 9.0 moved the backdrop off the C side and invented `BackdropTemplateMixin` to put it back; 1.12 still has `SetBackdrop`/`GetBackdrop`/ `SetBackdropColor`/`SetBackdropBorderColor` as real frame methods, so a frame inheriting the template already answers all four. The mixin table exists for the `BackdropTemplateMixin and "BackdropTemplate" or nil` idiom and for `Mixin()`, its rows forwarding to the stock methods. **No getter rows**: a forwarding `GetBackdropColor` would call itself once `Mixin()` had written it onto the frame, and the stock one already answers. The dialog border is one `` over this client's own dialog art — the shape every stock 1.12 dialog draws, and the same block `GameMenuFrame.xml` uses — rather than a transcription of Era's nine `SharedUIPanelTemplates.xml` textures. The opaque variant differs only in background alpha, which is the one thing the two names disagree about. `enableMouse` stays off: it is a decoration over a frame that handles its own input, and a border that ate clicks would make an Ace options window unusable. Movement: openmap `AceConfigDialog:573` → `:586`, now wanting `SetNormalFontObject`. Full chain green. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn --- .../benilla-app/assets/ui/CompatTemplates.xml | 93 +++++++++++++++++++ crates/benilla-app/assets/ui/benilla.toc | 4 + .../src/ui_script/shipped_xml_tests.rs | 7 ++ 3 files changed, 104 insertions(+) create mode 100644 crates/benilla-app/assets/ui/CompatTemplates.xml diff --git a/crates/benilla-app/assets/ui/CompatTemplates.xml b/crates/benilla-app/assets/ui/CompatTemplates.xml new file mode 100644 index 00000000..49406a70 --- /dev/null +++ b/crates/benilla-app/assets/ui/CompatTemplates.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/benilla-app/assets/ui/benilla.toc b/crates/benilla-app/assets/ui/benilla.toc index 78dadbe8..6c060dd7 100644 --- a/crates/benilla-app/assets/ui/benilla.toc +++ b/crates/benilla-app/assets/ui/benilla.toc @@ -86,6 +86,10 @@ Interface\FrameXML\ComboFrame.xml # Ours: the scroll parts of our options window and script log. ScrollTemplates.xml +# The ClassicAPI-era templates addons inherit by name (Ace3 names two of them unguarded). +# Templates only, so anywhere above the addon load is correct; here, beside our other one. +CompatTemplates.xml + Interface\FrameXML\UIPanelTemplates.lua Interface\FrameXML\UIPanelTemplates.xml diff --git a/crates/benilla-app/src/ui_script/shipped_xml_tests.rs b/crates/benilla-app/src/ui_script/shipped_xml_tests.rs index 0ba149c8..f2324b7d 100644 --- a/crates/benilla-app/src/ui_script/shipped_xml_tests.rs +++ b/crates/benilla-app/src/ui_script/shipped_xml_tests.rs @@ -1974,6 +1974,13 @@ fn assets_ui_does_not_grow() { // falls through into `attempt to call local 'handledata'`. There is no stock file to // migrate — AIO is the realm's, not Blizzard's. The file's own header has the trace. "AIOHandlers.lua", + // Not a window either: the ClassicAPI-era FrameXML templates addons inherit by name, + // which have no stock 1.12 file to migrate from because 1.12 has no such templates. They + // live in XML rather than `script/compat/` only because `inherits=` is resolved by the + // loader and cannot be answered from Lua. Ace3 names two of them **unguarded**, so a + // missing one raises inside the library: `CreateFrame(): Couldn't find inherited node + // "DialogBorderOpaqueTemplate"` is where OpenMapClassic stopped, on its first file. + "CompatTemplates.xml", "ContainerFrameAdapters.xml", "GameMenuFrame.xml", "KeyBindingsPage.xml",