diff --git a/README.md b/README.md index f11e589..335e228 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ You need a Steam Frame with an internet connection, a keyboard (Bluetooth, or th 3. Run: ``` - curl -fsSL https://raw.githubusercontent.com/DeeJanuz/frametop/main/get.sh | bash + curl -fsSL https://deejanuz.github.io/frametop/get.sh | bash ``` It asks which version you want: stable (the `main` branch, tested releases) or experimental (the `experimental` branch, the newest features, less tested). Then it clones the repo into `~/frametop` and runs `install.sh`. To choose without the question, add `-s -- --stable` or `-s -- --experimental` after `bash`. By hand, the same is `git clone https://github.com/DeeJanuz/frametop.git ~/frametop`, then `cd ~/frametop` and `./install.sh` (add `--branch experimental` to the clone for experimental). @@ -145,7 +145,7 @@ This writes `frametop-report-.txt` with version numbers, service states, s Run the same command again. It updates `~/frametop` to the latest of the version you have (or switches, if you pick the other one) and installs it: ``` -curl -fsSL https://raw.githubusercontent.com/DeeJanuz/frametop/main/get.sh | bash +curl -fsSL https://deejanuz.github.io/frametop/get.sh | bash ``` Or by hand: `cd ~/frametop && git pull && ./install.sh`. @@ -168,6 +168,8 @@ gaze/tracker/install.sh uninstall # if you installed our own eye tracker's gaze/probe/install.sh uninstall # if you installed the gaze probe ``` +Your settings stay: `~/.config/frametop.conf`, `frametop-input.json` (button maps and key combinations), `frametop-layout.json` (the layout and profiles), `frametop-float.json`, and `frametop-remote/` in `~/.config`, and the gaze calibration in `~/.local/state/frametop/gaze`. So does the desktop's own Plasma setup, in `~/.config/frametop`. Delete them too for a clean slate. + ## How it works A Plasma session runs nested inside ft-screens (`screens/`), a small Wayland compositor. KWin opens one window per screen, ft-screens sets each window's size, and each frame goes to SteamVR as an overlay without being copied. An input relay (`input/`) keeps Bluetooth mice working in SteamVR and feeds the mouse to the 3D pointer, which drives a virtual SteamVR controller (`pointer/`). A power service (`power/`) turns the displays off while the headset isn't used. [docs/reference.md](docs/reference.md) covers each piece, and [docs/design.md](docs/design.md) explains the design and what we learned about SteamVR on the Frame. [docs/hazards.md](docs/hazards.md) lists known ways the input handling can go wrong. diff --git a/desktops.sh b/desktops.sh index ac0ecb6..d8998f6 100755 --- a/desktops.sh +++ b/desktops.sh @@ -40,7 +40,12 @@ $running && echo 'started' || { echo 'failed:'; tail -20 $log; exit 1; }" ;; sed 's|@SESSION@|$session/frametop-session.sh|' $session/deckard-nested-desktop.desktop > ~/$override [ -f ~/.config/frametop.conf ] || cp $session/frametop.conf.example ~/.config/frametop.conf echo \"installed ~/$override\"; grep ^Exec= ~/$override; echo; cat ~/.config/frametop.conf" ;; - uninstall) "$frame" --host "rm -f ~/$override && echo 'removed; the launcher uses the stock desktop again'" ;; + uninstall) + # Also what the session puts in place at each start: Launch as Standalone's app copies and + # the title bar decoration (float/ft_apps.py, decoration/). + "$frame" --host "rm -f ~/$override +rm -rf ~/.local/share/frametop/apps ~/.local/share/kwin/decorations/kwin4_decoration_qml_frametop +rmdir ~/.local/share/frametop 2>/dev/null; echo 'removed; the launcher uses the stock desktop again'" ;; screens) [[ ${2:-} =~ ^[1-9]$ ]] || { echo "usage: $0 screens N (1-9)" >&2; exit 2; } "$frame" --host "set -e; f=~/.config/frametop.conf diff --git a/display-settings/install.sh b/display-settings/install.sh index 3eb4e83..11c6871 100755 --- a/display-settings/install.sh +++ b/display-settings/install.sh @@ -17,10 +17,12 @@ case ${1:-install} in on_frame "chmod +x display-settings/ft-display-settings layout/ft-layout layout/ft_layout.py mkdir -p ~/.config/frametop kwriteconfig6 --file ~/$shortcuts --group services --group ft-layout-reset.desktop --key _launch 'Meta+Shift+R' -kwriteconfig6 --file ~/$shortcuts --group services --group ft-screens-toggle.desktop --key _launch 'Meta+Shift+H'" +kwriteconfig6 --file ~/$shortcuts --group services --group ft-screens-toggle.desktop --key _launch 'Meta+Shift+H' +layout/ft-layout launchers # each profile's entry (Frametop: NAME), if there are profiles" echo "installed: Frametop Display Settings, Reset Screen Layout (Meta+Shift+R), Hide/Show Screens (Meta+Shift+H)" ;; uninstall) on_frame "rm -f ~/$apps/ft-display-settings.desktop ~/$apps/ft-layout-reset.desktop ~/$apps/ft-screens-toggle.desktop +rm -f ~/$apps/frametop-profile-*.desktop # the profiles' entries (the profiles stay in ~/.config/frametop-layout.json) [ -f ~/$shortcuts ] && for f in ft-layout-reset ft-screens-toggle; do kwriteconfig6 --file ~/$shortcuts --group services --group \$f.desktop --key _launch --delete; done echo removed" ;; *) echo "usage: $0 [install|uninstall]" >&2; exit 2 ;; diff --git a/gaze/ft-gaze.cpp b/gaze/ft-gaze.cpp index 932714d..03cb285 100644 --- a/gaze/ft-gaze.cpp +++ b/gaze/ft-gaze.cpp @@ -461,7 +461,10 @@ int main(int argc, char **argv) { vr::VRActionSetHandle_t set = vr::k_ulInvalidActionSetHandle; input->GetActionHandle("/actions/gaze/in/gaze", &gaze); input->GetActionSetHandle("/actions/gaze", &set); - std::fprintf(stderr, "ft-gaze: action manifest %s: error %d\n", manifest.c_str(), int(me)); + if (me == vr::VRInputError_None) + std::fprintf(stderr, "ft-gaze: action manifest %s: ok\n", manifest.c_str()); + else + std::fprintf(stderr, "ft-gaze: action manifest %s: error %d\n", manifest.c_str(), int(me)); EyeFile eyes; const bool haveMmap = eyes.Open(); diff --git a/get.sh b/get.sh index 33613e0..9152a51 100755 --- a/get.sh +++ b/get.sh @@ -2,7 +2,7 @@ # Frametop's one-line installer. In a terminal on the Steam Frame (Konsole in the desktop, or # over SSH): # -# curl -fsSL https://raw.githubusercontent.com/DeeJanuz/frametop/main/get.sh | bash +# curl -fsSL https://deejanuz.github.io/frametop/get.sh | bash # # It asks which version to install, clones the repo into ~/frametop (or updates the clone # that's there), and runs its install.sh. Run it again to update, or to switch versions. @@ -18,7 +18,7 @@ set -euo pipefail usage() { cat <<'EOF' usage: get.sh [--stable | --experimental] [--dir DIR] [--clone-only] [--yes] [--no-bluetooth] -piped: curl -fsSL https://raw.githubusercontent.com/DeeJanuz/frametop/main/get.sh | bash -s -- [options] +piped: curl -fsSL https://deejanuz.github.io/frametop/get.sh | bash -s -- [options] EOF } diff --git a/layout/ft_layout.py b/layout/ft_layout.py index 9e98c3e..774817e 100755 --- a/layout/ft_layout.py +++ b/layout/ft_layout.py @@ -58,6 +58,7 @@ Usage (on the Frame host; Frametop Display Settings calls it too): ft-layout default NAME|none the profile the desktop starts with ft-layout layouts list the named layouts (* = the one in use) ft-layout rename OLD NEW | delete NAME + ft-layout launchers write each profile's launcher entry again (and drop stale ones) ft-layout plan print the arrangement as JSON (no VR needed) ft-layout scale per-screen scale, positions (as the screens are around you), and primary to KWin @@ -1059,6 +1060,8 @@ def main(argv): delete_named(layout, argv[2]) save_layout(layout) write_launchers(layout) + elif cmd == "launchers": + write_launchers(load_layout()) elif cmd == "default" and len(argv) == 3: layout = load_layout() if argv[2] == "none":