From 4f6e6fd0aac0b2c7d93399e2fd1879566cd96a78 Mon Sep 17 00:00:00 2001 From: rickpeters Date: Sun, 27 Sep 2026 21:59:08 +0200 Subject: [PATCH 01/10] feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages --- AGENTS.md | 3 +++ CHANGELOG.md | 6 +++++- lib/menu.sh | 30 ++++++++++++++++++++++++++++++ steamify.sh | 6 ++++-- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 8ae9fd8..bc33392 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -279,6 +279,9 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine removes it so Plasma builds Vapor's layout at the first login. What needs that layout (single user's launcher) runs then, from a one-time autostart (`lib/first-login.sh`, `--first-login`) that also opens the app. + `--skip ,...` and `--boot gamescope|desktop` (2.7.0, `defaults_options` + in `lib/menu.sh`) change the preselection through `toggle_component`, so the + menu's dependencies hold; the ISO's installer pages pass them. - `Relogin=true` means a gamescope that fails to start is relaunched in a tight loop; keep that in mind when changing session handling. diff --git a/CHANGELOG.md b/CHANGELOG.md index 2befe61..ee03979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,13 @@ All notable changes, per version and per commit. Versions follow `steamify.sh`. Versions before 0.7.0 were numbered afterwards, one per merged pull request. +## 2.7.0 - 2026-09-27 + +- **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** + ## 2.6.0 - 2026-09-27 -- **feat: --defaults applies the default setup without the menu, also from an installer (no session): the base for a Steam Machine ISO** +- `b948c20` **feat: --defaults applies the default setup without the menu, also from an installer (no session): the base for a Steam Machine ISO** ## 2.5.2 - 2026-09-27 diff --git a/lib/menu.sh b/lib/menu.sh index e9b6200..f59ee2b 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -179,6 +179,36 @@ detect_components() { fi } +defaults_options() { + # defaults_options [--skip [,...]] [--boot gamescope|desktop]: + # changes --defaults' preselection like unticking items in the menu + # (the Steam Machine ISO's installer pages pass them). Returns 1 on an + # unknown option or id. + local c ids + while [[ $# -gt 0 ]]; do + case "$1" in + --skip) + IFS=, read -ra ids <<< "${2:-}" + for c in "${ids[@]}"; do + [[ -n "${LABEL[$c]:-}" ]] || { err "Unknown item: $c"; return 1; } + # Unticking through the menu's rules: e.g. skipping the + # conversion also skips single user mode. + [[ "${WANTED[$c]:-0}" == 1 ]] && toggle_component "$c" + done + shift 2 ;; + --boot) + case "${2:-}" in + gamescope) [[ "${WANTED[boot]:-0}" == 1 ]] && toggle_component boot ;; + desktop) [[ "${WANTED[boot]:-0}" == 0 && "${WANTED[gaming]:-0}" == 1 ]] && toggle_component boot ;; + *) err "--boot takes gamescope or desktop"; return 1 ;; + esac + shift 2 ;; + *) err "Unknown option: $1"; return 1 ;; + esac + done + return 0 +} + toggle_component() { local c="$1" component_selectable "$c" || return 1 diff --git a/steamify.sh b/steamify.sh index 1290d59..5a7828f 100755 --- a/steamify.sh +++ b/steamify.sh @@ -15,7 +15,7 @@ set -uo pipefail # Release version, see CHANGELOG.md. -VERSION=2.6.0 +VERSION=2.7.0 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -28,7 +28,8 @@ require_root_helper BACKEND=false [[ "${1:-}" == --backend ]] && BACKEND=true -# --defaults: apply what the menu would preselect, without the menu or any +# --defaults [--skip ,...] [--boot gamescope|desktop]: apply what the +# menu would preselect (minus the skipped items), without the menu or any # prompt (the Steam Machine ISO's first login runs this; sudo must not ask). DEFAULTS=false [[ "${1:-}" == --defaults ]] && DEFAULTS=true @@ -128,6 +129,7 @@ if [[ "$DEFAULTS" == true ]]; then REAPPLY=false sudo -n true 2>/dev/null || { err "--defaults needs sudo without a password."; exit 1; } detect_components + defaults_options "${@:2}" || exit 1 plan_changes apply_changes # Run by the installer: the rest waits for the first desktop login. From 5bf9da411d376675a5930c927aa79c398e1a1a27 Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:06:23 +0200 Subject: [PATCH 02/10] fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update --- CHANGELOG.md | 5 +++-- TECHNICAL.md | 4 +++- lib/cec.sh | 3 +++ lib/menu.sh | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee03979..69c1cb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,10 @@ All notable changes, per version and per commit. Versions follow `steamify.sh`. Versions before 0.7.0 were numbered afterwards, one per merged pull request. -## 2.7.0 - 2026-09-27 +## 2.7.0 - 2026-09-28 -- **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** +- `4f6e6fd` **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** +- **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** ## 2.6.0 - 2026-09-27 diff --git a/TECHNICAL.md b/TECHNICAL.md index b245b58..a14c6c1 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -180,7 +180,9 @@ SHA-256 in Valve's package index: - `cecd`, Valve's CEC daemon (a user service started with the desktop and gaming mode): TV remote keys become normal key presses (arrows, Enter, Back), and it turns the TV on and off with the PC; -- `cec-audio-control`: volume of the TV or receiver; +- `cec-audio-control`: volume of the TV or receiver (the TV remote's volume + keys); its user socket is enabled by Steamify, since SteamOS enables it + through a preset that pacman doesn't apply; - `inputattach-cec-units` (with `linuxconsole` from CachyOS for `inputattach`): attaches USB CEC adapters (Pulse-Eight, RainShadow). diff --git a/lib/cec.sh b/lib/cec.sh index a075e5d..4193628 100644 --- a/lib/cec.sh +++ b/lib/cec.sh @@ -155,6 +155,9 @@ cec_enable() { printf '%s\n' "# Written by Steamify: overrides STEAM_ENABLE_CEC=0 from the gaming mode script." \ '[Service]' "EnvironmentFile=-$CEC_STEAM_ENV" | sudo tee "$CEC_STEAM_DROPIN" >/dev/null user_systemctl daemon-reload + # The TV remote's volume keys: SteamOS enables this socket through its + # preset, which pacman doesn't apply, so nothing else does on CachyOS. + user_systemctl enable --now cec-audio-control.socket 2>/dev/null cec_link_steamos_manager if compgen -G "/dev/cec*" >/dev/null; then user_systemctl restart cecd.service 2>/dev/null diff --git a/lib/menu.sh b/lib/menu.sh index f59ee2b..fac73ba 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -26,7 +26,7 @@ NO_PRESELECT=(boot cec kpin hdmi) FEATURE_BASELINE=2.1.0 declare -A FEATURE_VERSION=( [gaming]=2.1.0 [boot]=2.1.0 [theme]=2.1.0 [glyphs]=2.1.0 [single]=2.1.0 - [launcher]=2.1.0 [cec]=2.1.0 [machine]=2.2.0 [poweroff]=2.2.0 [vram]=2.3.0 [notify]=2.5.0 [steamgame]=2.5.1 + [launcher]=2.1.0 [cec]=2.7.0 [machine]=2.2.0 [poweroff]=2.2.0 [vram]=2.3.0 [notify]=2.5.0 [steamgame]=2.5.1 [kpin]=2.1.0 [hdmi]=2.1.0 ) From 14aa7c0b54e9a1dd112c219c90050fbaa21eb855 Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:06:32 +0200 Subject: [PATCH 03/10] fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into" --- CHANGELOG.md | 3 ++- ui/qml/ApplyingScreen.qml | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69c1cb6..74e7a7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ one per merged pull request. ## 2.7.0 - 2026-09-28 - `4f6e6fd` **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** -- **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** +- `5bf9da4` **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** +- **fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into"** ## 2.6.0 - 2026-09-27 diff --git a/ui/qml/ApplyingScreen.qml b/ui/qml/ApplyingScreen.qml index 184e10a..56c69b6 100644 --- a/ui/qml/ApplyingScreen.qml +++ b/ui/qml/ApplyingScreen.qml @@ -37,7 +37,9 @@ Item { font.pixelSize: 13; font.weight: Font.Bold } RotationAnimator on rotation { running: step.st === "run"; from: 0; to: 360; duration: 1000; loops: Animation.Infinite } } Row { width: 380; anchors.verticalCenter: parent.verticalCenter; spacing: 10 - Text { text: (Texts.actions[step.modelData.action] || [])[3] + Texts.label(step.modelData.id) + // Boot into's label is its prefix already: "Boot into desktop", not "Boot into Boot into". + Text { text: step.modelData.id === "boot" ? (Texts.actions[step.modelData.action] || [])[3] + Texts.actions[step.modelData.action][0].toLowerCase() + : (Texts.actions[step.modelData.action] || [])[3] + Texts.label(step.modelData.id) color: step.st === "wait" ? Theme.faint : Theme.textHi; font.family: Theme.body; font.pixelSize: 16; font.weight: Font.DemiBold anchors.verticalCenter: parent.verticalCenter; elide: Text.ElideRight width: Math.min(implicitWidth, parent.width - (badge.visible ? badge.width + parent.spacing : 0)) } From c4ec755a4ad8915cbbb767418165adfc942d5a8f Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:06:45 +0200 Subject: [PATCH 04/10] feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts --- AGENTS.md | 10 ++++++--- CHANGELOG.md | 3 ++- README.md | 8 +++++++ TECHNICAL.md | 24 +++++++++++++++++++++ lib/menu.sh | 59 ++++++++++++++++++++++++++++++++++++++-------------- steamify.sh | 32 ++++++++++++++++++++++++++-- 6 files changed, 114 insertions(+), 22 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index bc33392..04a8845 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -279,9 +279,13 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine removes it so Plasma builds Vapor's layout at the first login. What needs that layout (single user's launcher) runs then, from a one-time autostart (`lib/first-login.sh`, `--first-login`) that also opens the app. - `--skip ,...` and `--boot gamescope|desktop` (2.7.0, `defaults_options` - in `lib/menu.sh`) change the preselection through `toggle_component`, so the - menu's dependencies hold; the ISO's installer pages pass them. + `--options ,...` (exactly these on, the rest off; an item on brings its + parent) and `--boot gamescope|desktop` (desktop only with `gaming`) (2.7.0, + `defaults_options` in `lib/menu.sh`); the ISO's installer page passes them. + Items this PC can't use are left off with a warning, not an error. + `steamify.sh --boot gamescope|desktop` on its own (2.7.0, for scripts) only + switches `boot` on an installed conversion: `WANTED` is `CURRENT` plus + that, so no updates or removals a normal run would pick. - `Relogin=true` means a gamescope that fails to start is relaunched in a tight loop; keep that in mind when changing session handling. diff --git a/CHANGELOG.md b/CHANGELOG.md index 74e7a7f..ab91c6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ one per merged pull request. - `4f6e6fd` **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** - `5bf9da4` **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** -- **fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into"** +- `14aa7c0` **fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into"** +- **feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts** ## 2.6.0 - 2026-09-27 diff --git a/README.md b/README.md index 764a3dc..4b80d7e 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,14 @@ steamos-session-select persistent # start where you left off last time steamos-session-select oneshot # always start in gaming mode (default) ``` +Where the PC starts after a restart can also be set from a script, once the +SteamOS conversion is on (only that changes; `sudo` may ask for your password): + +```bash +steamify.sh --boot desktop # start in the desktop from the next boot on +steamify.sh --boot gamescope # start in gaming mode again (default) +``` + ## Something wrong? Stuck on a black screen in gaming mode: press **Ctrl+Alt+F3**, log in, and run diff --git a/TECHNICAL.md b/TECHNICAL.md index a14c6c1..4229f64 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -420,6 +420,30 @@ steamos-session-select persistent # remember the last-used session across reboo steamos-session-select oneshot # always start in gamescope (default, like a Deck) ``` +`steamify.sh --boot gamescope|desktop` sets where the PC starts after a +restart (the menu's Boot into row) from a script: it needs the SteamOS +conversion and changes nothing else, not even the updates a normal run would +apply. Exit code 1 without the conversion or with another value. + +## Install-time mode (`--defaults`) + +For an installer (the Steam Machine ISO), without a session or prompts +(passwordless sudo required): + +```bash +steamify.sh --defaults # what the menu would preselect +steamify.sh --defaults --options gaming,theme,cec,machine --boot desktop +``` + +`--options` turns on exactly the listed items (the menu's ids: `gaming`, +`theme`, `glyphs`, `single`, `launcher`, `notify`, `vram`, `cec`, `machine`, +`poweroff`), everything else off; an item that's on brings its parent +(single user the conversion, the power-off fix Steam Machine support). An +item this PC can't use (e.g. `vram` without a VRAM region) is left off with +a warning. `--boot desktop` needs `gaming`. Unknown options, ids, `boot` or +`bios` in the list: exit code 1 before anything changes. What needs a +Plasma session waits for the first login (`lib/first-login.sh`). + With `Relogin=true`, a gamescope session that fails to start is restarted immediately, which can turn into a loop - see [TROUBLESHOOTING.md](TROUBLESHOOTING.md) for the way out. diff --git a/lib/menu.sh b/lib/menu.sh index fac73ba..8372868 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -180,32 +180,59 @@ detect_components() { } defaults_options() { - # defaults_options [--skip [,...]] [--boot gamescope|desktop]: - # changes --defaults' preselection like unticking items in the menu - # (the Steam Machine ISO's installer pages pass them). Returns 1 on an - # unknown option or id. - local c ids + # defaults_options [--options [,...]] [--boot gamescope|desktop]: + # what --defaults sets up, from the Steam Machine ISO's installer page. + # --options: exactly these items on, every other off (without it, the + # menu's preselection). An item that's on brings its parent (single user + # the conversion, like ticking it in the menu); one this PC can't use is + # left off with a warning. --boot desktop needs the conversion. Returns 1 + # on an unknown option, item or value. + local c ids list=false boot="" while [[ $# -gt 0 ]]; do + # Both take a value: without one, shift 2 fails and never shifts, so + # the loop would spin forever. + [[ "$1" == --options || "$1" == --boot ]] && [[ $# -lt 2 ]] && { err "$1 needs a value"; return 1; } case "$1" in - --skip) - IFS=, read -ra ids <<< "${2:-}" - for c in "${ids[@]}"; do - [[ -n "${LABEL[$c]:-}" ]] || { err "Unknown item: $c"; return 1; } - # Unticking through the menu's rules: e.g. skipping the - # conversion also skips single user mode. - [[ "${WANTED[$c]:-0}" == 1 ]] && toggle_component "$c" - done + --options) + list=true + IFS=, read -ra ids <<< "$2" shift 2 ;; --boot) - case "${2:-}" in - gamescope) [[ "${WANTED[boot]:-0}" == 1 ]] && toggle_component boot ;; - desktop) [[ "${WANTED[boot]:-0}" == 0 && "${WANTED[gaming]:-0}" == 1 ]] && toggle_component boot ;; + case "$2" in + gamescope|desktop) boot="$2" ;; *) err "--boot takes gamescope or desktop"; return 1 ;; esac shift 2 ;; *) err "Unknown option: $1"; return 1 ;; esac done + if [[ "$list" == true ]]; then + for c in "${ids[@]}"; do + [[ -n "$c" ]] || continue + [[ -n "${LABEL[$c]:-}" ]] || { err "Unknown item: $c"; return 1; } + [[ "$c" == boot ]] && { err "Where to start is --boot, not an item."; return 1; } + is_action "$c" && { err "$c can't be part of the install."; return 1; } + done + for c in "${COMPONENTS[@]}"; do WANTED[$c]=0; done + for c in "${ids[@]}"; do + [[ -n "$c" ]] || continue + if component_available "$c" && component_selectable "$c"; then + WANTED[$c]=1 + else + warn "Leaving out ${LABEL[$c]%%:*}: not available on this PC." + fi + done + [[ "${WANTED[single]}" == 1 ]] && WANTED[gaming]=1 + for c in "${COMPONENTS[@]}"; do + [[ "${WANTED[$c]}" == 1 && -n "${PARENT[$c]:-}" ]] && WANTED[${PARENT[$c]}]=1 + done + fi + case "$boot" in + desktop) + [[ "${WANTED[gaming]}" == 1 ]] || { err "--boot desktop needs the SteamOS conversion (gaming)."; return 1; } + WANTED[boot]=1 ;; + gamescope) WANTED[boot]=0 ;; + esac return 0 } diff --git a/steamify.sh b/steamify.sh index 5a7828f..df5129f 100755 --- a/steamify.sh +++ b/steamify.sh @@ -28,11 +28,15 @@ require_root_helper BACKEND=false [[ "${1:-}" == --backend ]] && BACKEND=true -# --defaults [--skip ,...] [--boot gamescope|desktop]: apply what the -# menu would preselect (minus the skipped items), without the menu or any +# --defaults [--options ,...] [--boot gamescope|desktop]: apply what the +# menu would preselect (or exactly the listed items), without the menu or any # prompt (the Steam Machine ISO's first login runs this; sudo must not ask). DEFAULTS=false [[ "${1:-}" == --defaults ]] && DEFAULTS=true +# --boot gamescope|desktop: only change where an installed conversion +# starts, everything else stays as it is (for scripts; no menu). +BOOT_ONLY=false +[[ "${1:-}" == --boot ]] && BOOT_ONLY=true if [[ "$BACKEND" == false ]]; then echo -e "${c_bold}Steamify CachyOS${c_reset} v$VERSION" @@ -139,6 +143,30 @@ if [[ "$DEFAULTS" == true ]]; then exit 0 fi +if [[ "$BOOT_ONLY" == true ]]; then + RESTART_FOR_LOGIN=false + REAPPLY=false + case "${2:-}" in + gamescope|desktop) ;; + *) err "--boot takes gamescope or desktop"; exit 1 ;; + esac + detect_components + [[ "${CURRENT[gaming]}" == 1 ]] || { err "--boot needs the SteamOS conversion; turn it on first."; exit 1; } + # What is on stays on, and nothing else changes: not the updates or + # removals a normal run would pick. + for c in "${COMPONENTS[@]}"; do WANTED[$c]=${CURRENT[$c]:-0}; done + WANTED[boot]=0; [[ "$2" == desktop ]] && WANTED[boot]=1 + plan_changes + if [[ ${#TO_DISABLE[@]} -eq 0 && ${#TO_ENABLE[@]} -eq 0 ]]; then + ok "Already starting in $2." + exit 0 + fi + apply_changes + [[ ${#FAILED[@]} -eq 0 ]] || { warn "These had problems (see above): ${FAILED[*]}"; exit 1; } + ok "Starts in $2 from the next boot on." + exit 0 +fi + # Menu loop: after each run the menu comes back with the new state, until # the user quits; the restart question comes then, once, for everything. RESTART_FOR_LOGIN=false From eadbdda271d217cbef72f36272401e32d3741d65 Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:14:20 +0200 Subject: [PATCH 05/10] docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes --- .github/workflows/bundle.yml | 2 +- AGENTS.md | 23 ++++++++++++++++++++--- CHANGELOG.md | 3 ++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index a057cf5..0768ce8 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -16,7 +16,7 @@ name: Single-file build on: push: - branches: [main, feat/v2-ui] + branches: [main, 'release/**'] pull_request: workflow_dispatch: diff --git a/AGENTS.md b/AGENTS.md index 04a8845..f12a7e0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -98,11 +98,28 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine + subject; a commit can't contain its own hash, so fill it in with the next commit). The section heading must be `## - `: CI cuts the release notes out of the changelog by that heading. - - Every PR that should be released bumps `VERSION` and adds its section. - A push to `main` publishes release `v$VERSION` (tag + bundle + that + - **Branches: one release branch per version.** Work for a release goes + into `release/X.Y.Z` (e.g. `release/2.7.0`), branched from `main` when + that version starts. That branch bumps `VERSION` to `X.Y.Z` and adds the + `## X.Y.Z - ` changelog section (first commit on it). + - Every change gets its own branch from the release branch: + `feature/` (new behaviour) or `bugfix/` (a fix), and a + pull request **into the release branch**, not into `main`. Its commits + add their changelog lines to that version's section. + - When the release is done and tested (the test plan in + steamify-cachyos-dev, `TESTPLAN.md`), the release branch gets a pull + request **into `main`**. Merging it publishes the release (below). + - A fix for a released version: a new `release/X.Y.Z+1` from `main`, + with the `bugfix/` branch into it; don't reopen an old release branch. + - Never commit to `main` directly; the user merges the pull requests. + Keep a feature/bugfix branch up to date by merging (or rebasing on) + its release branch, the release branch by merging `main` when that + moved. + - A push to `main` publishes release `v$VERSION` (tag + bundle + that changelog section) and marks it latest. An existing version is never overwritten: without a bump nothing is released, and pull requests show - a warning. + a warning when `VERSION` is a version that's already released (so a + release branch that forgot its bump shows it on every PR). - A release that adds, removes or renames a menu row also retakes the README screenshot (`assets/screenshot-menu.png`): the app from the branch on a Steam Machine, every row visible (window 1280 wide, tall diff --git a/CHANGELOG.md b/CHANGELOG.md index ab91c6a..c2833e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ one per merged pull request. - `4f6e6fd` **feat: --defaults takes --skip and --boot gamescope|desktop, for the Steam Machine ISO's installer pages** - `5bf9da4` **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** - `14aa7c0` **fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into"** -- **feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts** +- `c4ec755` **feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts** +- **docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes** ## 2.6.0 - 2026-09-27 From bee18b76a82e4c1c288bc3ce3efbb69193bdbcca Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:17:41 +0200 Subject: [PATCH 06/10] docs: the agent merges feature/bugfix branches into the release branch; the release into main stays the user's --- AGENTS.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index f12a7e0..f73c107 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -111,7 +111,11 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine request **into `main`**. Merging it publishes the release (below). - A fix for a released version: a new `release/X.Y.Z+1` from `main`, with the `bugfix/` branch into it; don't reopen an old release branch. - - Never commit to `main` directly; the user merges the pull requests. + - Up to the release branch, the agent manages it: create the + `feature/`/`bugfix/` branches, commit, push, and merge them into the + release branch itself once tested (no pull request needed). Only the + release branch's pull request into `main` is the user's: never commit + or merge to `main`, the user merges that one. Keep a feature/bugfix branch up to date by merging (or rebasing on) its release branch, the release branch by merging `main` when that moved. From 501c0ba425344aff75efb77345e21790c3d4426e Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:17:59 +0200 Subject: [PATCH 07/10] docs: gh or git for merging into the release branch --- AGENTS.md | 4 +++- CHANGELOG.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f73c107..4a1cb7d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -113,7 +113,9 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine with the `bugfix/` branch into it; don't reopen an old release branch. - Up to the release branch, the agent manages it: create the `feature/`/`bugfix/` branches, commit, push, and merge them into the - release branch itself once tested (no pull request needed). Only the + release branch itself once tested (with `gh`: `gh pr create --base + release/X.Y.Z` + `gh pr merge --merge`, or a plain `git merge --no-ff`; + no review needed). Only the release branch's pull request into `main` is the user's: never commit or merge to `main`, the user merges that one. Keep a feature/bugfix branch up to date by merging (or rebasing on) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2833e9..498fb05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ one per merged pull request. - `5bf9da4` **fix: HDMI-CEC enables cec-audio-control.socket (the TV remote's volume keys); existing installs get it as an update** - `14aa7c0` **fix: the app's progress screen says "Boot into desktop", not "Boot into Boot into"** - `c4ec755` **feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts** -- **docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes** +- `eadbdda` **docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes** +- `bee18b7` **docs: the agent merges feature/bugfix branches into the release branch; the release into main stays the user's** +- **docs: gh or git for merging into the release branch** ## 2.6.0 - 2026-09-27 From b1adacbcb387a9ff53817f4479e569c6cd2e76ae Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:18:59 +0200 Subject: [PATCH 08/10] docs: gh is required for the release-branch pull requests; ask the user to install it --- AGENTS.md | 6 ++++-- CHANGELOG.md | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 4a1cb7d..699aace 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -114,8 +114,10 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine - Up to the release branch, the agent manages it: create the `feature/`/`bugfix/` branches, commit, push, and merge them into the release branch itself once tested (with `gh`: `gh pr create --base - release/X.Y.Z` + `gh pr merge --merge`, or a plain `git merge --no-ff`; - no review needed). Only the + release/X.Y.Z` + `gh pr merge --merge`; no review needed). Without + `gh` (`command -v gh`), ask the user to install it (Ubuntu: + `sudo apt install gh`, then `gh auth login`) instead of working around + it. Only the release branch's pull request into `main` is the user's: never commit or merge to `main`, the user merges that one. Keep a feature/bugfix branch up to date by merging (or rebasing on) diff --git a/CHANGELOG.md b/CHANGELOG.md index 498fb05..b533d0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,8 @@ one per merged pull request. - `c4ec755` **feat: --defaults --options (exactly these on) replaces --skip; steamify.sh --boot gamescope|desktop on its own switches where an installed conversion starts** - `eadbdda` **docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes** - `bee18b7` **docs: the agent merges feature/bugfix branches into the release branch; the release into main stays the user's** -- **docs: gh or git for merging into the release branch** +- `501c0ba` **docs: gh or git for merging into the release branch** +- **docs: gh is required for the release-branch pull requests; ask the user to install it** ## 2.6.0 - 2026-09-27 From ced4a45d2ff3f57bb4beadb5ea57609a084e9f1a Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:46:23 +0200 Subject: [PATCH 09/10] chore: the v2 app preview is gone (it is the released app): no preview pre-release step in CI, no mention in steamify-app.sh --- .github/workflows/bundle.yml | 26 ++------------------------ CHANGELOG.md | 3 ++- ui/steamify-app.sh | 8 ++++---- 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index 0768ce8..0f1fb80 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -5,12 +5,10 @@ # release are moved to it, so both of these always get the newest version: # curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify.sh | bash # curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/download/latest/steamify.sh | bash -# Each release also has the app (v2): steamify-app.tar.gz (ui/, steamify.sh, +# Each release also has the app: steamify-app.tar.gz (ui/, steamify.sh, # lib/, patches/, services/, the icon) and its launcher, run with: # curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify-app.sh | bash -# A push to feat/v2-ui (the app, not released yet) updates the pre-release -# v2-ui-preview instead, whose launcher gets that build: -# curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/download/v2-ui-preview/steamify-app.sh | bash +# Pushes to release/** build and check it like pull requests; only main publishes. # Pull requests only build and check it, and warn when VERSION is already released. name: Single-file build @@ -106,23 +104,3 @@ jobs: gh release create latest --title "Steamify CachyOS - latest (v$VERSION)" --notes "$latest_notes" --latest=false fi gh release upload latest dist/steamify.sh dist/steamify-app.sh dist/steamify-app.tar.gz assets/steam-gaming-settings.svg --clobber - - - name: Publish the v2-ui-preview pre-release - if: github.event_name == 'push' && github.ref == 'refs/heads/feat/v2-ui' - env: - GH_TOKEN: ${{ github.token }} - run: | - # Its launcher downloads this pre-release, not the newest release. - sed -i 's/STEAMIFY_RELEASE:-latest/STEAMIFY_RELEASE:-v2-ui-preview/' dist/steamify-app.sh - grep -q 'STEAMIFY_RELEASE:-v2-ui-preview' dist/steamify-app.sh - git tag -f v2-ui-preview "$GITHUB_SHA" && git push -f origin v2-ui-preview - notes="Preview of the Steamify app (v2) from feat/v2-ui ($(git describe --always), $(git log -1 --format='%cs %s')). Not a release. - Run it with: - - curl -fsSL https://github.com/${{ github.repository }}/releases/download/v2-ui-preview/steamify-app.sh | bash" - if gh release view v2-ui-preview >/dev/null 2>&1; then - gh release edit v2-ui-preview --title "Steamify app (v2) preview" --notes "$notes" --prerelease --latest=false - else - gh release create v2-ui-preview --target "$GITHUB_SHA" --title "Steamify app (v2) preview" --notes "$notes" --prerelease --latest=false - fi - gh release upload v2-ui-preview dist/steamify-app.sh dist/steamify-app.tar.gz --clobber diff --git a/CHANGELOG.md b/CHANGELOG.md index b533d0e..388b47e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,8 @@ one per merged pull request. - `eadbdda` **docs: release branches (release/X.Y.Z, feature/ and bugfix/ branches into it, the release into main); CI builds release/** pushes** - `bee18b7` **docs: the agent merges feature/bugfix branches into the release branch; the release into main stays the user's** - `501c0ba` **docs: gh or git for merging into the release branch** -- **docs: gh is required for the release-branch pull requests; ask the user to install it** +- `b1adacb` **docs: gh is required for the release-branch pull requests; ask the user to install it** +- **chore: the v2 app preview is gone (it is the released app): no preview pre-release step in CI, no mention in steamify-app.sh** ## 2.6.0 - 2026-09-27 diff --git a/ui/steamify-app.sh b/ui/steamify-app.sh index 95f428b..fd3c012 100755 --- a/ui/steamify-app.sh +++ b/ui/steamify-app.sh @@ -1,12 +1,12 @@ #!/bin/bash -# Steamify CachyOS - get and start the app (v2), for `curl | bash`: +# Steamify CachyOS - get and start the app, for `curl | bash`: # curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify-app.sh | bash # Downloads the newest release's app package (steamify-app.tar.gz: the app, # steamify.sh, lib/, patches/ and services/) to ~/.local/share/steamify/app, installs PySide6 if # it's missing, adds a launcher entry, and starts the app. -# STEAMIFY_RELEASE= takes that release instead of the newest (the -# v2-ui-preview build's copy of this script sets it). STEAMIFY_BRANCH= -# takes that branch's source instead (for testing before a build). +# STEAMIFY_RELEASE= takes that release instead of the newest. +# STEAMIFY_BRANCH= takes that branch's source instead (for testing +# before a build). set -euo pipefail REPO="theupriser/steamify-cachyos" From 58e43d4c4ab4fc1b2ded4c687b56e4e7d9a6dd5b Mon Sep 17 00:00:00 2001 From: Rick Peters Date: Mon, 28 Sep 2026 10:52:28 +0200 Subject: [PATCH 10/10] fix: turning the theme off no longer brings back single user's launcher restriction when single user was turned off in between --- CHANGELOG.md | 3 ++- lib/single-user.sh | 18 ++++++++++++++++++ lib/vapor-theme.sh | 6 +++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 388b47e..79ee9b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ one per merged pull request. - `bee18b7` **docs: the agent merges feature/bugfix branches into the release branch; the release into main stays the user's** - `501c0ba` **docs: gh or git for merging into the release branch** - `b1adacb` **docs: gh is required for the release-branch pull requests; ask the user to install it** -- **chore: the v2 app preview is gone (it is the released app): no preview pre-release step in CI, no mention in steamify-app.sh** +- `ced4a45` **chore: the v2 app preview is gone (it is the released app): no preview pre-release step in CI, no mention in steamify-app.sh** +- **fix: turning the theme off no longer brings back single user's launcher restriction when single user was turned off in between** ## 2.6.0 - 2026-09-27 diff --git a/lib/single-user.sh b/lib/single-user.sh index 8387c22..dfa6423 100644 --- a/lib/single-user.sh +++ b/lib/single-user.sh @@ -101,6 +101,24 @@ single_launcher() { done } +single_launcher_drop() { + # The theme's layout backup is taken when it's turned on: with single + # user on then, it holds single's launcher keys, and restoring it after + # single was turned off brings them back. Drop exactly single's values + # (a launcher set up differently by the user is left alone). + local applet + local -a kick_args + for applet in $(plasma_applets org.kde.plasma.kickoff); do + kick_args=(--file plasma-org.kde.plasma.desktop-appletsrc --group Containments --group "${applet%%:*}" + --group Applets --group "${applet#*:}" --group Configuration --group General) + [[ "$(kreadconfig6 "${kick_args[@]}" --key primaryActions)" == 3 ]] && + kwriteconfig6 "${kick_args[@]}" --key primaryActions --delete + [[ "$(kreadconfig6 "${kick_args[@]}" --key systemFavorites)" == 'suspend,reboot,shutdown' ]] && + kwriteconfig6 "${kick_args[@]}" --key systemFavorites --delete + done + return 0 +} + single_enable() { info "Turning off the lock screen, user switching and logging out..." stop_plasmashell_for_edit diff --git a/lib/vapor-theme.sh b/lib/vapor-theme.sh index ba0be9d..1974c4b 100644 --- a/lib/vapor-theme.sh +++ b/lib/vapor-theme.sh @@ -134,7 +134,11 @@ theme_disable() { fi # After the tools above, so keys that weren't set before are removed again. krevert theme - single_status && single_launcher + if single_status; then + single_launcher + else + single_launcher_drop + fi restart_plasmashell_if_stopped qdbus6 org.kde.KWin /KWin org.kde.KWin.reconfigure >/dev/null 2>&1 || true