Skip to content

v2026.4.10.1

Choose a tag to compare

@github-actions github-actions released this 10 Apr 18:00
· 4 commits to main since this release
e55f51f

HeadsUpCDM

v2026.4.10.1 (2026-04-10)

Full Changelog Previous Releases

  • feat: real ActionButton reparenting via SecureHandler (#10)
    • feat: add bar/slot fields to actionbar spell entries
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • feat: add bar-to-button mapping and resolver
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • feat: SecureHandler setup for ActionButton reparenting
      Replace static icon creation with SecureHandler restricted code that
      reparents real Blizzard ActionButtons to HUD row frames. Falls back
      to static icons if the button global is missing.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • feat: teardown restores ActionButtons via SecureHandler
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: reparent ActionButton to UIParent, anchor relative to row
      Option A (SetParent to plain row frame) confirmed not working in-game.
      Try B1: reparent button to UIParent in restricted code, but SetPoint
      relative to our row frame. Button is child of UIParent (always visible)
      and positioned at the row's screen location.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: use absolute UIParent offsets for ActionButton positioning (Option B2)
      Options A and B1 confirmed not working in-game: restricted code cannot
      anchor to non-secure frame refs. Now computing absolute screen position
      of each row via GetLeft/GetTop, passing as pipe-delimited attribute,
      and anchoring to UIParent with BOTTOMLEFT offsets in restricted code.
      Matches EllesmereUI's proven pattern.
      Handler trigger is deferred via C_Timer.After(0) so row positions are
      finalized by ArrangeColumns before we read them.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: create SecureHandler at file-load time for explicit protection
      Runtime-created SecureHandler frames cannot execute protected operations
      on Blizzard ActionButtons in WoW 12.0. The handler must be created at
      file-load time (before PLAYER_LOGIN) to be "explicitly protected".
      Changed to match EllesmereUI's exact pattern:
    • Single handler created at file scope (not inside CreateActionColumn)
    • SecureHandlerAttributeTemplate (not Base)
    • SetAttributeNoHandler for snippet installation
    • Indexed frame refs (btn-N, orig-N) and layout attributes (layout-N)
    • Triggered via do-setup / do-restore attributes
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: compensate for button scale in position calculation
      SetScale affects anchor coordinate interpretation — WoW multiplies
      SetPoint offsets by the frame's scale. Divide position by scale before
      encoding so the final screen position matches the row location.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: don't apply HUD scale to real ActionButtons
      SetScale on an ActionButton interacts with SetPoint offsets in the
      restricted code, causing position drift that's hard to compensate for.
      Leave real ActionButtons at native scale (48x48, scale 1.0). The HUD
      scale slider still applies to the column layout and fallback icons.
      If consistent sizing across the HUD becomes important, we can revisit
      this trade-off.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • feat: remove HUD scale option, re-anchor buttons on drag
    • Remove scale slider from options panel and per-column scale defaults
    • Remove SetScale calls from ActionColumn, BuffIcons, Layout (alpha only)
    • Re-trigger TriggerActionBarHandlers in OnDragStop so real ActionButtons
      follow the HUD when it's repositioned in unlock mode
    • Update tests to reflect alpha-only column settings
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • fix: don't force-show buff icons on reanchor
      Blizzard's CDM manages buff icon visibility based on actual buff state.
      Calling frame:Show() unconditionally in ReanchorBuffIcons overrode those
      decisions, causing inactive buffs (e.g. Bulletstorm, Moonlight Chakram)
      to display at full opacity. Remove the Show call — our job is only to
      reposition, not to control visibility.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
      Fixes three real bugs flagged by Claude in the PR review:
    1. Stale layout-i attributes in TriggerActionBarHandlers: the old
      code only wrote layout-i when row coordinates were valid, leaving
      stale values from prior triggers. Now always clear invalid slots
      via SetAttribute(nil) so the restricted code's if b and layout then guard skips them cleanly. Also rename count to
      validCount for clarity.
    2. Combat-lockdown silent failure in DestroyActionColumn: firing
      do-restore during combat is silently blocked because restricted
      SetParent/SetPoint can't execute. Buttons would stay reparented to
      UIParent until /reload. Now: set a pending flag, warn the user,
      and flush from Core.lua's OnCombatDrop handler. Same pattern added
      to TriggerActionBarHandlers for combat-lockdown re-trigger.
    3. Persistent origParents cache: a deferred restore would target the
      wrong parent if a new CreateActionColumn ran before the flush
      (btn:GetParent() would be UIParent, not the real Blizzard bar).
      File-level weak-keyed table captures the TRUE original parent the
      first time we see each button and never overwrites it.
      Also: clear btn-count in the restricted do-restore block so a stale
      do-setup can't act on already-restored refs.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com