Skip to content

Releases: TytaniumDev/HeadsUpCDM

v2026.4.15.0

Choose a tag to compare

@github-actions github-actions released this 15 Apr 05:02
763cdfc

HeadsUpCDM

v2026.4.15.0 (2026-04-15)

Full Changelog Previous Releases

  • fix: restore Ayije CDM coexistence after 3.80 ForceRestyleAll regression (#14)
    • fix: prevent Ayije 3.80 ForceRestyleAll from resizing our CDM frames
      Ayije 3.80 added a new ForceRestyleAll function (registered as the
      "viewers_style" refresh callback) that iterates every active itemFrame
      in Essential and BuffIcon viewers and calls ApplyStyle, which calls
      frame:SetSize() with Ayjie's configured icon size — resizing our 48x48
      frames and breaking visual alignment with our row anchors.
      Add a fifth interop patch that hooks CDM.ApplyStyle and early-returns
      when the frame is a Blizzard CDM item frame (has cooldownID) in one of
      our owned viewers. The cooldownID gate keeps Ayjie's own tracker frames
      (Trinkets/Defensives, which are styled with vName=ESSENTIAL but lack
      cooldownID) on their normal styling path.
      Also extend the version-safety check to require ApplyStyle.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
    • Make Patch 5 conditional on CDM.ApplyStyle existing, and remove
      ApplyStyle from the mandatory version gate so Patches 1-4 still
      activate on pre-3.80 Ayije builds.
    • Return false (not bare return) from the ApplyStyle skip path for
      consistency with Patches 1-2.
    • Add a regression test asserting the nil-frame guard delegates safely.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.10.3

Choose a tag to compare

@github-actions github-actions released this 10 Apr 21:39
14b6d57

HeadsUpCDM

v2026.4.10.3 (2026-04-10)

Full Changelog Previous Releases

  • fix: pair Double Tap with Rapid Fire for MM hunters (#12)
    • fix: pair Double Tap with Rapid Fire for MM hunters
      Move the Double Tap buff (473370) from Aimed Shot to Rapid Fire in both
      MM_DARK_RANGER and MM_SENTINEL presets. Double Tap modifies Rapid Fire,
      so displaying it next to Rapid Fire is the intuitive pairing.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback — regression tests for Double Tap pairing
      Add assertions in both MM preset describe blocks that verify Double Tap
      is paired with Rapid Fire and that Aimed Shot only carries Bulletstorm.
      Protects against accidental reverts.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.10.2

Choose a tag to compare

@github-actions github-actions released this 10 Apr 21:07
6762a8a

HeadsUpCDM

v2026.4.10.2 (2026-04-10)

Full Changelog Previous Releases

  • fix: restore-to-stock-parent crashes on spec switch (#11)
    The do-restore snippet was calling b:SetParent(p) where p was the
    ActionButton's original Blizzard bar (MultiBarBottomRight, etc.),
    captured via btn:GetParent() at file-load time. In WoW 12.0's
    restricted execution environment these stock bar frames are protected
    but not "explicitly protected" for SetParent targeting, so the
    restricted env rejects the unwrapped handle and throws:
    RestrictedFrames.lua:622: Invalid frame handle for SetParent
    This fired on the first spec switch (RebuildDisplay -> TeardownDisplay
    -> DestroyActionColumn -> SetAttribute("do-restore", ...)).
    Cross-checked EllesmereUI: it never restores to stock bar parents and
    only SetParents to frames it owns (hiddenParent, UIParent). Strong
    evidence that "restore to stock parent" is not a viable pattern in
    12.0's restricted env.
    Fix: change do-restore to just Hide() the buttons. They remain parented
    to UIParent (where do-setup put them) in a neutral hidden state. The
    next spec's do-setup repositions and Shows whichever buttons the new
    spec needs. Drops the origParents cache and orig-N frame refs entirely
    since they served no other purpose.
    Trade-off: on addon disable without /reload, buttons used by the active
    spec stay hidden on the bar until reload (they don't return to stock
    positions). Previously they also didn't return — the restore simply
    crashed. Spec switches (the common case) are fully fixed.
    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.10.1

Choose a tag to compare

@github-actions github-actions released this 10 Apr 18:00
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

v2026.4.10.0

Choose a tag to compare

@github-actions github-actions released this 10 Apr 08:07
e1ac997

HeadsUpCDM

v2026.4.10.0 (2026-04-10)

Full Changelog Previous Releases

  • fix: anchor focus bar to column edges to avoid taint-blocked resize (#9)
    • fix: anchor focus bar to column edges to avoid taint-blocked resize
      The resource bar was created with SetSize + a single TOPLEFT anchor,
      and the post-reanchor height sync called SetHeight on it. In WoW 12.0,
      that SetHeight call is silently blocked by taint propagation from the
      Blizzard CDM hook chain that drives the initial reanchor, so the bar
      stayed stuck at the preset's full spell-count height until some later,
      non-tainted reanchor (e.g. after using Trueshot) happened to succeed.
      Switch to the same two-point anchor pattern BuffBars already uses —
      TOPLEFT + BOTTOMRIGHT to the column — so the bar auto-resizes through
      anchor geometry whenever the column's height is set. No tainted
      SetHeight required.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
      Remove dead resourceBar:SetHeight calls in ActionColumn.lua and
      BuffBars.lua. With the two-point anchor change in the previous commit,
      the bar's size is already driven by resourceColumn's dimensions, so
      the explicit SetHeight calls are no-ops and just confuse future
      readers about what's actually syncing.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.9.7

Choose a tag to compare

@github-actions github-actions released this 09 Apr 21:36
035e905

HeadsUpCDM

v2026.4.9.7 (2026-04-09)

Full Changelog Previous Releases

  • feat: filler spell icons for non-cooldown abilities (#8)
    • feat: add actionbar filler spell support (config, data, options)
    • Add actionBar.barName config default (MultiBar7 = bar 8)
    • Mark MM Arcane Shot as source="actionbar" in both MM presets
    • Correct buff spell IDs from in-game CDM debug:
      Precise Shots 260242→260240, Double Tap 260402→473370,
      Moonlight Chakram 429444→1264902
    • Add "Filler Spell Bar" dropdown to options panel
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • feat: filler spell icon frames and actionbar row layout
      Create non-secure icon frames for spells with source="actionbar",
      showing the spell texture in the HUD column. Keeps actionbar rows
      visible in RelayoutRows, syncs scale/alpha in ReanchorCDMFrames.
      Defer SetHeight calls in height sync to avoid taint from Blizzard
      RefreshLayout hook chains (WoW 12.0 taint system blocks SetHeight
      on addon frames when called from protected callback paths).
      Note: full ActionButton repositioning via SecureHandler is partially
      working (button visible + scaled) but positioning needs investigation.
      Using static icon frames as a reliable workaround for now.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
    • Wrap C_Spell.GetSpellInfo / SetTexture in pcall (taint-safe)
    • Use anonymous frames to avoid global namespace pollution on rebuild
    • Remove redundant hasCDMFrame assignment (already set via reset loop)
    • Add flag-based throttle for deferred height sync closures
    • Remove dead actionBar.barName config + options dropdown (not yet used)
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.9.6

Choose a tag to compare

@github-actions github-actions released this 09 Apr 20:02
1e73320

HeadsUpCDM

v2026.4.9.6 (2026-04-09)

Full Changelog Previous Releases

  • chore: add Wago release integration and analytics (#7)
    • chore: add Wago release integration and analytics
      Add X-Wago-ID and WagoAnalytics shim so BigWigsMods packager can
      auto-publish to Wago on tag push.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: move WagoAnalytics into Embedded Libraries section
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.9.5

Choose a tag to compare

@github-actions github-actions released this 09 Apr 19:39
7e4ae4d

HeadsUpCDM

v2026.4.9.5 (2026-04-09)

Full Changelog Previous Releases

  • feat: add /cdm shortcut to open Blizzard CDM settings (#6)
    • feat: add /cdm shortcut to open Blizzard CDM settings
      Register /cdm slash command and add "Open Blizzard CDM Settings" button
      to the options panel General tab. Both toggle the CooldownViewerSettings
      frame, matching the pattern used by Ayije_CDM.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
      Use after_each for CooldownViewerSettings cleanup in tests instead of
      manual nil resets, improving isolation if a test throws mid-execution.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.9.4

Choose a tag to compare

@github-actions github-actions released this 09 Apr 19:28
159a7dc

HeadsUpCDM

v2026.4.9.4 (2026-04-09)

Full Changelog Previous Releases

  • fix: handle CDM spell overrides in slot lookup (Trueshot → Moonlight Chakram) (#5)
    • fix: handle CDM spell overrides in slot lookup (Trueshot → Moonlight Chakram)
      When Trueshot is activated, Blizzard's CDM replaces it with Moonlight
      Chakram via overrideSpellID. The slot lookup only checked the display
      spell ID, missing the base spell that was actually registered. Now both
      override and base IDs are checked when matching frames to slots, keeping
      transformed spells anchored in the correct vertical position.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback — simplify slot lookup
      Use explicit overrideID/baseID checks in slot lookup instead of
      redundant spellID fallback, per reviewer suggestions.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com

v2026.4.9.3

Choose a tag to compare

@github-actions github-actions released this 09 Apr 06:43
e0cc858

HeadsUpCDM

v2026.4.9.3 (2026-04-09)

Full Changelog Previous Releases

  • fix: make scale/opacity work on CDM frames, remove anchoring (#4)
    • fix: make scale/opacity work on CDM frames and remove anchor-to-frame feature
      SetScale/SetAlpha on column frames only affected children — Blizzard CDM
      frames (action icons, buff icons) are children of the CDM viewers, not
      our columns. Now apply SetScale and SetAlpha directly to each CDM frame
      in ReanchorCDMFrames and ReanchorBuffIcons.
      Also:
    • Unified per-column scale sliders into a single HUD scale slider
    • Fixed layout math to account for scaled dimensions
    • Removed anchor-to-frame feature (Anchor To PlayerFrame/TargetFrame)
      in favor of freeform drag positioning only
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
    • chore: address review feedback
    • Add defensive nil guards on settings access in ReanchorCDMFrames and
      ReanchorBuffIcons
    • Reorder OptionsPanel setter calls: reanchor CDM frames before
      ArrangeColumns so layout uses up-to-date column dimensions
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com