60d4653083
Ship a Steam Input controller layout (controller_config/punktfunk.vdf) whose always-on `ts_n` command enables native touchscreen delivery on the Deck, and have the backend auto-install it (apply_controller_config: copy to controller_base/templates + upsert the per-account configset entry, chown to the user, back up first). This is what makes the Deck touchscreen reach the client as native touch under gamescope without disabling Steam Input (impossible on the Deck) — no manual controller setup. Two shortcuts sharing the "Punktfunk" name (so one config key covers both): a hidden stateful stream entry and a visible stateless entry that launches straight into the gamepad UI. Both get full artwork (grid/gridwide/hero/logo/icon, replaced with exported PNGs). Drop the art-generation script. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49 lines
2.3 KiB
Bash
Executable File
49 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Assemble the Decky plugin into the canonical store/sideload layout:
|
|
#
|
|
# out/punktfunk-v<version>.zip -> punktfunk/{dist/index.js,main.py,plugin.json,
|
|
# package.json,decky.pyi,LICENSE,README.md}
|
|
# out/punktfunk/ (the same tree, unzipped — rsync this with scripts/deploy.sh)
|
|
#
|
|
# Decky extracts the zip with --strip-components=1, so the single top-level dir MUST equal
|
|
# plugin.json "name". Run after `pnpm build` (or use `pnpm run package`). Host-agnostic: needs
|
|
# only bash, python3 and zip.
|
|
set -euo pipefail
|
|
HERE="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$HERE"
|
|
|
|
[ -f dist/index.js ] || { echo "dist/index.js missing — run 'pnpm build' first" >&2; exit 1; }
|
|
[ -f LICENSE ] || { echo "LICENSE missing (required by the Decky store)" >&2; exit 1; }
|
|
|
|
NAME="$(python3 -c 'import json;print(json.load(open("plugin.json"))["name"])')"
|
|
VER="$(python3 -c 'import json;print(json.load(open("package.json"))["version"])')"
|
|
|
|
STAGE="$(mktemp -d)"
|
|
DEST="$STAGE/$NAME"
|
|
mkdir -p "$DEST/dist" "$DEST/bin" "$DEST/assets"
|
|
cp dist/index.js "$DEST/dist/index.js" # ship the bundle only, not the sourcemap
|
|
cp main.py plugin.json package.json LICENSE "$DEST/"
|
|
# The stream-launch wrapper (target of the Steam shortcut) — must stay executable.
|
|
cp bin/punktfunkrun.sh "$DEST/bin/punktfunkrun.sh"
|
|
chmod 0755 "$DEST/bin/punktfunkrun.sh"
|
|
# Steam-shortcut artwork (grid/gridwide/hero/logo/icon — committed under assets/).
|
|
cp assets/*.png "$DEST/assets/"
|
|
# The Steam Input controller layout (native touchscreen `ts_n` + gamepad passthrough) the
|
|
# backend installs (apply_controller_config → controller_base/templates + the shortcut config).
|
|
mkdir -p "$DEST/controller_config"
|
|
cp controller_config/punktfunk.vdf "$DEST/controller_config/punktfunk.vdf"
|
|
[ -f decky.pyi ] && cp decky.pyi "$DEST/"
|
|
[ -f README.md ] && cp README.md "$DEST/"
|
|
|
|
OUT="$HERE/out"
|
|
mkdir -p "$OUT"
|
|
ZIP="$OUT/${NAME}-v${VER}.zip"
|
|
rm -f "$ZIP"
|
|
( cd "$STAGE" && zip -r -X "$ZIP" "$NAME" >/dev/null )
|
|
# Leave an unzipped staging tree for the rsync/sudo deploy path (scripts/deploy.sh).
|
|
rm -rf "$OUT/$NAME" && cp -r "$DEST" "$OUT/$NAME"
|
|
rm -rf "$STAGE"
|
|
|
|
echo "built $ZIP"
|
|
echo "staged $OUT/$NAME (deploy with: DECK=deck@<ip> bash scripts/deploy.sh)"
|