BarShelf

Hide your action bars and access them on-demand through compact popup shelves. Reparents Blizzard's own buttons — full cooldown/range support in combat. Fully configurable via Blizzard Settings.

File Details

v1.4.5

  • R
  • Apr 12, 2026
  • 465.90 KB
  • 26
  • 12.0.1
  • Retail

File Name

Barshelf-v1.4.5.zip

Supported Versions

  • 12.0.1

v1.4.5

Bug Fixes

  • Empty action bar slots blinking when opening a shelf (long-standing): LayoutBarPopup unconditionally Show()ed every managed slot, and Blizzard's ActionBarActionButtonMixin:OnShowUpdateActionHideGridHide cycle caused a one-frame flash of visible empty slots every time the popup opened. Most visible on non-12-slot layouts (e.g. a 3×3 bar) where internal state churn is more frequent. Now: LayoutBarPopup gates Show() on HasAction(button.action) or the alwaysShowActionBars CVar, matching Blizzard's native rule. A defensive HookScript("OnShow") on each managed button also re-Hide()s empty slots that Blizzard shows outside of an active drag — same game frame, nothing renders between Show and Hide. A module-level _barshelfDragShowing flag, toggled by the ACTIONBAR_SHOWGRID/HIDEGRID handler, lets drag-time Show through.
  • Custom Shelf list mode broken when Masque is enabled: list mode builds a wide rowWidth × bsz button with the icon texture anchored LEFT at bsz × bsz, but Masque skin definitions assume a square button and SetAllPoints(button) the Icon region — so the icon and border stretched across the entire row. Custom-shelf buttons now skip Masque registration when config.layout == "list". Switching layouts triggers a rebuild, so the decision is re-made each toggle.

New Features

  • Masque integration for Custom Shelves: Barshelf registers its custom SecureActionButtons with Masque under a dedicated "Custom Shelves" group, so users can skin them independently of their main bars. Bar / Micro / Bag shelves are already skinned natively by Masque's built-in hooks for ActionButton, MultiBar*, MicroButton*, and bag slots (reparenting doesn't break them), so no registration is needed there. A callback on SkinID/Scale changes re-runs the popup layout so button-dimension changes take effect immediately. Declared via ## OptionalDeps: Masque in the TOC.

v1.4.4

Bug Fixes

  • Bar shelf leaving orphaned slots on the original bar: AddBarShelf counted visible buttons via IsShown() and ActivateBarShelf only reparented that many, leaving any button Blizzard had hidden (e.g. via Edit Mode "Num Icons" < 12) in its original MultiBar*ButtonContainer. When EditModeActionBarMixin:UpdateVisibility / UpdateShownButtons re-ran (combat end, Edit Mode toggle, zone change), those orphaned buttons reappeared at the native bar position. Now iterates 1..info.count unconditionally; managed buttons go in the popup, excess buttons are parked in a per-shelf hidden holder frame.
  • Visibility feedback loop with EditModeActionBarMixin: the previous approach registered a "hide" visibility state driver on the Blizzard bar frame and hooked its OnShow to re-call :Hide(). Because MultiBar*:Hide() is intercepted by SetShownOverride, Blizzard's UpdateVisibility would call ShowBase → fire OnShow → our hook → :Hide() → recalc → loop. Removed the state driver and OnShow hook entirely; since all 12 buttons are now reparented out, the bar's containers are empty and nothing visible is left to hide.
  • Removed unused bar-shelf watchdog OnUpdate: Blizzard doesn't reparent action buttons the way it reparents micro buttons (no UpdateMicroButtonsParent equivalent), so the 1 s reparent-reassert loop on each bar popup was dead weight and contributed to the "frequent polling" feel.

v1.4.3

Bug Fixes

  • LFG "eye" icon disappearing with the micro menu shelf: QueueStatusButton is declared as a child of MicroMenuContainer in Blizzard's QueueStatusFrame.xml, so hiding the container also hid the Group Finder eye. The eye is now reparented to UIParent while a micro shelf is active and survives Blizzard's UpdateMicroButtonsParent() via a hooksecurefunc on SetParent (with reentrancy guard). Reattached to its original parent on deactivate, profile change, and Edit Mode entry.

