promotional bannermobile promotional banner

Move My Bags

Drag your bag windows anywhere, separate or combined. Pull one out and the column closes up behind it; put it back and it re-opens. Positions are remembered per bag, not per slot. No menu, no settings.
Back to Files

v1.1.2

File nameMoveMyBags-v1.1.2.zip
Uploader
ZandramisZandramis
Uploaded
Sep 15, 2026
Downloads
7
Size
18.4 KB
Flavors
Retail
File ID
8883863
Type
R
Release
Supported game versions
  • 12.1.0

What's new

# Changelog

All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.2] - 2026-09-15

### Fixed

- A bag window held mid-drag is now left alone by a layout pass that fires
  while you are holding it — clicking a vendor or the bank with a bag in hand
  opens the bags again. The window used to be snapshotted wherever the cursor
  happened to be, which recorded the cursor as Blizzard's own slot (so
  shift-right-click and `/mmb reset` put the bag back to a spot Blizzard never
  chose) and re-anchored the window out from under the pointer.
- A flush that gives up waiting for a bag to acquire a rect no longer leaves
  the next one believing it follows a Blizzard layout pass. The next drag would
  otherwise have its own drop point recorded as Blizzard's slot, quietly
  breaking reset for that bag.
- Compacting no longer stands down for the rest of the session on a single
  layout it cannot model. The reading is validated on every layout pass, so it
  is now un-stood-down on any pass that reproduces Blizzard's output again. The
  explanation is still printed only once per session.
- A UI scale or resolution change now drops the measured column geometry
  instead of re-stacking from it. The spacing and free height are measured in
  UIParent units at a particular scale, so re-flowing from them after a change
  misplaced the column; it re-opens to Blizzard's own slots until the next
  layout pass re-measures.
- The store description and other repository-only material under `docs/` is no
  longer copied into the packaged addon. `.pkgmeta`'s ignore list is opt-out and
  the directory was not on it, so the CurseForge copy would have shipped inside
  the addon folder.

## [1.1.1] - 2026-09-15

### Added

- Dropping a window near another window's edge, or the screen's, now lands it
  exactly flush instead of overlapping by however much the drop was off. Bag
  windows are opaque, so even a small overlap made the one underneath
  unreadable. Each axis snaps independently, only windows you are actually
  beside are considered, and nothing already parked is moved.

## [1.1.0] - 2026-09-14

### Added

- `/movemybags lock` (and `unlock`) stops bag windows being dragged. Saved
  positions still apply and both resets still work; only the drag is off.

### Fixed

- After the column had closed up around a moved bag, an accidental nudge on
  one of the re-stacked bags was stored as a real move, and that bag then
  stayed stuck in the compacted spot when the column re-opened. A bag that was
  never moved and lands where it started is now left alone, wherever that was.
- Bag windows are no longer clamped to the screen until the player actually
  drags one. `ContainerFrameTemplate` has no `clampedToScreen`, and clamping
  changes how Blizzard's own chain lays out near the edge, so applying it on
  attach touched a layout the addon promises to leave alone.
- If `UpdateContainerFrameAnchors` is not yet defined when the addon file runs,
  the hook is retried at `PLAYER_LOGIN` instead of leaving compacting off for
  the whole session.
- The weekly API-contract workflow adds its report to the open issue rather
  than opening a new one every week the check fails.

### Changed

- The README is now the player-facing page; the engineering notes moved to
  `DESIGN.md`.

## [1.0.3] - 2026-09-13

### Fixed

- A bag that is shown but never acquires a rect — another addon clearing its
  points, a reparent gone wrong — no longer leaves an `OnUpdate` running every
  frame for the rest of the session. The retry now gives up after a second and
  waits for the next bag open, drag or reset.

## [1.0.2] - 2026-09-13

First published release. 1.0.0 and 1.0.1 were both tagged but never published:
the release workflow passed the upload tokens under environment variable names
that the pinned version of the packager does not read, so it built the addon
and uploaded nothing while reporting success. The addon code is identical
across all three; only the release pipeline changed.

Verified against Blizzard's 12.1.0 (build 69587) UI source, and covered by a
headless test suite, but **not yet exercised in a live client** — in particular
the two checks that only the game can answer: that item clicks in combat are
never blocked, and that nothing from this addon appears in `Logs/taint.log`.
See `TESTING.md` if you want to run those before trusting it in a raid.

### Added

- Draggable bag windows, separate and combined, with positions persisted
  account-wide and keyed by bag ID (the combined window gets its own key, so the
  two modes never overwrite each other).
- Shift-right-click a window to return it to Blizzard's default slot, and
  `/movemybags` (`/mmb`) with a `reset` argument that clears all positions.
  Resets replay the position recorded from Blizzard's own last layout pass, so
  no Blizzard layout code ever runs on the addon's tainted path.
- Positions stored in UIParent units and converted on both read and write, so
  they survive `UpdateContainerFrameAnchors` rescaling the bags, plus clamping
  on restore for resolution and UI-scale changes.
- Enumeration via `ContainerFrameContainer.ContainerFrames`, with a
  `_G["ContainerFrame"..i]` fallback and per-window `OnShow` hooks, so the addon
  survives reparenting and `UpdateContainerFrameAnchors` ceasing to be a global.
- Stand-down detection: a bag window that gains an Edit Mode registration, a
  native `OnDragStart`, or the `ScriptBindings` forbidden aspect is left to
  Blizzard. It is still re-anchored so it cannot trail a bag you did move, but
  it never receives a saved position, including a stale one.
- A drag that lands within two pixels of Blizzard's own slot is treated as an
  accidental nudge and clears the saved position instead of storing it.
- Positions record the window's unscaled height, so a bag parked in the upper
  half of the screen keeps its top edge when the bag is upgraded (or when the
  same bag ID is a larger bag on another character) instead of growing off the
  top and being clamped back down. Bags parked low keep their bottom edge and
  grow upward, as Blizzard's own do.
- The column closes up when a bag is dragged out of it, and re-opens when the
  bag is put back — both on the drop, with no reopen or reload and nothing to
  turn on. The column origins and spacing are measured from Blizzard's own
  output rather than reimplementing its layout (two of the constants involved
  are locals and unreachable from an addon), and the measurement is kept so a
  drop can re-flow immediately. It validates itself against Blizzard's output on
  every layout pass and stands down rather than misplacing bags if the two
  disagree, or while a stood-down window is open.
- Luacheck linting, a scheduled TOC interface-version bump, a tag-driven release
  workflow built on the BigWigs packager, and a headless test suite covering the
  layout algorithm against a stand-in for the client.
- `tools/check-api-contract.sh` plus a weekly workflow, asserting against
  Blizzard's live UI source that the facts the addon is built on still hold and
  opening an issue when one stops. Each check names the design decision it
  invalidates.

### Notes

Verified against Blizzard's 12.1.0 (build 69587) UI source. Two assumptions from
the original project brief did not survive that check and were corrected:
`ContainerFrameCombinedBags` is *not* natively draggable (it is `movable="true"`
but has no drag handler), and `SetPoint` offsets are interpreted in the anchored
frame's own units, which the brief's reference `Place` did not account for.

This mod has no additional files