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.
This commit is contained in:
theupriser committed 2026-09-27 12:20:56 +02:00
1 parent 443dbcdfb8
commit 321bf9bfcb
10 files changed
+160 -68

No files matched your search

+18 -10
View File
@@ -29,6 +29,12 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
`<id>_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[<id>]` (`lib/menu.sh`) whenever
what `<id>_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 `<id>_repair` checks
for new changes.
- **Reversibility.** Every per-user KDE setting a component changes goes
through `kset <component> <file> <group|group> <key> <value>`
(`lib/state.sh`), which records the old value once; `<id>_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.
+13 -6
View File
@@ -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`.
+9 -10
View File
@@ -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).
+29 -8
View File
@@ -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 `<id>_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
+9 -2
View File
@@ -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)"
}
+13 -1
View File
@@ -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."
}
+49 -10
View File
@@ -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 <component> <enable|disable>: 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[@]}")
}
+6 -13
View File
@@ -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
+1
View File
@@ -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; }
+13 -8
View File
@@ -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 } } }