New Features

  • Movable LFG eye: Shift + left-click-drag the Group Finder eye to reposition it. Uses OnMouseDown/OnMouseUp instead of OnDragStart for instant response (no movement-threshold wait). Position persists per-profile in db.profile.queueStatusButtonPoint. Default location is BOTTOMRIGHT -40, 200.
  • Smart info panel anchor: QueueStatusFrame (the queue info panel) now flips anchor based on which screen quadrant the eye is in, so it always extends toward screen center instead of flying off-screen when the eye is dragged to an edge.
  • Move hint in the info panel: A small "Shift-drag the eye to move" line is added to the bottom of QueueStatusFrame while the micro shelf is active. hooksecurefunc on SetHeight reserves bottom padding so the hint never collides with Blizzard's dynamic queue content.

v1.4.2

Bug Fixes

  • Action Bar 3/4/5 mapped to the wrong Blizzard bar: BAR_INFO used the legacy MULTIACTIONBAR1..4 ordering, so picking "Action Bar 5" reparented MultiBarBottomRightButton (Blizzard's Action Bar 3) and "Action Bar 4" reparented MultiBarLeftButton (Blizzard's Action Bar 5). Remapped indices 3/4/5 to match Edit Mode: Action Bar 3 → BottomRight, Action Bar 4 → Right, Action Bar 5 → Left. Existing saved shelves keep their barID and will now show the bar their label claims.

v1.4.1

Bug Fixes

  • Empty bar shelf slots not showing during drag: Reparented action buttons were missing Blizzard's ShowGrid broadcast (sent to action bar children only). Now listens for ACTIONBAR_SHOWGRID/ACTIONBAR_HIDEGRID events and forwards ShowGrid/HideGrid to reparented buttons, keeping the internal counter in sync so empty slots stay visible while dragging.
  • Right mouse button stuck when entering combat: The click-outside-to-close backdrop was a Button with EnableMouse(true), consuming all mouse events including right-click even though only left-click was processed. Changed to a Frame with SetPropagateMouseClicks(true) so right-clicks always pass through to the game world.

v1.4.0

New Features

  • List layout mode for custom shelves: New per-shelf "Layout" dropdown (Grid / List). List mode shows buttons in a vertical single-column layout with icon, spell/item name, and hotkey per row. Popup width auto-adjusts to label lengths (150–300px). The # of Rows slider is hidden in list mode.

Bug Fixes

  • Shelf rename not saving: Edit boxes now save on focus-lost (blur) in addition to Enter, fixing rename inside the Blizzard Settings panel where Enter/Backspace/arrow keys were intercepted. Escape reverts to the previous value.
  • Arrow/Backspace keys not working in edit boxes: Keybind capture buttons were consuming keyboard events even when not in listening mode. They now propagate keys through when inactive.
  • Flyout spells silently rejected: Dragging a flyout spell (e.g. Hunter Pet Skills, Mage Portals) onto a custom shelf now shows a helpful message instead of silently ignoring the drop.

v1.3.3

Bug Fixes

  • Right mouse button getting stuck: The click-outside-to-close backdrop was registering for all mouse buttons (AnyUp), which could swallow RightButtonUp events before the game received them — causing the right mouse button to appear stuck. Now only listens for left-click.

v1.3.2

Bug Fixes

  • Cooldown taint errors in combat: Fixed "secret values are only allowed during untainted execution" errors. In 12.0.1, addon code cannot pass secret cooldown values to ANY display function (SetCooldown, CooldownFrame_Set, SetTimeFromStart — all reject secrets from tainted code). Now uses isActive (boolean, never secret) to branch, and issecretvalue() to detect secret values before passing them. Cooldowns display normally outside combat; gracefully degrade during combat when values are secret.

v1.3.1

Bug Fixes

  • Shelf rename not working: Fixed label edit box not responding to Enter/Backspace. Switched from BackdropTemplate to InputBoxTemplate which properly handles keyboard input inside the Blizzard Settings panel.

v1.3.0

New Features

  • Mount support on custom shelves: Drag mounts from the Collections journal onto custom shelf buttons. Uses /cast macro for reliable summoning.
  • Battle pet support on custom shelves: Drag companion pets from the Pet Journal onto custom shelf buttons. Summons via /summonpet.
  • Keybindings for custom shelves: Assign key bindings to individual custom shelf slots via the per-shelf settings panel. Bindings work even when the popup is closed (via invisible proxy buttons). Keybind text shown on each button.

Improvements

  • Cooldown display on custom shelves: Proper dark "pizza" sweep overlay with countdown text, matching Blizzard's native action buttons. Uses issecretvalue() to handle 12.0.1 secret combat values gracefully.
  • GCD animation: Global cooldown sweep now shows on all custom shelf buttons. Event-driven via SPELL_UPDATE_COOLDOWN / ACTIONBAR_UPDATE_COOLDOWN for instant response. Off-GCD abilities (defensives, some trinkets) correctly skip the sweep.
  • Handle icon for mounts, macros, and battle pets: Dock handle now picks up icons from all custom shelf action types, not just spells and items.

