Repository navigation
Offhand v2.1.2 Beta 20
Offhand v2.1.2 Beta 20
This is a public testing build. Back up your existing Offhand SavedVariables before installing and report regressions with the requested diagnostics.
Changes in this build
Changed
- Added an initial compatibility target for the original WoW 3.3.5a client
(Interface 30300). A legacy-only runtime adapter supplies the timer and
physical-window primitives used by Offhand, while Backdrop and visibility
code now falls back to APIs available in Wrath. This target remains
experimental until exercised on a real 3.3.5a client. - Companion 2.1.2 Beta 20 is the current public testing build. Addon manifests now
identify the actual addon release separately from Companion protocol1and
minimum Companion version2.1.2-beta.19, so later addon-only releases can
reuse the exact approved Companion bytes without rebuilding them. - The Companion now respects the configured automatic-span delay on Forever as
well as other clients. Choose0explicitly when immediate pre-login
spanning is desired. - The Companion no longer registers system-wide hotkeys and adds a managed
Identify Displays overlay for mapping Offhand display numbers and roles. - The user-initiated update check now reads the official Offhand repository's
published release list. Beta installations include published prereleases,
stable installations ignore them, and Companion-specific release metadata
prevents addon-only version bumps from producing false update prompts. - The settings header now shows the Companion release paired with the installed
addon. Its version tooltip lists the exact addon build and paired Companion
build separately, and explains that WoW cannot inspect the executable that is
actually running. - Forever users whose client opens Professions reliably can explicitly enable
experimental movement from a new collapsed Advanced compatibility card. The
override is off by default, requires a crash warning confirmation, resets on
client build changes, and supports only delayed dragging and position restore;
automatic opening, Escape protection and reload persistence remain disabled. - Addon metadata now separates the addon's independently advancing public
release from the Companion protocol and minimum supported Companion build. - Companion display-plan and activity-log messages now wrap instead of drawing
long missing-monitor diagnostics outside their cards. - Companion replaces the former Hotkey selector with the display-identification
control, avoiding the prior overlap and removing the global-hotkey behavior. - Companion documents an experimental same-prefix, same-runner Wine path,
including a Lutris pre-launch example and Linux extraction checks, while
keeping native X11 and compositor-specific Wayland support as separate work. - Release ZIPs now use portable forward-slash entry paths so Linux extractors
preserve the addon directory tree without a custom deflattening script. - The executable in the complete release bundle is now consistently named
Offhand.exe, matching the standalone file and Companion archive. - Addon-only release automation now restores the published Beta 19 Companion,
verifies its exact SHA-256, and reuses those frozen bytes in the complete
bundle and the stablereleases/latest/downloadasset names. Rebuilding the
Companion still requires an explicit Companion-change release lane. - Companion no longer creates a Windows Run-key startup entry or inspects
process security tokens. Removing these nonessential beta.11 additions
reduces overlap with generic antivirus heuristics while retaining the
Companion's required window-management behavior. - Companion update actions now follow the installation channel. Microsoft Store
packages open the official Store product page without querying GitHub, while
portable builds retain the explicit, user-initiated GitHub release check.
Fixed
- Unit context menus near a Mainhand edge now remain inside the physical game
view instead of treating the complete spanned desktop as usable space and
extending downward or sideways off-screen. Modern menu proxies and legacy
dropdown lists are handled without recurring discovery scans. - World-owned nameplates, overhead NPC text and floating combat text now share
UIParent's absolute spanned-layout scale. This removes the enlarged text seen
on Retail and Forever while restoring the original WorldFrame scale whenever
Offhand is disabled or the window is no longer spanned. - Closing a custom Blizzard chat window now retires its Offhand placement so it
remains closed after reload. Re-docked tabs also adopt the primary chat
window's font size as well as its dimensions. - Addon-bag discovery no longer scans WoW's complete global namespace every
second. EllesmereUI roots are resolved directly, saved Baganator roots are
resolved by name, and new Baganator frame groups are learned from its
lifecycle callbacks. Workspace close-button refreshes now consume that small
shared registry instead of performing their own recurring global scan. - Forever's Edit Mode control recovery now remains available after Companion
restores WoW to one display with a stale spanned topology. The read-only
detector covers both the manager and its separate settings dialog; only the
explicit recovery-popup click centers shown, unprotected control surfaces. - Detached native chat backgrounds now receive a bounded final presentation
replay after Forever's delayed Settings fade, preserving the player's saved
color and opacity instead of losing them when the chat Settings UI opens.
Settings initialization is observed even when Blizzard marks its color/alpha
replaydoNotSave; an addon-owned Settings-state observer also covers native
fades that bypass both setters. Reload-time dock/save callbacks no longer
delete detached positions; only an observed user re-dock relinquishes them. A one-time Forever
migration reopens and recaptures a detached Combat Log hidden by the affected
beta while retaining Blizzard's native position. - Forever's native Blizzard bags can again be placed and restored on the
Offhand workspace through an isolatedUIParent-owned title grip. Offhand
installs no scripts or hooks on the bag, its title/close controls, item
buttons, bag functions, or Blizzard's anchor manager; only a user-initiated
root move and an out-of-combat root-anchor restore cross into the native
frame. Existing native-bag snapshots are retained, reload restoration uses
Blizzard's own opener, and custom bag addons remain independently supported.
Returning the bag to Mainhand clears both the active-root and shared-family
workspace snapshots so the observer cannot pull it back across the seam.
The observer now preserves a tracked workspace bag when Escape closes it and
also completes Forever's consumed Game Menu toggle. After the native call
stack ends, Offhand applies the already-requested menu visibility change
directly, then reopens the bag through Blizzard's native API. It never calls
ToggleGameMenufrom deferred addon code, avoiding Forever's protected
SpellStopCastingpath. Secure post-hooks on the
global close/toggle transaction distinguish Escape and system cleanup from
B/X without attaching to the native bag tree or replacing Blizzard functions.
The isolated bag controller also observes Settings, AddOns and Edit Mode
visibility so their delayed native cleanup cannot discard the tracked bag;
explicit B/X closes remain authoritative while those panels are open.
If Forever hides the bag root but leaves its logical-open state set, Offhand
normalizes that mismatch through Blizzard's toggle/open APIs before restoring
it, rather than clearing persistence or directly showing an uninitialized
ContainerFrameshell.
Forever can reject all native bag APIs while Options, AddOns or Edit Mode owns
the modal UI. In that narrow state, Offhand may re-show only the same bag root
it observed fully initialized and visible immediately before the transition;
the fallback cannot construct or expose an unseen login/reload shell.
A bounded transition window bridges lazy Settings discovery and the additional
cleanup performed when AddOn List closes. Secure post-hooks on Blizzard's
Settings-opening APIs identify Options' ownToggleAllBagscleanup before
its frame is observable. Forever builds that bypass those APIs are covered by
the simultaneous open-to-hidden Game Menu transition; an ordinary B/X close
outside panel navigation still cancels the window.
Settings' older immediate recovery path also retains the tracked-open intent
when the modal panel rejects native bag APIs, allowing the isolated controller
to complete recovery instead of discarding persistence.
Anchors settle every rendered frame so the
default bottom-right opening position is corrected before paint.
This replaces the overly broad OH-FOR-006 containment that removed native
bag workspace support while preserving the protected item-click boundary. - Group-loot rolls now use the restricted secure Mainhand positioner and no
longer receive Offhand event scripts, keeping the roll UI out of the monitor
seam without adding an insecure hook to Blizzard's loot path. - Detached Blizzard chat windows placed on Mainhand now retain their individual
positions through Forever login and UI reloads instead of stacking at the
full-span center. Offhand restores both Mainhand and workspace chat snapshots
after Forever's late native chat layout while preserving deliberate moves,
even when Forever leaves stale dock flags on a detached frame. Offhand leaves
the tracked window shown before committing its observed detached state, then
clears the stale runtime dock flag and reapplies Blizzard's saved floating
color, opacity, and fade-in. This includes custom windows left without legacy
dock flags by an earlier beta. Later color-picker changes receive the same
next-frame appearance refresh so their newly saved values remain visible.
Re-docking a detached tab clears its Offhand snapshot and adopts the primary
dock's dimensions instead of retaining its detached size. - When Chattynator is loaded, Offhand now leaves its borrowed native chat frames
entirely under Chattynator ownership. StaleChatFrameNsnapshots are cleared
without hooking, clamping, resizing, or reanchoring the embedded Combat Log;
Offhand also leaves Chattynator's custom windows and shared text input alone. - Companion now repairs a generated display-topology snapshot when an addon
update replaces it with the packaged placeholder while WoW is still exactly
spanned. The window is not moved; the repaired handoff becomes active after
one/reload. - Companion compatibility now treats the manifest value as a minimum version.
A newer beta or stable Companion no longer produces a false update warning. - Automatic onboarding, recovery UI, and inherited workspace/bag restoration are
deferred while Blizzard owns player input during cinematics, movies, and
first-character intro scenes. Replacement-bag snapshots now retain only
top-level roots instead of child widgets. Forever's native cinematic skip
confirmation, which can be placed outside the visible Mainhand rectangle by a
mixed-height span, is recentered only after Blizzard shows it; Offhand does not
intercept Escape or invoke the confirmation action. - Forever now tracks its recovery Edit Mode layout per character instead of
assuming every character uses a custom layout namedOffhand. Existing users
keep all Blizzard layouts unchanged: a healthy exact-span session adopts the
active custom layout, ambiguous cases can designate it from the Recovery card,
and legacy profile-scoped recovery state is validated before migration. - Retail and Anniversary now remember each character's selected Blizzard Edit
Mode layout instead of forcing every character onto a layout namedOffhand
after login. Existing characters adopt their currently active layout on the
first upgraded session, and later manual selections replace that preference. - Battleground objective widgets, the live PvP scoreboard and post-match
results now use secure Mainhand anchors instead of appearing at the center of
the complete monitor span. Offhand adopts only Blizzard's stock positions and
leaves existing user/addon placements untouched. - Companion guidance now distinguishes a missing or stale display-layout
handoff from a genuine version mismatch. Matching installations no longer
receive an alarming download prompt, layout guidance appears at most once
per UI session after display geometry settles, and only confirmed version
mismatches show the paired Companion download address. - Forever now preserves supported addon-owned workspace bags through Escape and
restores them after reload without treating Escape's nativeCloseAllBags
call as an intentional close. The compatibility path now recognizes both
Baganator backpack roots and EllesmereUI'sEUI_MainBagFrame; their own bag
APIs remain responsible for opening and closing the windows. - Addon-owned bag snapshots now store the top edge used by Offhand's common
panel restorer. Beta 18 bottom-edge snapshots are upgraded when the bag root
appears, preventing map toggles, Escape recovery and reload restoration from
shifting the bag downward by its own height. - EllesmereUI's explicit bag-close state now cancels Offhand's open-window
snapshot, so pressing Escape after closing its bag no longer reopens it. The
saved workspace position remains eligible for normal reload restoration. - Escape and Edit Mode transitions remain owned by Blizzard and EllesmereUI;
Offhand no longer reopens hidden addon bags or ordinary panels from their
hide/menu callbacks, preventing Game Menu state from becoming inaccessible. - Moving an EllesmereUI or Baganator bag to Mainhand now retires its stale
Offhand workspace anchor before map layout repair, so opening or closing the
World Map cannot move the bag back to the secondary workspace. - Forever now observes both the M-key World Map and L-key Quest Log entry points
for their sharedWorldMapFrame, keeping one saved workspace location. - Reload recovery for ordinary Blizzard workspace panels is now
serialized through the native UIPanel lifecycle. Multiple left-slot panels no
longer close one another before Offhand can detach and restore them. Protected
Edit Mode frames and automatic Professions opening remain deliberately excluded. - Companion configuration now uses measured auto-layout columns instead of
scaling fixed child coordinates. Native spinners, display checklists, and
combo boxes remain separated and usable at 125%, 150%, and 200% Windows
scaling with two or more monitors; additional display rows still scroll. - Forever's opt-in experimental Professions movement now uses an original,
title-only Offhand adapter around Blizzard'sPanelDragBarTemplate. Blizzard
retains the native drag scripts, the grip is securely hidden in combat, and
Offhand only observes gesture completion for its existing position storage.
The adapter fails closed if combat-safe visibility cannot be established. - Ordinary registered Forever Blizzard panels now use that same validated,
Offhand-owned title-grip adapter instead of enabling mouse input or installing
drag handlers on the panel body or native title. Protected Edit Mode/HUD
systems, transient popups, World Map, bags and chat remain on their dedicated
paths; unavailable secure grip support fails closed. - The optional Offhand window-chrome controls now include a separate World Map
enlarge-button toggle, matching NoCloseX without coupling it to the general X
button option. The native return-to-windowed control is deliberately retained. - Forever native backpacks remain draggable from the visual title region after
a clean load. The input surface is an independentUIParentsibling rather
than Blizzard's native title, and mouse input remains disabled on the bag
root, avoiding recurrence of the grey item-grid overlay. - Forever's opt-in experimental Professions movement now centers the fully
opened window on Mainhand when it has no saved Offhand position. This makes
its drag surface reachable when Blizzard's default upper-left anchor lands in
the non-physical area of a mixed-height span, without enabling automatic open,
Escape ownership or reload persistence. - Forever native backpacks no longer enter Offhand's generic whole-panel drag
lifecycle when a generated bag temporarily reports itself as unprotected.
Their external title grip leaves the item grid and native title untouched,
preventing the item-grid hover shade from remaining over the backpack. - Forever no longer reopens a saved workspace backpack when Escape is pressed
after Restore Window or while Offhand is otherwise unspanned. Native backpack
recovery also never callsShow()on aContainerFrame; if Blizzard's bag
API declines to rebuild the frame, Offhand clears the stale open request
instead of exposing an uninitialized grey shell whose next hide can error. - On Forever mixed-height spans, an unsaved World Map opened from the M key is
now rescued from non-physical canvas space by the existing external toggle
hook. The recovery does not attach scripts to the protected MapCanvas tree
and leaves maximized maps under Blizzard ownership. - Forever now warns once when Blizzard Party or Raid Frames are visible outside
both physical monitor rectangles. The in-game guidance explains the safe Edit
Mode recovery through Companion's Restore Window flow and why inaccessible
protected HUD frames cannot be dragged or gathered while the span is active. - Forever's load-on-demand Professions interface is now Blizzard-owned by
default. Offhand no longer changes its panel registration, position or open
state unless the user explicitly enables the isolated experimental movement
override. This removes the default behavior from the repeatedly confirmed
client-crash path. /offhand diagnow reports the client's windowed resolution, render scale,
resampling quality, and window mode as read-only diagnostics for investigating
visual degradation after an external span.- Companion now uses an explicit 96-DPI design baseline with linear DPI
autoscaling, preventing fixed dashboard panels from clipping enlarged text
on high-resolution and mixed-scale displays. - The System Status display-plan diagnostic now has room for three wrapped
lines, and the auto-span checkbox no longer covers the Span displays heading. - In-engine cinematics no longer leave the 3D camera centred on the monitor
seam. Offhand now reapplies only the configured Mainhand viewport after
cinematic start and completion, including delayed and combat-safe recovery. - Companion idle monitoring now queries only the allowlisted WoW executable
names, backs off while WoW is absent, and pauses polling while its window is
being moved or its Help dialog is open. This avoids broad process-table
discovery while preserving the low idle CPU and safe stopped-client guard. - Manual Restore Window now returns keyboard focus to WoW after the bordered
Mainhand window is established, avoiding a restored client that appears
unresponsive while the Companion remains foreground. - Window-border failures now include the native Windows error code and explain
the common mismatched-privilege case instead of showing only a generic error. - Companion addon verification now reports the exact path expected by the
running WoW client and identifies nested, version-suffixed, or sibling-client
installs instead of repeating a generic installation instruction. It also
rejects mismatched Companion/addon beta builds before spanning, displays the
complete diagnostic on the status card, and records it in the activity log. - Span now stops before resizing WoW when Companion cannot write the selected
display topology into the running client's Offhand folder, preventing a
desktop-sized game window with no matching addon viewport geometry. - Forever workspace maps remain fully opaque while the player moves without
altering Blizzard's protected map scripts or UIPanel metadata. - Persisted load-on-demand panels such as Professions are reopened after their
Blizzard addon registers the frame, instead of being skipped because the
frame did not exist during Offhand's initial reload restoration pass. - Load-on-demand panels now wait for Blizzard's native registration/opening
sequence to settle before reload restoration. This removes a possible
re-entry into the Forever Beta Professions loader while preserving workspace
position, open state and the user's panel-persistence settings. - The seam guide is now vertical for side-by-side layouts and horizontal for
stacked layouts in both Companion-controlled and manual topology modes. - Unsaved Blizzard panels now open on Mainhand instead of inheriting a
UIParent anchor in the Offhand workspace. Explicit Mainhand drops persist
across close/reopen and reload, while only explicit Offhand drops receive
Offhand ESC and open-panel persistence behavior. Stale coordinates are
clamped back onto the visible game monitor. - Anniversary now preserves an already-selected Blizzard Edit Mode layout by
comparing its active name, and loadsOffhandthrough the correct layout
index API instead of confusing the global active ID with a manager row ID. - Auto-Setup Wizard step 2 now places the Mainhand aspect-ratio title above
its buttons instead of drawing the label across the first button row. - Calibration Wizard steps 2 and 3 now explain when Companion-owned monitor
geometry disables their manual controls, and step 3 no longer overlaps the
Offhand Monitor width label with its alignment instructions. - The installation guide now resumes at step 4 after its requested
/reload,
and its visible copy uses plain punctuation instead of em dashes. - Classic Era and Anniversary clients now accept Companion topology when their
resolution API reports only Mainhand but the live UI canvas matches the full
span; restored single-monitor windows still reject stale topology. - Frames dragged into any horizontal or stacked workspace now retain their
final hardware-drag coordinates before Blizzard can restore a native anchor.
Forever also keeps the frame's user-placed state, preventing valid workspace
drops from snapping back to the game-view center. - Load-on-demand Blizzard panels are now discovered dynamically, including
Forever panels flagged protected, gain an out-of-combat title-bar drag
handle, and are fitted wholly inside the nearest visible monitor when their
default anchor straddles a mixed-height display void. - Forever now anchors Blizzard Options directly to Mainhand instead of relying
on timing-sensitive void rescue, and keeps a tracked workspace backpack open
while entering Options from the Game Menu. - Offhand now leaves
ChatFrame1EditBoxanchored by Chattynator, so pressing
Enter reveals Chattynator's text input while its window is on the workspace. - Explicit Offhand chat placements now survive Blizzard's late cold-start
anchor pass on Retail and Forever while still yielding during Retail Edit
Mode, preventing the default chat window from returning to Mainhand. - Companion-controlled layouts now show a concise game/workspace summary in
settings, explain why manual geometry is locked, and no longer overlap that
status with the redundant Companion download button. - Companion retries inaccessible WoW executable paths through
QueryFullProcessImageName, recognizes every supported Offhand TOC, and
diagnoses an accidentalOffhand/Offhandaddon installation directly. - Companion now keys saved selections to physical monitor identities instead of
renumberable WindowsDISPLAY#labels. Existing installations require one
confirmation before automatic spanning resumes, preventing a stale label from
silently swapping Mainhand and workspace. - Restored settings panels now resynchronize the master enable checkbox and all
displayed values from the active profile whenever shown. - Exact portrait-plus-landscape topology is no longer mislabeled or saved as
dual landscape. The settings panel and wizard now explain that Companion owns
exact monitor geometry while those manual controls are disabled. - Forever no longer replaces Blizzard's global window/bag close functions or
mutates secure panel-manager metadata. This closes the remaining taint paths
behind reportedCompactUnitFrameandTextStatusBarsecret-number errors. - Blizzard Cooldown Viewer and other Forever Edit Mode-managed frames are now
excluded from generic dragging, saved-position recovery and void rescue,
preventing aura-table taint after display-orientation changes. - Forever leaves the Game Menu and protected Edit Mode systems under Blizzard
ownership. If the unprotected Edit Mode control window opens in mixed-height
display void, a player-click prompt can move only that window to Mainhand. - Forever workspace maps again remain open through Escape and reopen after
reload without replacing protectedOnShow/OnHidescripts. Map dragging is
now provided by an independent Offhand-owned surface: no handler or addon
bookkeeping is attached to the native map, title container, title button, or
close button. This protects both quest-pin acquisition and the yellowMap Pin Sharingwaypoint's Shift-click chat-link action while preserving map
movement and persistence. - Forever now honors the configured manual split and allows the calibration
wizard to complete when Companion topology is absent. A present but
mismatched Companion topology still fails safe to a normal full-window
viewport, preserves workspace panel state, and offers the player-click
Modern/Offhand Edit Mode handoff so protected HUD elements cannot remain in
black void. - Forever Edit Mode recovery now matches the
Offhandlayout name without case
sensitivity and re-resolves that name before restoration when its local custom
layout slot differs from the previously remembered ID. - Chat-tab persistence now observes Blizzard's native drag lifecycle without
forcing locked or docked chat frames into a movable state, avoiding the
ChatFrame1:StartMoving(): Frame is not movableerror on Forever. - Retail now leaves the primary chat frame under Blizzard Edit Mode ownership
while it is on Mainhand, preventing saved layouts from snapping the frame
upward or restoring stale Offhand coordinates after Edit Mode closes. An
intentional workspace placement is captured after Edit Mode exits, and the
native channel/menu button strip is reattached through Blizzard's layout API. - Combined and individual backpack modes now share one tracked workspace
position, discard stale coordinates from the inactive presentation, and
prepare the new native bag root before Blizzard opens it. This prevents bags
from disappearing after switching modes and avoids Retail's combined-bag
toggle assertion. - Retail panel transitions no longer reopen the world map as an unintended
side effect of opening another Blizzard panel. - Blizzard Edit Mode frames, including the native Damage Meter, are now
excluded from generic centering and dragging on every supported client. This
preserves Blizzard's secure initialization while retaining the explicit
player-click recovery prompt for an Edit Mode control window in display void.
Downloads
- Complete package:
Offhand-Complete-v2.1.2-beta.20.zip— addon and Companion together. - Addon only:
Offhand-v2.1.2-beta.20.zip— install the containedOffhandfolder inInterface/AddOns. - Companion package:
Offhand-Companion.zip— minimal portable package containing the reviewed executable, quick-start/security README, and license. - Standalone Companion:
Offhand.exe— updated Windows executable only. - Source: review the tagged repository or GitHub's automatic source archive; development files are intentionally excluded from the end-user Companion ZIP.
Test focus
- Upgrade without deleting
WTFor Offhand SavedVariables. - Test a cold login,
/reload, relog, and a complete client restart. - Verify the map, character sheet, bags, chat, Blizzard Edit Mode, and the Escape/Game Menu sequence.
- Report the WoW client and build, display arrangement, selected Mainhand/workspace, enabled UI addons, exact Lua error, and before/after screenshots.
Linux and Wine status
The Companion is still a Windows WinForms application. Wine support is experimental: run WoW and the Companion as the same user in the same WINEPREFIX and with the same Wine/Proton runner version. See Companion/Linux.md in the complete package for a Lutris example and extraction checks. Native Linux, X11, and general Wayland support are not claimed by this release.
Reporting issues
Use the GitHub issue tracker and include reproduction steps plus the diagnostics listed above.
Verification
The Companion is unsigned. Download it only from the official release linked above. GitHub Actions publishes build-provenance attestations and SHA-256 checksums for newly packaged release artifacts.