mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-25 13:00:47 +01:00
A Spotlight-like search pill (docs/spotwatch.md). Meta+Space (the input
relay's new spotwatch action, bindable to mouse and controller buttons
too) opens a faux-glass pill straight ahead of the head. Typing finds
apps and remote displays ({host} - {display}). Enter brings a running
app's most recent window to the front with the lazy susan, launches an
app that isn't running as a floating window, or connects and spins to a
remote display. Shift+Enter or a right click opens the item's menu: the
app's desktop actions, Open new window, Open docked on this screen, and
its windows; a display's Go to and Disconnect.
- spotwatch/ft-spotwatch (Python, in the Plasma session's autostart):
the index, ranking (spotsearch.py), keys via libxkbcommon, usage.
- spotwatch/ft-spotpanel.cpp (SteamVR overlay, built by
screens/build.sh): the pill, drawn on the CPU; --render for a look
without a headset.
- ft-screens: "spin to N", "front N", and "spotwatch on|off", which
routes every key to the search while it's open (a lease, renewed
every second) and dismisses it on a click elsewhere or a pause.
- ft-floatd: "spotlist", "activate ID", and launch action=/screen=;
the KWin script tracks when each window was last active.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
4.3 KiB
YAML
101 lines
4.3 KiB
YAML
# Build Frametop's release on Depot's arm64 runners (the Frame is aarch64): the image from
|
|
# pack/Containerfile, the test gate inside it, then Frametop.zip (framedrop/build.sh), the
|
|
# image with its installer: FrameDrop installs it from a PC, or you unpack it on the headset
|
|
# and run Frametop/frametop-install.sh, or get.sh --release downloads it (pack/README.md,
|
|
# Releases). It's about 1.1 GB, under GitHub's 2 GB a file.
|
|
#
|
|
# A v* tag makes a draft GitHub release with the zip, its FrameDrop manifest, its
|
|
# frametop-release.json, and SHA256SUMS (a prerelease when the tag has a "-", like
|
|
# v0.3.0-exp.1). Nothing is public until someone publishes the draft. A manual run keeps the
|
|
# zip as the run's artifact for a week.
|
|
#
|
|
# podman, as on the Frame: the zip holds podman save's archive, which the headset loads with
|
|
# podman. Not on pushes or pull requests: Depot's runners are paid, and a fork's pull request
|
|
# would run on them. Actions are pinned to commit SHAs (the version in the comment).
|
|
name: release
|
|
|
|
on:
|
|
push:
|
|
tags: ["v*"]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write # the draft release
|
|
|
|
concurrency:
|
|
group: release-${{ github.ref }}
|
|
|
|
jobs:
|
|
release:
|
|
runs-on: depot-ubuntu-24.04-arm-4
|
|
timeout-minutes: 90
|
|
env:
|
|
FT_ENGINE: podman
|
|
steps:
|
|
# actions/checkout@v7.0.1
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
|
|
|
|
- name: version
|
|
run: |
|
|
if [ "$GITHUB_REF_TYPE" = tag ]; then v=${GITHUB_REF_NAME#v}; else v=0.0.0-ci.${GITHUB_SHA::7}; fi
|
|
echo "VERSION=$v" >> "$GITHUB_ENV"
|
|
echo "FT_IMAGE=localhost/frametop:$v" >> "$GITHUB_ENV"
|
|
|
|
- name: build the image
|
|
run: ./ft dev build
|
|
|
|
# The unit gate: Python (strict), C, and shell, inside the image, so what passes here is
|
|
# what the zip installs.
|
|
- name: test (python, c, bash)
|
|
run: ./ft dev test
|
|
|
|
- name: smoke (what a release installs from the image)
|
|
run: |
|
|
podman run --rm --entrypoint sh "$FT_IMAGE" -c '
|
|
set -e
|
|
for p in ft-screens ft-spotpanel ft-pointer ft-powerd ft-gaze ft-gazepanel ft-stream ft-eyegrab whisper-server; do
|
|
test -x /opt/frametop/bin/$p
|
|
done
|
|
test -f /src/frametop/pointer/driver/build/driver_ft_pointer.so
|
|
test -x /src/frametop/pack/build/distrobox/install
|
|
/src/frametop/gaze/tracker/build/venv/bin/python -c "import numpy, cv2"
|
|
/src/frametop/voice/build/venv/bin/python -c "import numpy, sentencepiece, sherpa_onnx"
|
|
python3 -c "import PySide6"'
|
|
|
|
# The FrameDrop manifest names the zip's URL in this repo's release (a fork's, in a fork).
|
|
- name: Frametop.zip
|
|
run: |
|
|
url=()
|
|
[ "$GITHUB_REF_TYPE" = tag ] &&
|
|
url=("https://github.com/$GITHUB_REPOSITORY/releases/download/$GITHUB_REF_NAME/Frametop.zip")
|
|
framedrop/build.sh --image "$FT_IMAGE" --version "$VERSION" --commit "$GITHUB_SHA" "${url[@]}"
|
|
|
|
- name: keep the zip (manual runs)
|
|
if: github.ref_type != 'tag'
|
|
# actions/upload-artifact@v7.0.2
|
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
|
|
with:
|
|
name: Frametop-${{ env.VERSION }}
|
|
path: framedrop/build/
|
|
retention-days: 7
|
|
|
|
- name: draft release (tags)
|
|
if: github.ref_type == 'tag'
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
run: |
|
|
pre=() notes=pack/release-notes.md
|
|
if [[ $VERSION == *-* ]]; then
|
|
pre=(--prerelease)
|
|
# get.sh --release asks for a channel and offers stable first: an experimental
|
|
# release's install line names its channel.
|
|
notes=$RUNNER_TEMP/release-notes.md
|
|
sed 's/bash -s -- --release`/bash -s -- --release --experimental`/' pack/release-notes.md >"$notes"
|
|
grep -q -- '--release --experimental`' "$notes" ||
|
|
echo "::warning::pack/release-notes.md has no get.sh --release line to mark experimental"
|
|
fi
|
|
gh release create "$GITHUB_REF_NAME" --draft --verify-tag "${pre[@]}" \
|
|
--title "Frametop $VERSION" --notes-file "$notes" --generate-notes \
|
|
framedrop/build/Frametop.zip framedrop/build/frametop.framedrop.json \
|
|
framedrop/build/frametop-release.json framedrop/build/SHA256SUMS
|