Bug Fixes

  • Items not activating on click: Fixed SecureActionButtonTemplate item attribute format — now uses "item:ID" string instead of raw numeric ID.
  • Item cooldowns not displaying: Fixed C_Item.GetItemCooldown return value unpacking — returns three separate values, not a table (unlike C_Spell.GetSpellCooldown). Added bag/equipment scan fallback with location caching for combat safety.

v1.2.1

New Options

  • Click outside to close popups: Toggle in General settings. When disabled, shelf popups stay open until their handle is clicked again — useful for dragging spells from the spellbook onto action bar shelves without the shelf auto-closing.
  • Center popups on dock: Toggle in General settings. Centers shelf popups horizontally on the dock instead of aligning them to their individual handle. Both options are off by default (existing behavior preserved).

Improvements

  • Pinned popup drag grip: The grip is now a visible tab that protrudes above the popup frame (16px, with background and dot pattern). Hidden at idle and appears on mouseover for a cleaner look.
  • Grip integrated with popup fade: Hovering the grip keeps the pinned popup at full opacity; the grip shares the same enter/leave polling as the popup itself.

Bug Fixes

  • Blizzard Action Bar 1 appearing over shelves: Added an aggressive OnShow hook on hidden bar frames to immediately re-hide them when Blizzard's TWW action bar code tries to show them. Properly managed through activate/deactivate/Edit Mode cycles.
  • Bags not opening in combat: Removed unnecessary InCombatLockdown() guard from ToggleAllBags() call. Also set the bag handle's secure snippet to a no-op to prevent popup toggle side-effects during combat.
  • Edit Mode exit redundancy: Simplified OnEditModeExit to just call RebuildAll() instead of manually re-hiding bars then rebuilding (the rebuild already handles everything).

v1.2.0

New Shelf Types

  • Bags shelf: Click handle to toggle all bags open/closed. Handle displays used/total bag space using template keywords ($used/$total). No popup — pure handle convenience.
  • Status shelf: Custom XP and reputation progress bars in a popup. Purple XP bar with level/percentage, green reputation bar with faction/standing. Handle shows compact template text (e.g., Lv$level $xp%). Hides Blizzard's status tracking bars.
  • Micro menu shelf: Reparent Blizzard's micro menu buttons into a shelf popup. Auto-detects available buttons, native sizing, configurable rows.
  • Multi-faction tracking: Track multiple reputations beyond Blizzard's watched faction. Hierarchical faction picker organized by expansion with search. Each tracked faction gets its own colored bar in the status popup.

Pinned Popups

  • Pin any shelf as an always-visible bar via the "Pin as bar" checkbox.
  • Drag pinned popups anywhere on screen via the grip handle at the top.
  • Per-shelf idle opacity with mouseover reveal (reuses dock fade pattern).
  • Handle click toggles pinned popup visibility without unpinning.
  • Pinned popups survive ESC, backdrop clicks, and close-others.
  • Hidden during Edit Mode, restored after.

Icon Picker

  • Click the shelf icon preview to browse all WoW icons in a scrollable grid.
  • 32K+ icon name database (auto-updated monthly from Townlong Yak via CI).
  • Search by icon filename, spell name (from spellbook), or FileDataID.
  • FauxScrollFrame virtual scrolling — only visible buttons exist in memory.
  • Drag spell/item/macro onto the icon preview as an alternative.
  • Right-click the icon preview to reset to auto-detect.

Options Panel Overhaul

  • Unified "Shelves & Docks" panel: Tree view shows docks as headers with shelves grouped underneath. Click a dock to configure its name, orientation, and appearance.
  • Simplified add buttons: Two buttons ("+ Add Dock", "+ Add Shelf") with a type picker dropdown replacing 6 separate buttons.
  • Override Appearance: Per-shelf checkbox to customize Open Direction, Handle Style, and handle sizing. Unchecked = inherits from global Appearance tab. Existing per-shelf customizations auto-detected and preserved.
  • Shelf Defaults in Appearance tab: Global defaults for Open Direction and Handle Style.
  • Template label system: Status and Bags shelves support $keyword placeholders in handle labels ($level, $xp, $used, $total, etc.).
  • Defaults button: Resets shelf/dock settings with confirmation dialog.
  • Proper arrow buttons: Blizzard scroll arrow templates for move up/down with tooltips.
  • Detail panel layout: Title, controls row (Enabled/Move/Delete/Defaults), Pinning, then Layout & Sizing.

