From 6df19eba3e6899f738fc448e7fbd50ddcb40de4c Mon Sep 17 00:00:00 2001 From: rickpeters Date: Sun, 27 Sep 2026 12:20:56 +0200 Subject: [PATCH] feat: Power-off fix as its own sub-option, drop the kernel pin, feature versions The power-off fix becomes an opt-out sub-option of Steam Machine support. The kernel pin is no longer offered: an existing pin (and HDMI refresh boost, which needs it) is unticked so a normal run removes it. Components record a feature version on each successful run; installs with an older version are ticked and updated, and new default sub-options are ticked where their parent is on. --- AGENTS.md | 28 ++++++++++++------- CHANGELOG.md | 19 ++++++++----- README.md | 19 +++++++------ TECHNICAL.md | 37 ++++++++++++++++++++------ lib/backend.sh | 11 ++++++-- lib/fremont-poweroff.sh | 14 +++++++++- lib/menu.sh | 59 ++++++++++++++++++++++++++++++++++------- lib/steam-machine.sh | 19 +++++-------- steamify.sh | 1 + ui/qml/Main.qml | 21 +++++++++------ 10 files changed, 160 insertions(+), 68 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d4a2f48..fded1dc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,6 +29,12 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine `_available` is checked via `component_available` (e.g. `machine` only on Fremont). Turn-on order is `COMPONENTS` order, turn-off reverse; `gaming` must stay first. Dependencies live in `toggle_component`. +- **Feature versions.** Bump `FEATURE_VERSION[]` (`lib/menu.sh`) whenever + what `_enable` sets up changes: installs recorded with an older number + are ticked and re-applied ("update" in the plan and the app). New default + sub-options are ticked for installs whose parent is on (`feature_new`). + Status still comes from the system; don't add ad-hoc `_repair` checks + for new changes. - **Reversibility.** Every per-user KDE setting a component changes goes through `kset ` (`lib/state.sh`), which records the old value once; `_disable` calls @@ -208,16 +214,18 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine kernel only pairs that with a named lookup ("Port C") when the CEC driver registered first, which never happens since amdgpu loads from the initramfs. Without it `/dev/cec0` exists but stays at `f.f.f.f`. -- Power-off fix (`lib/fremont-poweroff.sh`, part of `machine`): kernels - >= 7.2 keep the firmware's S4/S5 wake bit on GPIO pin 18, so the Steam - Machine boots again right after powering off (Valve's kernel clears it at - probe, not for upstream). The DKMS module `steamify-fremont-poweroff` - (`patches/steamify-fremont-poweroff.c`) clears it in a power-off-prepare - handler, for every kernel. It made the kernel pin optional (`kpin` is in - `NO_PRESELECT`, no longer ticked with `machine`). `machine_repair` ticks - `machine` for setups without it. CachyOS's `linux-cachyos` is clang-built, - `-bore` GCC-built: let DKMS pick the compiler, never pass `LLVM=1`. Test - shutdown on the real machine for every new major kernel. +- Power-off fix (`poweroff`, `lib/fremont-poweroff.sh`, a default sub-option + of `machine`): kernels >= 7.2 keep the firmware's S4/S5 wake bit on GPIO + pin 18, so the Steam Machine boots again right after powering off + (Valve's kernel clears it at probe, not for upstream). The DKMS module + `steamify-fremont-poweroff` (`patches/steamify-fremont-poweroff.c`) clears + it in a power-off-prepare handler, for every kernel. It made the kernel pin + unnecessary: `kpin` is only available while on (`kpin_available`), and + `detect_components` unticks it (and `hdmi`, which needs the pinned + kernel), so a normal run removes an existing pin. CachyOS's + `linux-cachyos` is clang-built, `-bore` GCC-built: let DKMS pick the + compiler, never pass `LLVM=1`. Test shutdown on the real machine for every + new major kernel. - `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 9d3d223..823903f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,19 @@ one per merged pull request. shutting down: Linux 7.2 keeps the wake bit the firmware sets on GPIO pin 18, which Valve's own kernel clears in a patch that won't reach CachyOS. Steam Machine support now builds a small module with DKMS for - every kernel that clears it right before power-off. Tested with - CachyOS 7.2.8: stays off, and without the module it rebooted. - - The kernel pin is no longer ticked with Steam Machine support or on a - first run; it stays available (HDMI refresh boost needs it). An - existing pin is kept. Steam Machine support from before 2.2.0 is - ticked in the menu to add the fix. + every kernel that clears it right before power-off: the new **Power-off + fix** sub-option, ticked along with Steam Machine support (opt-out). + Tested with CachyOS 7.2.8: stays off, and without the module it + rebooted. + - The kernel pin is no longer offered. An existing pin is shown unticked, + so the next run removes it and brings back CachyOS's current kernel; + HDMI refresh boost, which needs the pinned kernel, goes with it (newer + kernels do HDMI 2.1 themselves). + - Feature versions: each component records the version of what it set + up; when a release changes a component, installs with an older version + are ticked and updated by a normal run ("update" in the plan and the + app), and new default sub-options (like the power-off fix) are ticked + where their parent is on. - Module sources and patches live in `patches/` instead of inside the shell code; the single-file build embeds them. The Steam Machine CEC driver change is now `patches/cros-ec-cec-single-port.patch`. diff --git a/README.md b/README.md index f918868..e1fff15 100644 --- a/README.md +++ b/README.md @@ -43,16 +43,15 @@ What Steamify can do on a Valve Steam Machine: TV's remote, and the TV turns on and off with the Steam Machine ([details](TECHNICAL.md#hdmi-cec)). - **Steam Machine support** - the front **LED bar** works, Steam's - **hardware settings** (fan, performance) work, the power button puts it - to sleep like a console, and **shutting down really turns it off**, also - with the newest CachyOS kernel - ([details](TECHNICAL.md#power-off-fix-steam-machine)). - - **Pin the kernel to 7.1.6-1** - optional, off by default: stays on an - older kernel (HDMI refresh boost needs it). It used to be needed for - shutting down; the power-off fix above covers that now. The kernel comes from its own - [release](https://github.com/theupriser/steamify-cachyos/releases/tag/kernel-7.1.6-1), - checked against CachyOS's signature - ([details](TECHNICAL.md#kernel-pin-steam-machine)). + **hardware settings** (fan, performance) work, and the power button puts + it to sleep like a console. + - **Power-off fix** - on by default: shutting down really turns the Steam + Machine off, also with the newest CachyOS kernel + ([details](TECHNICAL.md#power-off-fix-steam-machine)). + - **Pin the kernel to 7.1.6-1** - no longer offered: it was needed for + shutting down, which the power-off fix above covers now. An existing pin + is shown unticked, so the next run removes it and brings back CachyOS's + current kernel ([details](TECHNICAL.md#kernel-pin-steam-machine)). - **HDMI refresh boost** - only with the pinned kernel, never ticked by default: gets the highest refresh rate your HDMI display runs at the desktop resolution (e.g. 110 Hz instead of 60 on a 3440x1440 monitor). diff --git a/TECHNICAL.md b/TECHNICAL.md index 22a2255..96e227c 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -218,7 +218,8 @@ that bit set on GPIO pin 18 (`_SB.PCI0.GPP6`). Valve's own kernel for upstream ("until the firmware is fixed"), so CachyOS and mainline won't get it. -Steam Machine support builds a small module with DKMS for every installed +The **Power-off fix** sub-option of Steam Machine support (ticked along with +it, can be unticked) builds a small module with DKMS for every installed kernel, `steamify-fremont-poweroff` (source in [`patches/steamify-fremont-poweroff.c`](patches/steamify-fremont-poweroff.c)). It only loads on Fremont (DMI board name) and touches one register: right @@ -229,17 +230,37 @@ that already clears it, it does nothing. It logs the pin's state at load: Tested on a Steam Machine with `linux-cachyos-bore` 7.2.8: it stayed off three times in a row, and rebooted right away with the module unloaded. -Steam Machine support set up before 2.2.0 has no power-off fix; the menu -ticks it, so a normal run adds it. +Where Steam Machine support was set up before 2.2.0, the menu ticks the +power-off fix as a new default sub-option (see feature versions below), so a +normal run adds it. + +## Feature versions (updates) + +Each component has a feature version (`FEATURE_VERSION` in `lib/menu.sh`, +1 when not listed). After a component is turned on successfully, the version +is recorded in `~/.local/state/cachyos-gamescope-boot/features.state` +(turning it off records `off`). Whether a component is on is always checked +on the system itself; the version only decides about updates: + +- **On, recorded version older** than the current one: ticked and + re-applied by a normal run; the plan (and the app's review) says + "update". A setup from before versions were recorded counts as 1. +- **A new default sub-option** (not in `NO_PRESELECT`) whose parent is on + and that was never turned on or off: ticked, so a normal run adds it. + Turning it off once records `off`, so it isn't ticked again. + +Bump a component's number whenever what its `_enable` sets up changes. ## Kernel pin (Steam Machine) With CachyOS kernels newer than 7.1.6 a Steam Machine rebooted instead of -shutting down; the power-off fix above handles that now, so the pin is -optional. The **Pin the kernel** sub-option (off by default; HDMI refresh -boost needs it) installs `linux-cachyos` and `linux-cachyos-headers` -7.1.6-1 and adds them to `IgnorePkg` in `/etc/pacman.conf`, so updates skip -them. DKMS builds the LED driver for it; restart to boot it. +shutting down; the power-off fix above handles that now. Since 2.2.0 the +**Pin the kernel** sub-option is no longer offered. A pin that's still +there is shown unticked, so a normal run (after the review) removes it and +brings back CachyOS's current kernel; HDMI refresh boost, which needs the +pinned kernel, is unticked with it. The pin installed `linux-cachyos` and +`linux-cachyos-headers` 7.1.6-1 and added them to `IgnorePkg` in +`/etc/pacman.conf`, so updates skipped them. The packages (and their signatures, which pacman checks) are kept in `/var/cache/steamify/kernel`, so re-applying needs no download. Missing diff --git a/lib/backend.sh b/lib/backend.sh index 776d91c..da6e867 100644 --- a/lib/backend.sh +++ b/lib/backend.sh @@ -62,6 +62,7 @@ backend_status() { items+=",\"kind\":\"$kind\",\"parent\":$(json_str "$parent")" items+=",\"on\":$( [[ "$now" == 1 ]] && echo true || echo false)" items+=",\"wanted\":$( [[ "${WANTED[$c]:-0}" == 1 ]] && echo true || echo false)" + items+=",\"update\":$(feature_outdated "$c" && echo true || echo false)" items+=",\"selectable\":$(component_selectable "$c" && echo true || echo false)}" done local cec="" f @@ -160,6 +161,8 @@ backend_apply() { # The same rules as the menu's toggles. [[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1 [[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; } + [[ "${WANTED[poweroff]:-0}" == 1 ]] && WANTED[machine]=1 + [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[poweroff]=0 [[ "${WANTED[kpin]:-0}" == 1 ]] && WANTED[machine]=1 [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0 [[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; } @@ -179,8 +182,12 @@ backend_apply() { LOGIN_MANAGER=plasmalogin [[ "${WANTED[single]}" == 1 ]] && LOGIN_MANAGER=sddm local -a failed=() - for c in "${TO_DISABLE[@]}"; do backend_run_component "$c" disable || failed+=("$c"); done - for c in "${TO_ENABLE[@]}"; do backend_run_component "$c" enable || failed+=("$c"); done + for c in "${TO_DISABLE[@]}"; do + if backend_run_component "$c" disable; then feature_record "$c" disable; else failed+=("$c"); fi + done + for c in "${TO_ENABLE[@]}"; do + if backend_run_component "$c" enable; then is_action "$c" || feature_record "$c" enable; else failed+=("$c"); fi + done [[ " ${TO_DISABLE[*]} ${TO_ENABLE[*]} " =~ \ (gaming|single|boot|kpin)\ ]] && RESTART_FOR_LOGIN=true backend_event finished "\"failed\":$(json_list "${failed[@]}"),\"restart\":$(restart_needed && echo true || echo false)" } diff --git a/lib/fremont-poweroff.sh b/lib/fremont-poweroff.sh index 991dbba..6c49c46 100644 --- a/lib/fremont-poweroff.sh +++ b/lib/fremont-poweroff.sh @@ -1,5 +1,6 @@ #!/bin/bash -# Part of "Steam Machine support": the Steam Machine powers off instead of +# "Power-off fix" menu item (poweroff), a sub-option of Steam Machine support +# ticked along with it (opt-out): the Steam Machine powers off instead of # booting up again, on every kernel. Since Linux 7.2 ("pinctrl-amd: Don't # clear S4 wake bits at probe") the S4/S5 wake bit the firmware leaves set # on GPIO pin 18 stays set, and the machine starts again right after @@ -55,3 +56,14 @@ poweroff_fix_disable() { sudo dkms remove "$POWEROFF_DKMS_NAME/$POWEROFF_DKMS_VER" --all >/dev/null 2>&1 sudo rm -rf "$POWEROFF_DKMS_SRC" } + +poweroff_status() { poweroff_fix_installed; } +poweroff_enable() { + info "Installing the power-off fix (the machine stays off after shutting down)..." + poweroff_fix_enable || { err "Installing the power-off fix failed."; return 1; } + ok "Power-off fix on: the Steam Machine stays off after shutting down." +} +poweroff_disable() { + poweroff_fix_disable + ok "Power-off fix removed; with kernels 7.2 and newer the Steam Machine may start again after shutting down." +} diff --git a/lib/menu.sh b/lib/menu.sh index b3f4aaa..e46311a 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -5,18 +5,24 @@ # Menu order. Components are turned on in this order and off in reverse; # gaming must come first (single user builds on it). -COMPONENTS=(gaming boot theme glyphs single launcher cec machine kpin hdmi bios) +COMPONENTS=(gaming boot theme glyphs single launcher cec machine poweroff kpin hdmi bios) # One-off actions rather than on/off components: never preselected, never # re-applied, not listed as on or off. ACTIONS=(bios) # Sub-options, shown indented under their parent and only while it's ticked. -declare -A PARENT=([boot]=gaming [kpin]=machine [hdmi]=machine [bios]=machine) +declare -A PARENT=([boot]=gaming [poweroff]=machine [kpin]=machine [hdmi]=machine [bios]=machine) # Never preselected on a first run: booting into the desktop is a choice, # gamescope is the default; HDMI-CEC is opt-in (it can wake the machine or # upset other devices on the TV, even on SteamOS), except on a Steam Machine, # which has CEC like on SteamOS. HDMI refresh boost needs someone at the # screen to confirm each step. NO_PRESELECT=(boot cec kpin hdmi) +# Feature versions: bump a component's number whenever what its enable sets +# up changes. Each successful run records the number (state "features"); a +# component that's on with an older number is ticked and re-applied by a +# normal run, and the app shows it as an update. Unlisted = 1, and so is a +# setup from before these were recorded. +declare -A FEATURE_VERSION=() declare -A LABEL=( [gaming]="SteamOS conversion: boot into gaming mode, Steam on the desktop" @@ -27,7 +33,8 @@ declare -A LABEL=( [launcher]="Steamify shortcut: the app on the desktop, Steamify Terminal in the launcher" [cec]="HDMI-CEC: use Steam with the TV remote, TV on/off with the PC (experimental)" [machine]="Steam Machine support: LED bar driver, hardware settings in Steam" - [kpin]="Pin the kernel to $PINNED_KERNEL_VER (optional, stays on an older kernel)" + [poweroff]="Power-off fix: stays off after shutting down, on every kernel" + [kpin]="Pin the kernel to $PINNED_KERNEL_VER (no longer needed: untick for CachyOS's current kernel)" [hdmi]="HDMI refresh boost: highest refresh your HDMI display runs" [bios]="Update BIOS" ) @@ -35,7 +42,8 @@ declare -A CURRENT WANTED component_available() { case "$1" in - machine|kpin) machine_available ;; + machine|poweroff) machine_available ;; + kpin) kpin_available ;; hdmi) hdmi_available ;; bios) bios_available ;; esac @@ -56,6 +64,28 @@ menu_visible() { [[ -z "${PARENT[$1]:-}" || "${WANTED[${PARENT[$1]}]:-0}" == 1 ]] } +feature_record() { + # feature_record : after a successful run. + if [[ "$2" == enable ]]; then state_set features "$1" "${FEATURE_VERSION[$1]:-1}" + else state_set features "$1" off; fi +} + +feature_outdated() { + # On, but set up by an older version of that feature. + local have + [[ "${CURRENT[$1]:-0}" == 1 ]] || return 1 + have="$(state_get features "$1" 1)" + [[ "$have" =~ ^[0-9]+$ ]] && (( have < ${FEATURE_VERSION[$1]:-1} )) +} + +feature_new() { + # A default sub-option added after its parent was set up (e.g. the + # power-off fix under Steam Machine support): never turned on or off. + [[ -n "${PARENT[$1]:-}" && "${CURRENT[${PARENT[$1]}]:-0}" == 1 && "${CURRENT[$1]:-0}" == 0 ]] && + ! is_action "$1" && [[ " ${NO_PRESELECT[*]} " != *" $1 "* ]] && + [[ -z "$(state_get features "$1")" ]] +} + component_selectable() { # Greyed out and not tickable when it has nothing to do. case "$1" in @@ -72,8 +102,15 @@ detect_components() { done # HDMI-CEC set up by an older version: tick it, so a normal run fixes it. component_available cec && cec_repair && WANTED[cec]=1 - # Steam Machine support from before 2.2.0 lacks the power-off fix. - component_available machine && machine_repair && WANTED[machine]=1 + # Updated features and new default sub-options: ticked, so a normal run + # applies them. + for c in "${COMPONENTS[@]}"; do + component_available "$c" || continue + { feature_outdated "$c" || feature_new "$c"; } && WANTED[$c]=1 + done + # The kernel pin is no longer needed (the power-off fix): drop it, and + # HDMI refresh boost, which needs it, on a normal run. + if component_available kpin; then WANTED[kpin]=0; WANTED[hdmi]=0; fi # The terminal-only Steamify shortcut from before 2.0.1: tick it, so a # normal run replaces it with the app. launcher_repair && WANTED[launcher]=1 @@ -98,7 +135,9 @@ toggle_component() { if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[single]=0; WANTED[boot]=0; fi # Where to boot to is part of the conversion, too. if [[ "$c" == boot && "${WANTED[boot]}" == 1 ]]; then WANTED[gaming]=1; fi - # The kernel pin is opt-in (the power-off fix made it optional). + # The power-off fix is opt-out: ticked along with Steam Machine support. + if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; fi + if [[ "$c" == poweroff && "${WANTED[poweroff]}" == 1 ]]; then WANTED[machine]=1; fi if [[ "$c" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[kpin]=0; fi if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi # HDMI refresh boost and the BIOS update sit under Steam Machine support; @@ -268,7 +307,7 @@ plan_changes() { component_available "$c" || continue [[ "${WANTED[$c]}" == 1 ]] || continue if is_action "$c"; then TO_ENABLE+=("$c"); continue; fi - if [[ "${CURRENT[$c]}" == 0 || "$REAPPLY" == true ]] || + if [[ "${CURRENT[$c]}" == 0 || "$REAPPLY" == true ]] || feature_outdated "$c" || [[ "$c" == gaming && "${CURRENT[single]}" != "${WANTED[single]}" ]]; then TO_ENABLE+=("$c") fi @@ -283,13 +322,13 @@ apply_changes() { for c in "${TO_DISABLE[@]}"; do if [[ "$c" == boot ]]; then echo; echo -e "${c_bold}Boot into: gamescope${c_reset}" else echo; echo -e "${c_bold}Turning off: ${LABEL[$c]}${c_reset}"; fi - "${c}_disable" || failed+=("$c") + if "${c}_disable"; then feature_record "$c" disable; else failed+=("$c"); fi done for c in "${TO_ENABLE[@]}"; do if [[ "$c" == boot ]]; then echo; echo -e "${c_bold}Boot into: desktop${c_reset}" elif is_action "$c"; then echo; echo -e "${c_bold}Running: ${LABEL[$c]%%:*}${c_reset}" else echo; echo -e "${c_bold}Turning on: ${LABEL[$c]}${c_reset}"; fi - "${c}_enable" || failed+=("$c") + if "${c}_enable"; then is_action "$c" || feature_record "$c" enable; else failed+=("$c"); fi done FAILED=("${failed[@]}") } diff --git a/lib/steam-machine.sh b/lib/steam-machine.sh index 8f3d7e7..f47ab42 100644 --- a/lib/steam-machine.sh +++ b/lib/steam-machine.sh @@ -1,7 +1,7 @@ #!/bin/bash # "Steam Machine support" menu item, only on Valve Fremont hardware: the -# front LED bar driver, LED access for Steam, steamos-manager, and the -# power-off fix (lib/fremont-poweroff.sh). +# front LED bar driver, LED access for Steam and steamos-manager. Its +# sub-option "Power-off fix" is lib/fremont-poweroff.sh. # Sourced by steamify.sh; not meant to be run on its own. detect_valve_fremont() { @@ -149,7 +149,9 @@ remove_kernel_pin() { RESTART_FOR_LOGIN=true } -# "Pin the kernel" menu item, a sub-option of Steam Machine support. +# "Pin the kernel" menu item, a sub-option of Steam Machine support. The +# power-off fix made it unnecessary: only shown while on, to remove it. +kpin_available() { detect_valve_fremont && kpin_status; } kpin_status() { pinned_kernel_installed && grep -Eq '^IgnorePkg\s*=.*\slinux-cachyos(\s|$)' /etc/pacman.conf } @@ -371,13 +373,7 @@ kernel_overview() { machine_available() { detect_valve_fremont; } machine_status() { - pacman -Qi leds-valve-dkms-git >/dev/null 2>&1 && pacman -Qi steamos-manager >/dev/null 2>&1 && - poweroff_fix_installed -} -# Set up before 2.2.0: no power-off fix yet; the menu ticks it to add it. -machine_repair() { - pacman -Qi leds-valve-dkms-git >/dev/null 2>&1 && pacman -Qi steamos-manager >/dev/null 2>&1 && - ! poweroff_fix_installed + pacman -Qi leds-valve-dkms-git >/dev/null 2>&1 && pacman -Qi steamos-manager >/dev/null 2>&1 } machine_enable() { @@ -389,8 +385,6 @@ machine_enable() { ensure_aur_helper || { warn "Couldn't set up an AUR helper automatically. Install yay or paru, then run the wizard again."; return 1; } install_valve_led_driver || { warn "LED driver setup ran into a problem - see errors above."; return 1; } install_headers_boot_check - info "Installing the power-off fix (the machine stays off after shutting down)..." - poweroff_fix_enable || { err "Installing the power-off fix failed."; return 1; } # The LED files are root-only. Steam runs as the user; let it write them # in case it drives the bar directly (Valve's own privileged-write helper @@ -434,7 +428,6 @@ machine_disable() { sudo udevadm control --reload sudo modprobe -r leds-valve 2>/dev/null sudo pacman -Rns --noconfirm leds-valve-dkms-git 2>/dev/null - poweroff_fix_disable krevert machine reload_powerdevil sudo systemctl disable ensure-kernel-headers.service 2>/dev/null diff --git a/steamify.sh b/steamify.sh index dd87858..ea40854 100755 --- a/steamify.sh +++ b/steamify.sh @@ -139,6 +139,7 @@ while true; do for c in "${TO_ENABLE[@]}"; do if [[ "$c" == boot ]]; then echo " - boot into: desktop (from the next boot)" elif is_action "$c"; then echo " - run: ${LABEL[$c]%%:*} at your own risk (checks, then asks twice more)" + elif feature_outdated "$c"; then echo " - update: ${LABEL[$c]} (changed in this version)" elif [[ "${CURRENT[$c]}" == 1 ]]; then echo " - re-apply: ${LABEL[$c]}"; else echo " - turn on: ${LABEL[$c]}"; fi done ask_yn "Go ahead?" y || { info "Nothing changed."; continue; } diff --git a/ui/qml/Main.qml b/ui/qml/Main.qml index 94a04b5..16781f9 100644 --- a/ui/qml/Main.qml +++ b/ui/qml/Main.qml @@ -67,10 +67,13 @@ ApplicationWindow { body: "Use Steam with your TV remote, and the TV turns on and off with the PC. Turn on CEC on the TV too (Sony: BRAVIA Sync, Samsung: Anynet+, LG: SimpLink).", changes: ["Valve's cecd and cec-audio-control", "HDMI CEC section in Steam's Display settings", "Volume buttons for the TV in the Quick Access menu"] }, machine: { label: "Steam Machine support", hint: "LED bar, fan and performance settings in Steam", - body: "The front LED bar works, Steam's hardware settings work, the power button puts it to sleep like a console, and shutting down really turns it off on every kernel.", - changes: ["leds-valve driver for every kernel (DKMS)", "steamos-manager for Steam's settings", "Console-like power handling", "Power-off fix: stays off after shutting down (DKMS)"] }, - kpin: { label: "Pin the kernel", hint: "Optional: stay on an older kernel", - body: "Keeps the Steam Machine on CachyOS kernel 7.1.6. Not needed for shutting down any more (Steam Machine support fixes that on every kernel); HDMI refresh boost needs it, since newer kernels do HDMI 2.1 themselves.", + body: "The front LED bar works, Steam's hardware settings work, and the power button puts it to sleep like a console.", + changes: ["leds-valve driver for every kernel (DKMS)", "steamos-manager for Steam's settings", "Console-like power handling"] }, + poweroff: { label: "Power-off fix", hint: "Stays off after shutting down, on every kernel", + body: "With kernels 7.2 and newer the Steam Machine starts again right after shutting down: the firmware leaves a wake bit set that newer kernels keep. Valve's own kernel clears it; this small module does the same right before power-off, for every CachyOS kernel.", + changes: ["steamify-fremont-poweroff module for every kernel (DKMS)", "Only on a Steam Machine, only touches that one wake bit", "Off: kernels 7.2 and newer may start it again after shutting down"] }, + kpin: { label: "Pin the kernel", hint: "No longer needed: untick for the current kernel", + body: "Keeps the Steam Machine on CachyOS kernel 7.1.6, which older versions of Steamify needed to shut down properly. Steam Machine support now fixes that on every kernel. Untick it to go back to CachyOS's current kernel (HDMI refresh boost goes with it: newer kernels read the display's fast modes and do HDMI 2.1 themselves).", changes: ["linux-cachyos from Steamify's release (signature checked)", "Kept in /var/cache/steamify/kernel", "Added to IgnorePkg"] }, hdmi: { label: "HDMI refresh boost", hint: "Higher refresh rates over HDMI", body: "The pinned kernel keeps many HDMI displays at 60 Hz. Turning this on shows which refresh rates your display can run at the desktop resolution; you pick them, and each one is tried for 15 seconds so you can check the picture before it's installed.", @@ -247,6 +250,8 @@ ApplicationWindow { if (id === "hdmi" && !hdmiChoice && hdmiSaved.length) { openHdmiList(); return; } if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; } if (id === "hdmi" && !w.hdmi) hdmiChoice = ""; + if (id === "machine") w.poweroff = w.machine; + if (id === "poweroff" && w.poweroff) w.machine = true; if (id === "machine" && !w.machine) w.kpin = false; if (id === "kpin" && w.kpin) w.machine = true; if (id === "hdmi" && w.hdmi) { w.machine = true; w.kpin = true; } @@ -261,7 +266,7 @@ ApplicationWindow { if (it.parent && !want[it.parent]) { if (it.on) p.push({ id: it.id, action: "off" }); continue; } if (want[it.id] && !it.on) p.push({ id: it.id, action: "on" }); else if (!want[it.id] && it.on) p.push({ id: it.id, action: "off" }); - else if (want[it.id] && reapply) p.push({ id: it.id, action: "again" }); + else if (want[it.id] && (reapply || it.update)) p.push({ id: it.id, action: reapply ? "again" : "update" }); } var bootNow = nowOn("boot") ? "desktop" : "gamescope"; if (want.gaming && boot !== bootNow) p.push({ id: "boot", action: boot === "desktop" ? "desktop" : "gaming" }); @@ -748,7 +753,7 @@ ApplicationWindow { model: plan ScrollBar.vertical: ScrollBar { policy: ScrollBar.AsNeeded } delegate: Rectangle { required property var modelData; width: 740; height: 56; radius: 12; color: t.card - readonly property var st: ({ on: ["Turn on", t.good, t.goodBg], off: ["Turn off", t.bad, t.badBg], again: ["Re-apply", "#7cc4ff", "#1b2b40"], + readonly property var st: ({ on: ["Turn on", t.good, t.goodBg], off: ["Turn off", t.bad, t.badBg], again: ["Re-apply", "#7cc4ff", "#1b2b40"], update: ["Update", t.warn, t.warnBg], desktop: ["Desktop", "#7cc4ff", "#1b2b40"], gaming: ["Gaming", "#7cc4ff", "#1b2b40"], check: ["Check", t.warn, t.warnBg], flash: ["Flash", t.bad, t.badBg] })[modelData.action] || ["", t.text, t.card] Row { anchors.fill: parent; anchors.leftMargin: 18; spacing: 14 @@ -761,10 +766,10 @@ ApplicationWindow { Text { anchors.verticalCenter: parent.verticalCenter; x: 18; text: "Your password is asked once. Changes to how the PC starts need a restart."; color: t.soft; font.family: t.body; font.pixelSize: 14 } } } Rectangle { - x: parent.width - 468; y: 32; width: 428; height: 210; radius: 16; color: t.card + x: parent.width - 468; y: 32; width: 428; height: 250; radius: 16; color: t.card Column { anchors.fill: parent; anchors.margins: 24; spacing: 12 Text { text: "SUMMARY"; color: t.faint; font.family: t.body; font.pixelSize: 12; font.weight: Font.DemiBold; font.letterSpacing: 0.8 } - Repeater { model: [["Turn on", "on"], ["Re-apply", "again"], ["Turn off", "off"]] + Repeater { model: [["Turn on", "on"], ["Update", "update"], ["Re-apply", "again"], ["Turn off", "off"]] Row { required property var modelData; width: 380 Text { text: parent.modelData[0]; color: t.soft; font.family: t.body; font.pixelSize: 15; width: 300 } Text { text: plan.filter(function (p) { return p.action === parent.modelData[1]; }).length; color: t.text; font.family: t.mono; font.pixelSize: 15; width: 80; horizontalAlignment: Text.AlignRight } } }