mirror of
https://github.com/theupriser/steamify-cachyos.git
synced 2026-10-03 17:41:58 +02:00
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:
1 parent
443dbcdfb8
commit
321bf9bfcb
10 files changed
+159
-67
No files matched your search
@@ -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`
|
`<id>_available` is checked via `component_available` (e.g. `machine`
|
||||||
only on Fremont). Turn-on order is `COMPONENTS` order, turn-off reverse;
|
only on Fremont). Turn-on order is `COMPONENTS` order, turn-off reverse;
|
||||||
`gaming` must stay first. Dependencies live in `toggle_component`.
|
`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
|
- **Reversibility.** Every per-user KDE setting a component changes goes
|
||||||
through `kset <component> <file> <group|group> <key> <value>`
|
through `kset <component> <file> <group|group> <key> <value>`
|
||||||
(`lib/state.sh`), which records the old value once; `<id>_disable` calls
|
(`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
|
kernel only pairs that with a named lookup ("Port C") when the CEC driver
|
||||||
registered first, which never happens since amdgpu loads from the
|
registered first, which never happens since amdgpu loads from the
|
||||||
initramfs. Without it `/dev/cec0` exists but stays at `f.f.f.f`.
|
initramfs. Without it `/dev/cec0` exists but stays at `f.f.f.f`.
|
||||||
- Power-off fix (`lib/fremont-poweroff.sh`, part of `machine`): kernels
|
- Power-off fix (`poweroff`, `lib/fremont-poweroff.sh`, a default sub-option
|
||||||
>= 7.2 keep the firmware's S4/S5 wake bit on GPIO pin 18, so the Steam
|
of `machine`): kernels >= 7.2 keep the firmware's S4/S5 wake bit on GPIO
|
||||||
Machine boots again right after powering off (Valve's kernel clears it at
|
pin 18, so the Steam Machine boots again right after powering off
|
||||||
probe, not for upstream). The DKMS module `steamify-fremont-poweroff`
|
(Valve's kernel clears it at probe, not for upstream). The DKMS module
|
||||||
(`patches/steamify-fremont-poweroff.c`) clears it in a power-off-prepare
|
`steamify-fremont-poweroff` (`patches/steamify-fremont-poweroff.c`) clears
|
||||||
handler, for every kernel. It made the kernel pin optional (`kpin` is in
|
it in a power-off-prepare handler, for every kernel. It made the kernel pin
|
||||||
`NO_PRESELECT`, no longer ticked with `machine`). `machine_repair` ticks
|
unnecessary: `kpin` is only available while on (`kpin_available`), and
|
||||||
`machine` for setups without it. CachyOS's `linux-cachyos` is clang-built,
|
`detect_components` unticks it (and `hdmi`, which needs the pinned
|
||||||
`-bore` GCC-built: let DKMS pick the compiler, never pass `LLVM=1`. Test
|
kernel), so a normal run removes an existing pin. CachyOS's
|
||||||
shutdown on the real machine for every new major kernel.
|
`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
|
- `Relogin=true` means a gamescope that fails to start is relaunched in a
|
||||||
tight loop; keep that in mind when changing session handling.
|
tight loop; keep that in mind when changing session handling.
|
||||||
|
|
||||||
|
|||||||
+13
-6
@@ -12,12 +12,19 @@ one per merged pull request.
|
|||||||
shutting down: Linux 7.2 keeps the wake bit the firmware sets on GPIO
|
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
|
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
|
CachyOS. Steam Machine support now builds a small module with DKMS for
|
||||||
every kernel that clears it right before power-off. Tested with
|
every kernel that clears it right before power-off: the new **Power-off
|
||||||
CachyOS 7.2.8: stays off, and without the module it rebooted.
|
fix** sub-option, ticked along with Steam Machine support (opt-out).
|
||||||
- The kernel pin is no longer ticked with Steam Machine support or on a
|
Tested with CachyOS 7.2.8: stays off, and without the module it
|
||||||
first run; it stays available (HDMI refresh boost needs it). An
|
rebooted.
|
||||||
existing pin is kept. Steam Machine support from before 2.2.0 is
|
- The kernel pin is no longer offered. An existing pin is shown unticked,
|
||||||
ticked in the menu to add the fix.
|
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
|
- Module sources and patches live in `patches/` instead of inside the
|
||||||
shell code; the single-file build embeds them. The Steam Machine CEC
|
shell code; the single-file build embeds them. The Steam Machine CEC
|
||||||
driver change is now `patches/cros-ec-cec-single-port.patch`.
|
driver change is now `patches/cros-ec-cec-single-port.patch`.
|
||||||
|
|||||||
@@ -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
|
TV's remote, and the TV turns on and off with the Steam Machine
|
||||||
([details](TECHNICAL.md#hdmi-cec)).
|
([details](TECHNICAL.md#hdmi-cec)).
|
||||||
- **Steam Machine support** - the front **LED bar** works, Steam's
|
- **Steam Machine support** - the front **LED bar** works, Steam's
|
||||||
**hardware settings** (fan, performance) work, the power button puts it
|
**hardware settings** (fan, performance) work, and the power button puts
|
||||||
to sleep like a console, and **shutting down really turns it off**, also
|
it to sleep like a console.
|
||||||
with the newest CachyOS kernel
|
- **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)).
|
([details](TECHNICAL.md#power-off-fix-steam-machine)).
|
||||||
- **Pin the kernel to 7.1.6-1** - optional, off by default: stays on an
|
- **Pin the kernel to 7.1.6-1** - no longer offered: it was needed for
|
||||||
older kernel (HDMI refresh boost needs it). It used to be needed for
|
shutting down, which the power-off fix above covers now. An existing pin
|
||||||
shutting down; the power-off fix above covers that now. The kernel comes from its own
|
is shown unticked, so the next run removes it and brings back CachyOS's
|
||||||
[release](https://github.com/theupriser/steamify-cachyos/releases/tag/kernel-7.1.6-1),
|
current kernel ([details](TECHNICAL.md#kernel-pin-steam-machine)).
|
||||||
checked against CachyOS's signature
|
|
||||||
([details](TECHNICAL.md#kernel-pin-steam-machine)).
|
|
||||||
- **HDMI refresh boost** - only with the pinned kernel, never ticked by
|
- **HDMI refresh boost** - only with the pinned kernel, never ticked by
|
||||||
default: gets the highest refresh rate your HDMI display runs at the
|
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).
|
desktop resolution (e.g. 110 Hz instead of 60 on a 3440x1440 monitor).
|
||||||
|
|||||||
+29
-8
@@ -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
|
for upstream ("until the firmware is fixed"), so CachyOS and mainline won't
|
||||||
get it.
|
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
|
kernel, `steamify-fremont-poweroff` (source in
|
||||||
[`patches/steamify-fremont-poweroff.c`](patches/steamify-fremont-poweroff.c)).
|
[`patches/steamify-fremont-poweroff.c`](patches/steamify-fremont-poweroff.c)).
|
||||||
It only loads on Fremont (DMI board name) and touches one register: right
|
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
|
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.
|
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
|
Where Steam Machine support was set up before 2.2.0, the menu ticks the
|
||||||
ticks it, so a normal run adds it.
|
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)
|
## Kernel pin (Steam Machine)
|
||||||
|
|
||||||
With CachyOS kernels newer than 7.1.6 a Steam Machine rebooted instead of
|
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
|
shutting down; the power-off fix above handles that now. Since 2.2.0 the
|
||||||
optional. The **Pin the kernel** sub-option (off by default; HDMI refresh
|
**Pin the kernel** sub-option is no longer offered. A pin that's still
|
||||||
boost needs it) installs `linux-cachyos` and `linux-cachyos-headers`
|
there is shown unticked, so a normal run (after the review) removes it and
|
||||||
7.1.6-1 and adds them to `IgnorePkg` in `/etc/pacman.conf`, so updates skip
|
brings back CachyOS's current kernel; HDMI refresh boost, which needs the
|
||||||
them. DKMS builds the LED driver for it; restart to boot it.
|
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
|
The packages (and their signatures, which pacman checks) are kept in
|
||||||
`/var/cache/steamify/kernel`, so re-applying needs no download. Missing
|
`/var/cache/steamify/kernel`, so re-applying needs no download. Missing
|
||||||
|
|||||||
+9
-2
@@ -62,6 +62,7 @@ backend_status() {
|
|||||||
items+=",\"kind\":\"$kind\",\"parent\":$(json_str "$parent")"
|
items+=",\"kind\":\"$kind\",\"parent\":$(json_str "$parent")"
|
||||||
items+=",\"on\":$( [[ "$now" == 1 ]] && echo true || echo false)"
|
items+=",\"on\":$( [[ "$now" == 1 ]] && echo true || echo false)"
|
||||||
items+=",\"wanted\":$( [[ "${WANTED[$c]:-0}" == 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)}"
|
items+=",\"selectable\":$(component_selectable "$c" && echo true || echo false)}"
|
||||||
done
|
done
|
||||||
local cec="" f
|
local cec="" f
|
||||||
@@ -160,6 +161,8 @@ backend_apply() {
|
|||||||
# The same rules as the menu's toggles.
|
# The same rules as the menu's toggles.
|
||||||
[[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1
|
[[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1
|
||||||
[[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; }
|
[[ "${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[kpin]:-0}" == 1 ]] && WANTED[machine]=1
|
||||||
[[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0
|
[[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0
|
||||||
[[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; }
|
[[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; }
|
||||||
@@ -179,8 +182,12 @@ backend_apply() {
|
|||||||
LOGIN_MANAGER=plasmalogin
|
LOGIN_MANAGER=plasmalogin
|
||||||
[[ "${WANTED[single]}" == 1 ]] && LOGIN_MANAGER=sddm
|
[[ "${WANTED[single]}" == 1 ]] && LOGIN_MANAGER=sddm
|
||||||
local -a failed=()
|
local -a failed=()
|
||||||
for c in "${TO_DISABLE[@]}"; do backend_run_component "$c" disable || failed+=("$c"); done
|
for c in "${TO_DISABLE[@]}"; do
|
||||||
for c in "${TO_ENABLE[@]}"; do backend_run_component "$c" enable || failed+=("$c"); done
|
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
|
[[ " ${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)"
|
backend_event finished "\"failed\":$(json_list "${failed[@]}"),\"restart\":$(restart_needed && echo true || echo false)"
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-1
@@ -1,5 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/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
|
# 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
|
# 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
|
# 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 dkms remove "$POWEROFF_DKMS_NAME/$POWEROFF_DKMS_VER" --all >/dev/null 2>&1
|
||||||
sudo rm -rf "$POWEROFF_DKMS_SRC"
|
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
@@ -5,18 +5,24 @@
|
|||||||
|
|
||||||
# Menu order. Components are turned on in this order and off in reverse;
|
# Menu order. Components are turned on in this order and off in reverse;
|
||||||
# gaming must come first (single user builds on it).
|
# 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
|
# One-off actions rather than on/off components: never preselected, never
|
||||||
# re-applied, not listed as on or off.
|
# re-applied, not listed as on or off.
|
||||||
ACTIONS=(bios)
|
ACTIONS=(bios)
|
||||||
# Sub-options, shown indented under their parent and only while it's ticked.
|
# 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,
|
# 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
|
# 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,
|
# 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
|
# which has CEC like on SteamOS. HDMI refresh boost needs someone at the
|
||||||
# screen to confirm each step.
|
# screen to confirm each step.
|
||||||
NO_PRESELECT=(boot cec kpin hdmi)
|
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=(
|
declare -A LABEL=(
|
||||||
[gaming]="SteamOS conversion: boot into gaming mode, Steam on the desktop"
|
[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"
|
[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)"
|
[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"
|
[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"
|
[hdmi]="HDMI refresh boost: highest refresh your HDMI display runs"
|
||||||
[bios]="Update BIOS"
|
[bios]="Update BIOS"
|
||||||
)
|
)
|
||||||
@@ -35,7 +42,8 @@ declare -A CURRENT WANTED
|
|||||||
|
|
||||||
component_available() {
|
component_available() {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
machine|kpin) machine_available ;;
|
machine|poweroff) machine_available ;;
|
||||||
|
kpin) kpin_available ;;
|
||||||
hdmi) hdmi_available ;;
|
hdmi) hdmi_available ;;
|
||||||
bios) bios_available ;;
|
bios) bios_available ;;
|
||||||
esac
|
esac
|
||||||
@@ -56,6 +64,28 @@ menu_visible() {
|
|||||||
[[ -z "${PARENT[$1]:-}" || "${WANTED[${PARENT[$1]}]:-0}" == 1 ]]
|
[[ -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() {
|
component_selectable() {
|
||||||
# Greyed out and not tickable when it has nothing to do.
|
# Greyed out and not tickable when it has nothing to do.
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@@ -72,8 +102,15 @@ detect_components() {
|
|||||||
done
|
done
|
||||||
# HDMI-CEC set up by an older version: tick it, so a normal run fixes it.
|
# HDMI-CEC set up by an older version: tick it, so a normal run fixes it.
|
||||||
component_available cec && cec_repair && WANTED[cec]=1
|
component_available cec && cec_repair && WANTED[cec]=1
|
||||||
# Steam Machine support from before 2.2.0 lacks the power-off fix.
|
# Updated features and new default sub-options: ticked, so a normal run
|
||||||
component_available machine && machine_repair && WANTED[machine]=1
|
# 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
|
# The terminal-only Steamify shortcut from before 2.0.1: tick it, so a
|
||||||
# normal run replaces it with the app.
|
# normal run replaces it with the app.
|
||||||
launcher_repair && WANTED[launcher]=1
|
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
|
if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[single]=0; WANTED[boot]=0; fi
|
||||||
# Where to boot to is part of the conversion, too.
|
# Where to boot to is part of the conversion, too.
|
||||||
if [[ "$c" == boot && "${WANTED[boot]}" == 1 ]]; then WANTED[gaming]=1; fi
|
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" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[kpin]=0; fi
|
||||||
if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi
|
if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi
|
||||||
# HDMI refresh boost and the BIOS update sit under Steam Machine support;
|
# HDMI refresh boost and the BIOS update sit under Steam Machine support;
|
||||||
@@ -268,7 +307,7 @@ plan_changes() {
|
|||||||
component_available "$c" || continue
|
component_available "$c" || continue
|
||||||
[[ "${WANTED[$c]}" == 1 ]] || continue
|
[[ "${WANTED[$c]}" == 1 ]] || continue
|
||||||
if is_action "$c"; then TO_ENABLE+=("$c"); continue; fi
|
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
|
[[ "$c" == gaming && "${CURRENT[single]}" != "${WANTED[single]}" ]]; then
|
||||||
TO_ENABLE+=("$c")
|
TO_ENABLE+=("$c")
|
||||||
fi
|
fi
|
||||||
@@ -283,13 +322,13 @@ apply_changes() {
|
|||||||
for c in "${TO_DISABLE[@]}"; do
|
for c in "${TO_DISABLE[@]}"; do
|
||||||
if [[ "$c" == boot ]]; then echo; echo -e "${c_bold}Boot into: gamescope${c_reset}"
|
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
|
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
|
done
|
||||||
for c in "${TO_ENABLE[@]}"; do
|
for c in "${TO_ENABLE[@]}"; do
|
||||||
if [[ "$c" == boot ]]; then echo; echo -e "${c_bold}Boot into: desktop${c_reset}"
|
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}"
|
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
|
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
|
done
|
||||||
FAILED=("${failed[@]}")
|
FAILED=("${failed[@]}")
|
||||||
}
|
}
|
||||||
+6
-13
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# "Steam Machine support" menu item, only on Valve Fremont hardware: the
|
# "Steam Machine support" menu item, only on Valve Fremont hardware: the
|
||||||
# front LED bar driver, LED access for Steam, steamos-manager, and the
|
# front LED bar driver, LED access for Steam and steamos-manager. Its
|
||||||
# power-off fix (lib/fremont-poweroff.sh).
|
# sub-option "Power-off fix" is lib/fremont-poweroff.sh.
|
||||||
# Sourced by steamify.sh; not meant to be run on its own.
|
# Sourced by steamify.sh; not meant to be run on its own.
|
||||||
|
|
||||||
detect_valve_fremont() {
|
detect_valve_fremont() {
|
||||||
@@ -149,7 +149,9 @@ remove_kernel_pin() {
|
|||||||
RESTART_FOR_LOGIN=true
|
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() {
|
kpin_status() {
|
||||||
pinned_kernel_installed && grep -Eq '^IgnorePkg\s*=.*\slinux-cachyos(\s|$)' /etc/pacman.conf
|
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_available() { detect_valve_fremont; }
|
||||||
|
|
||||||
machine_status() {
|
machine_status() {
|
||||||
pacman -Qi leds-valve-dkms-git >/dev/null 2>&1 && pacman -Qi steamos-manager >/dev/null 2>&1 &&
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
machine_enable() {
|
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; }
|
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_valve_led_driver || { warn "LED driver setup ran into a problem - see errors above."; return 1; }
|
||||||
install_headers_boot_check
|
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
|
# 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
|
# in case it drives the bar directly (Valve's own privileged-write helper
|
||||||
@@ -434,7 +428,6 @@ machine_disable() {
|
|||||||
sudo udevadm control --reload
|
sudo udevadm control --reload
|
||||||
sudo modprobe -r leds-valve 2>/dev/null
|
sudo modprobe -r leds-valve 2>/dev/null
|
||||||
sudo pacman -Rns --noconfirm leds-valve-dkms-git 2>/dev/null
|
sudo pacman -Rns --noconfirm leds-valve-dkms-git 2>/dev/null
|
||||||
poweroff_fix_disable
|
|
||||||
krevert machine
|
krevert machine
|
||||||
reload_powerdevil
|
reload_powerdevil
|
||||||
sudo systemctl disable ensure-kernel-headers.service 2>/dev/null
|
sudo systemctl disable ensure-kernel-headers.service 2>/dev/null
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ while true; do
|
|||||||
for c in "${TO_ENABLE[@]}"; do
|
for c in "${TO_ENABLE[@]}"; do
|
||||||
if [[ "$c" == boot ]]; then echo " - boot into: desktop (from the next boot)"
|
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 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
|
elif [[ "${CURRENT[$c]}" == 1 ]]; then echo " - re-apply: ${LABEL[$c]}"; else echo " - turn on: ${LABEL[$c]}"; fi
|
||||||
done
|
done
|
||||||
ask_yn "Go ahead?" y || { info "Nothing changed."; continue; }
|
ask_yn "Go ahead?" y || { info "Nothing changed."; continue; }
|
||||||
|
|||||||
+13
-8
@@ -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).",
|
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"] },
|
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",
|
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.",
|
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", "Power-off fix: stays off after shutting down (DKMS)"] },
|
changes: ["leds-valve driver for every kernel (DKMS)", "steamos-manager for Steam's settings", "Console-like power handling"] },
|
||||||
kpin: { label: "Pin the kernel", hint: "Optional: stay on an older kernel",
|
poweroff: { label: "Power-off fix", hint: "Stays off after shutting down, on every 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: "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"] },
|
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",
|
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.",
|
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" && !hdmiChoice && hdmiSaved.length) { openHdmiList(); return; }
|
||||||
if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; }
|
if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; }
|
||||||
if (id === "hdmi" && !w.hdmi) hdmiChoice = "";
|
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 === "machine" && !w.machine) w.kpin = false;
|
||||||
if (id === "kpin" && w.kpin) w.machine = true;
|
if (id === "kpin" && w.kpin) w.machine = true;
|
||||||
if (id === "hdmi" && w.hdmi) { w.machine = true; w.kpin = 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 (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" });
|
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] && 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";
|
var bootNow = nowOn("boot") ? "desktop" : "gamescope";
|
||||||
if (want.gaming && boot !== bootNow) p.push({ id: "boot", action: boot === "desktop" ? "desktop" : "gaming" });
|
if (want.gaming && boot !== bootNow) p.push({ id: "boot", action: boot === "desktop" ? "desktop" : "gaming" });
|
||||||
@@ -748,7 +753,7 @@ ApplicationWindow {
|
|||||||
model: plan
|
model: plan
|
||||||
ScrollBar.vertical: ScrollBar { policy: ScrollBar.AsNeeded }
|
ScrollBar.vertical: ScrollBar { policy: ScrollBar.AsNeeded }
|
||||||
delegate: Rectangle { required property var modelData; width: 740; height: 56; radius: 12; color: t.card
|
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"],
|
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]
|
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
|
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 } }
|
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 {
|
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
|
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 }
|
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
|
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: 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 } } }
|
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 } } }
|
||||||
|
|||||||
Reference in new issue
Block a user