Profiles & Migration

  • Account-wide AceDB profiles via BarshelfGlobalDB with cross-character sharing.
  • Automatic per-character → account-wide migration on first login per character.
  • Each character's data migrates under its own profile name (no shared "Default").
  • Old data preserved as fallback (marked _migrated, not wiped).
  • Legacy dockMouseoverHide boolean auto-converted to dockIdleAlpha at runtime.
  • Migration test suite with 21 assertions across 7 scenarios, runs in CI.

Localization

  • Full translations: German, French, Spanish, Brazilian Portuguese.
  • Partial translations: Italian, Russian, Korean, Simplified/Traditional Chinese.
  • Localized .toc Notes for all supported locales.
  • All UI strings use the L[] localization system with metatable fallback.

Bug Fixes

  • Custom shelf buttons not casting: Removed ActionButtonTemplate interference with secure action attributes.
  • Custom shelf icon/slot misalignment: Icons fill the full button area.
  • Drag-and-drop onto custom shelves: Click-based drop handling as fallback.
  • Bar shelf tiny icons: Safety floor for button size reads (< 10px → 36px fallback).
  • Shift+click no longer casts: Secure handler bypassed via shift-type1/shift-type2 attributes.
  • Edit Mode ADDON_ACTION_BLOCKED: Deferred handlers with C_Timer.After(0).
  • Dock invisible during drag: FadeTo(1) properly stops running fade animation.
  • Grid blinking on mouseover: Bar shelf watchdog throttled to 1 check/second.
  • Combat safety: Popup anchor/stacking, SetFrameLevel, and bags Hide all guarded with InCombatLockdown().
  • Popup z-ordering: Most recently shown popup renders on top (20-level gap clears child frames).
  • Icon size mismatch: Slider default matches native TWW button size (45px for bars).

Infrastructure

  • Custom addon logo (assets/logo.tga) for addon list and minimap icon.
  • TextureNames.lua: 32K+ icon FileDataID → name mappings from Townlong Yak.
  • scripts/update-texture-names.sh: Downloads and regenerates texture names.
  • Monthly CI job auto-updates TextureNames.lua and opens a PR if data changed.
  • Migration test suite in CI (tests/test_migration.lua).

v1.1.0

New Features

  • Dock idle fade: docks can fade to a configurable opacity when idle (no popup open, mouse not hovering). Slider from 0% (fully hidden) to 100% (disabled). Configurable fade animation duration.
  • Popup stacking: when "Close other popups" is off, multiple open popups now stack sequentially instead of overlapping. Direction follows the first popup's anchor.
  • Shift+click pickup: shift+click or shift+drag a custom shelf button to pick up the spell/item/macro (like Blizzard action bars). Shift+right-click still clears.

Bug Fixes

  • Custom shelf buttons not casting spells: removed ActionButtonTemplate which was overriding secure action attributes via its PreClick handler. Buttons now use only SecureActionButtonTemplate with manual visual elements.
  • Custom shelf icon/slot misalignment: icons now fill the full button area instead of using ActionButtonTemplate's inset positioning.
  • Drag-and-drop onto custom shelves: added click-based drop handling as fallback, since SecureActionButtonTemplate consumes the event before OnReceiveDrag fires.
  • Bar shelf tiny icons: added safety floor for button size reads — buttons reporting < 10px during early TWW load now fall back to 36px instead of producing broken micro-scale popups.
  • Shift+click no longer casts: secure handler is bypassed on shift+click via shift-type1/shift-type2 attributes, preventing unintended spell casts when picking up or clearing slots.

v1.0.0

Initial release.

  • Bar shelves: reparent Blizzard action bars 1-8 into popup grids
  • Custom shelves: drag-and-drop spells, items, macros (OPie-like)
  • Multiple docks with horizontal/vertical orientation
  • Auto-detect Blizzard Edit Mode settings (icons, rows, size, padding)
  • Popup auto-anchor with screen-edge flip
  • Dock/shelf/popup appearance settings (opacity, border, padding, sizing)
  • Handle display modes (icon, label, or both)
  • Shelf reordering via config panel
  • ESC-to-close, click-outside-to-close
  • Edit Mode integration: shows original bars during Edit Mode
  • Ace3 integration: AceDB profiles, Blizzard Settings panel with subcategories
  • Minimap icon via LibDBIcon
  • Combat-safe secure handlers and queue system