feat: keep Clipbin recording in the tray
Add native Linux SNI and Windows notification-area trays, single-instance reopening, background startup and login entries. Preserve recording and discovery after close, with clean Quit and reachable no-tray fallbacks. Track capture-source audio delivery independently of silent output tracks and warn without stopping video. Give clip metadata its own row and shape labels at final bounds to avoid GPUI 0.2.2 truncation cache and text-run bugs. Validated with strict workspace checks, 57 tests, Windows core/OBS/probe cross-clippy, all ten capture scenarios, tray/session/clips/playback rigs and narrow/wide screenshots. Document runtime validation gaps.
This commit is contained in:
@@ -20,6 +20,7 @@ done
|
||||
repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
out="${1:-${TMPDIR:-/tmp}/clipbin-session-validation}"
|
||||
mkdir -p "${out}"
|
||||
cargo build --locked -p clipbin-core --example sni-host
|
||||
cargo build --locked -p clipbin-desktop --manifest-path "${repo}/Cargo.toml"
|
||||
export CLIPBIN_SESSION_REPO="${repo}" CLIPBIN_SESSION_OUT="${out}"
|
||||
"${repo}/scripts/rig/headless.sh" bash <<'INNER'
|
||||
@@ -46,13 +47,17 @@ wait_log() {
|
||||
echo "FAIL timed out waiting for ${minimum} '${pattern}' entries; log: ${log}" >&2
|
||||
exit 1
|
||||
}
|
||||
"${CLIPBIN_SESSION_REPO}/target/debug/examples/sni-host" > "${CLIPBIN_SESSION_OUT}/tray-host.log" 2>&1 &
|
||||
host=$!
|
||||
sleep 1
|
||||
source "${CLIPBIN_SESSION_REPO}/scripts/rig/keys.sh"
|
||||
out="${CLIPBIN_SESSION_OUT}"
|
||||
portal_config="${XDG_CONFIG_HOME}"
|
||||
export XDG_DATA_HOME="${out}/data" XDG_CONFIG_HOME="${out}/config"
|
||||
mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}"
|
||||
"${CLIPBIN_SESSION_REPO}/target/debug/clipbin-desktop" > "${out}/desktop.log" 2>&1 &
|
||||
app=$!
|
||||
trap 'kill "${app}" "${game:-}" "${portal:-}" 2>/dev/null || true' EXIT
|
||||
trap 'kill "${app}" "${game:-}" "${portal:-}" "${host}" 2>/dev/null || true' EXIT
|
||||
sleep 3
|
||||
swaymsg '[title="clipbin-test-game"] fullscreen disable' > /dev/null || true
|
||||
swaymsg '[app_id="dev.clipbin.Clipbin"] floating enable, resize set 1360 860, move position center, focus' > /dev/null
|
||||
@@ -147,25 +152,20 @@ import pathlib,json,sys
|
||||
files=list(pathlib.Path(sys.argv[1]).glob('clipbin/sessions/*/session.json'))
|
||||
assert files and all(not json.loads(p.read_text())['session']['active'] for p in files)
|
||||
PY
|
||||
for _ in $(seq 10); do
|
||||
if ! kill -0 "${app}" 2>/dev/null; then break; fi
|
||||
sleep 1
|
||||
done
|
||||
if kill -0 "${app}" 2>/dev/null; then echo 'FAIL closed app kept discovering after game exit' >&2; exit 1; fi
|
||||
wait "${app}"
|
||||
kill -0 "${app}"
|
||||
kill "$(cat "${CLIPBIN_RIG_DIR}/game.pid")"
|
||||
# Reopen to prove the library loads from disk, then Quit cleanly with Ctrl+Q.
|
||||
"${CLIPBIN_SESSION_REPO}/target/debug/clipbin-desktop" > "${out}/reopened.log" 2>&1 &
|
||||
app=$!
|
||||
# A second launch signals the original instance and exits; background discovery survives.
|
||||
"${CLIPBIN_SESSION_REPO}/target/debug/clipbin-desktop" > "${out}/second-launch.log" 2>&1
|
||||
kill -0 "${app}"
|
||||
sleep 4
|
||||
swaymsg '[app_id="dev.clipbin.Clipbin"] focus' > /dev/null
|
||||
sleep 0.5
|
||||
grim "${out}/library.png"
|
||||
bash -c 'exec -a reaper python3 -c "import time; time.sleep(120)" SteamLaunch AppId=480 --' &
|
||||
game=$!
|
||||
wait_log 'recorder_status=Recording' "${out}/reopened.log" 1 30
|
||||
wait_log 'recorder_status=Recording' "${out}/desktop.log" 2 30
|
||||
swaymsg '[app_id="dev.clipbin.Clipbin"] focus' > /dev/null
|
||||
wtype -M ctrl -k q -m ctrl
|
||||
rig_key q ctrl
|
||||
for _ in $(seq 20); do
|
||||
if ! kill -0 "${app}" 2>/dev/null; then break; fi
|
||||
sleep 1
|
||||
|
||||
Reference in New Issue
Block a user