Repository navigation
Releases: NotZoeyDev/FrameMover
Release list
FrameMover v1.2.0: A little bit less janky
Fixes
- Moves are no longer dropped, or left on a stale playspace, when the headset switches tracking universe. On the Frame a universe switch (relocalizing against a saved map, a new tracking world, standby) is announced only by
VREvent_ChaperoneFlushCache, and SteamVR silently throws away the live preview when it happens: zero pose and huge play area both. The mover now reads the universe id several times a second. A relocalization keeps your move and puts it on top of the new saved playspace; losing tracking and starting a new tracking world drops it (raw tracking space is not the same any more). - Height moves no longer snap back to the floor after a fresh boot. The Frame relocalizes into your saved playspace, and while that playspace is still stored against an older tracking map, SteamVR writes its floor height into the live origin many times a second (x, z and turning were unaffected). This is why using the playspace editor once after boot made the tool work: its Accept re-stores the playspace against the current map. The mover now does that itself the first time it sees the height pinned: it backs up
chaperone_info.vrchap, commits your saved playspace unchanged (same walls, same origin in the room) and puts your move back. Moves themselves are still never committed. - Huge chaperone survives a universe switch: the mover checks the play area SteamVR reports, not only the zero pose, and writes it again when it was dropped.
- No more reading its own preview back as the saved playspace. Hiding the preview is asynchronous; the capture that follows a reset now waits until SteamVR serves the saved playspace again (about 10 ms while tracking, a second or more in standby), so the "original" is really the original.
- "Huge chaperone" off and Reset put your walls back again. The saved wall bounds were never captured (SteamVR returns false for the count-only query even though it fills in the count), so turning the option off or resetting left the walls SteamVR had at that moment.
- Pausing no longer lasts for good. After another program edited the working copy the mover resumes after 3 s; after SteamVR's room setup starts it resumes when setup reports back, or after 90 s if it was cancelled.
- Bindings no longer reset to the defaults after restarting SteamVR. SteamVR loads bindings saved from its editor from the Steam Workshop; when the controllers connected before Steam had logged in, that load failed and it silently used the shipped defaults (
vrserver: "Tried to load url that was not a file path while steam is not available ... Silently falling back to the default binding"). The mover now keeps a local copy of your saved bindings in~/.config/frame-mover/user-bindings/and points SteamVR at it, at every start and after every reload of the bindings. --selftestrefuses to run while the headset is in standby. There SteamVR has no saved playspace to restore, and the test move could be stored as the origin of the next playspace SteamVR creates. Stop the running mover first; it owns the dashboard tab.
New
- Small event log in
~/.local/share/frame-mover/frame-mover.log: one line for each tracking universe switch, rebase of a move, playspace replaced by SteamVR, re-anchor, binding pin and error. Capped at 64 KB plus one older copy, so it never takes more than about 128 KB.
Upgrading
Run the new FrameMover-installer-aarch64.AppImage and pick Install, or ./build/frame-mover --install. Restart FrameMover (or SteamVR) to load the new version.
FrameMover v1.1.0: smaller and lighter
A performance release. Behavior and controls are unchanged.
Optimizations
- Binary is about 3x smaller. The
frame-moverexecutable goes from 406 KB to 135 KB, and the installer AppImage from 1.08 MB to 0.99 MB. Builds now default toMinSizeRelwith link-time optimization, unused-section removal and stripped symbols. - Less work per frame while idle. Tracking poses are only read when a grab or snap turn actually needs them, so holding height keys or sitting idle no longer makes tracking IPC calls.
- The dashboard panel redraws only when something changed, instead of on a fixed timer. It refreshes on controller connect, disconnect and role changes, and retries on its own if a redraw is skipped.
- Faster panel upload. The pixel conversion to the overlay texture skips per-channel divisions for opaque pixels, which is nearly all of them.
- Leaner Vulkan setup. The texture upload reuses a single command buffer and fence rather than one per image slot, and extension names are parsed in place without extra allocations.
- Less code under the hood. Shared file helpers, table-driven settings and bindings, and a plain action enum replace many
std::functionclosures, thestd::regexbinding parser and duplicated code. This is where much of the size reduction comes from.
Fixes along the way
- Chaperone backups can no longer overwrite each other when two are made within the same second, and old backups are only pruned after the new one is written successfully.
- Shortened binding names in the panel no longer cut a UTF-8 character in half.
- Non-finite values in
config.inifall back to their defaults.
Upgrading
Run the new FrameMover-installer-aarch64.AppImage and pick Install; it replaces the installed copy. If SteamVR is running when FrameMover is replaced, restart FrameMover (or SteamVR) to load the new version.
Thanks
Thank you to @cinnacappu (cappu) for the optimization pull request (#1) behind this release.
FrameMover v1.0.1
Changes
- FrameMover shows up in the Frame's launcher. The installer now writes
~/.local/share/applications/frame-mover.desktopand a 128x128 RGBA icon in the user'shicoloricon theme (Icon=frame-mover, the way the other Frame apps do it). Uninstall removes both. - Install and uninstall work from Desktop Mode and Flatpak launchers. Those can start programs with
XDG_CONFIG_HOMEredirected (OpenVR then cannot findopenvrpaths.vrpath) or with the nested Plasma session'sXDG_RUNTIME_DIR. The installer reported "SteamVR is not running" and never registered the app. FrameMover now putsHOME,XDG_CONFIG_HOMEandXDG_RUNTIME_DIRback to what SteamVR itself sees, and the message when it cannot reach SteamVR says what went wrong instead of claiming SteamVR is off. - The panel shows the default bindings instead of "not bound" while SteamVR has not resolved any yet (no controller connected this session), as long as you have not saved bindings of your own. Once a controller connects, SteamVR's own labels are shown.
- Renamed to "FrameMover" (no space) in SteamVR, the dashboard tab, the launcher entry and the tile artwork.
Upgrading
Run the new FrameMover-installer-aarch64.AppImage and pick Install; it replaces the installed copy, the launcher entry and the artwork. If SteamVR is running when FrameMover is replaced, restart FrameMover (or SteamVR) to load the new version.
FrameMover v1.0.0
Frame Mover is a playspace mover for the Steam Frame, in the style of OVR Advanced Settings. It runs natively on the headset (Linux ARM64) against the SteamVR installed on it, and it also works when streaming through Steam Link.
Features
- Grab and move the world with a controller button.
- Grab and turn the world around your head.
- Snap turn, and raise / lower yourself.
- Reset to original puts back exactly the playspace and chaperone you had saved. Frame Mover never commits anything to SteamVR's chaperone, so Reset, Quit, a crash or SteamVR shutting down all restore your saved playspace.
- Bindings are SteamVR Input bindings. Rebind them in SteamVR's own binding editor, from the dashboard tab.
- Dashboard tab and quick-launch tile. Settings are grab speed, snap angle, raise speed, lock height, per-hand enable, haptics, and double-press-to-grab. They are stored in
~/.config/frame-mover/config.ini. - Optional chaperone handling while moved: a huge chaperone (on by default) or no chaperone at all (off by default), so the real play-area edge doesn't show up in your moved world.
- Chaperone backups are kept in
~/.local/share/frame-mover/backup/(newest 10).
Default controls
| Action | Binding |
|---|---|
| Grab and move | Bumper (either hand), double-press and hold |
| Grab and turn | Thumbstick click (either hand), double-press and hold |
| Snap turn left / right | Left D-pad left / right |
| Raise / lower | Left D-pad up / down |
| Reset to original | Hold left View button for 1.5 s |
Install
Download FrameMover-installer-aarch64.AppImage, make it executable and run it on the Frame, then pick Install (or Uninstall).
From a terminal:
./FrameMover-installer-aarch64.AppImage install
./FrameMover-installer-aarch64.AppImage uninstall
Install copies Frame Mover to ~/.local, registers it with SteamVR (quick-launch bar) and starts it with SteamVR. Have SteamVR running when you install or uninstall so it can register or unregister the app. Uninstall keeps your settings and chaperone backups. You can also build from source; see the README.
Known issues
- In rare cases SteamVR still replaces the live playspace with the saved one and the move snaps back. Frame Mover detects this and re-applies the move.
- Killing the program with
kill -9or a crash while the dashboard tab is open can crashvrcompositor, and SteamVR then restarts. A normal exit (dashboard Close, SIGTERM) is safe. - Moves are not remembered across restarts.