Compare commits

...

15 Commits

Author SHA1 Message Date
Denis Benato
e512d0e2a0 fix: do not fail when attributes are unavailable 2026-02-01 16:55:38 +01:00
Denis Benato
8161005096 fix: refresh ppt sliders when power profile gets changed 2026-02-01 16:50:45 +01:00
Denis Benato
ad073c10ff Chore: restore GPU WIP page 2026-01-28 03:57:37 +01:00
Denis Benato
475f321100 Release: 6.3.2 2026-01-28 03:54:09 +01:00
Denis Benato
6330b6b3b0 fix: hide WIP GPU code 2026-01-28 03:48:27 +01:00
Denis Benato
99ec1e8bcf feat: improve the UI 2026-01-27 01:42:19 +01:00
Denis Benato
c2a3310891 fix: move keyboard power 2026-01-27 01:09:02 +01:00
Denis Benato
024d41727f feat: support TUF lighting power 2026-01-26 22:38:07 +01:00
Denis Benato
7d55a2675b feat: reorder CLI parameters 2026-01-26 20:49:41 +01:00
Denis Benato
37fad1741e fix: name the correct power profile 2026-01-26 02:49:30 +01:00
Denis Benato
8867749e0e feat: improve GPU selection 2026-01-26 00:28:26 +01:00
Denis Benato
d890461777 Merge branch 'devel' into 'devel'
feat: add pulse mode to G835L and format file

See merge request asus-linux/asusctl!252
2026-01-24 20:12:56 +00:00
Denis Benato
bcdbc45931 feat: make notifications disappear after 5 seconds from last action 2026-01-24 21:10:44 +01:00
Ghoul
b97242981c feat: add pulse to G835L LED modes 2026-01-24 22:48:48 +05:00
Denis Benato
1d10f99e77 chore: updated CHANGELOG.md 2026-01-24 18:06:18 +01:00
19 changed files with 578 additions and 365 deletions

View File

@@ -1,5 +1,10 @@
# Changelog
## [Unreleased]
### Changes
- Fix PPT sliders not updating
## [6.3.2]
### Changes
@@ -7,6 +12,8 @@
- Improve firmware attributes handling
- Very good looking UI restyling from @shevchenko0013
- Added support for GA402NV matrix: thanks @Ghoul4500
- Fixed aura CLI interface
- Fixed LEDs handling in rogcc
## [6.3.1]

260
Cargo.lock generated
View File

@@ -212,7 +212,7 @@ dependencies = [
[[package]]
name = "asusctl"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"argh",
"dmi_id",
@@ -232,7 +232,7 @@ dependencies = [
[[package]]
name = "asusd"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"cargo-husky",
"concat-idents",
@@ -259,7 +259,7 @@ dependencies = [
[[package]]
name = "asusd-user"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"config-traits",
"dirs",
@@ -488,7 +488,7 @@ dependencies = [
"num-traits",
"pastey 0.1.1",
"rayon",
"thiserror 2.0.17",
"thiserror 2.0.18",
"v_frame",
"y4m",
]
@@ -816,9 +816,9 @@ checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad"
[[package]]
name = "cc"
version = "1.2.53"
version = "1.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932"
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -938,7 +938,7 @@ dependencies = [
[[package]]
name = "config-traits"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"log",
"ron",
@@ -987,7 +987,7 @@ dependencies = [
[[package]]
name = "const-field-offset"
version = "0.1.5"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"const-field-offset-macro",
"field-offset",
@@ -996,7 +996,7 @@ dependencies = [
[[package]]
name = "const-field-offset-macro"
version = "0.1.5"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"proc-macro2",
"quote",
@@ -1036,16 +1036,6 @@ dependencies = [
"libc",
]
[[package]]
name = "core-foundation"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
@@ -1059,7 +1049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
dependencies = [
"bitflags 1.3.2",
"core-foundation 0.9.4",
"core-foundation",
"core-graphics-types",
"foreign-types",
"libc",
@@ -1072,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
dependencies = [
"bitflags 1.3.2",
"core-foundation 0.9.4",
"core-foundation",
"libc",
]
@@ -1274,7 +1264,7 @@ dependencies = [
[[package]]
name = "dmi_id"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"log",
"udev 0.8.0",
@@ -1422,9 +1412,9 @@ checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
[[package]]
name = "euclid"
version = "0.22.11"
version = "0.22.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48"
checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63"
dependencies = [
"num-traits",
]
@@ -1502,9 +1492,9 @@ dependencies = [
[[package]]
name = "femtovg"
version = "0.19.3"
version = "0.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be5d925785ad33d7b0ae2b445d9f157c3ab42ff3c515fff0b46d53d4a86c43c5"
checksum = "a125295d4de2b2473e731c4612599ba3cdf7e05af6bba16f324ba8ffbf093436"
dependencies = [
"bitflags 2.10.0",
"bytemuck",
@@ -1533,14 +1523,13 @@ dependencies = [
[[package]]
name = "filetime"
version = "0.2.26"
version = "0.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed"
checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db"
dependencies = [
"cfg-if",
"libc",
"libredox",
"windows-sys 0.60.2",
]
[[package]]
@@ -1631,7 +1620,7 @@ dependencies = [
"objc2-core-text",
"objc2-foundation 0.3.2",
"read-fonts",
"roxmltree 0.21.1",
"roxmltree",
"smallvec",
"windows 0.58.0",
"windows-core 0.58.0",
@@ -1870,16 +1859,6 @@ dependencies = [
"weezl",
]
[[package]]
name = "gif"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b"
dependencies = [
"color_quant",
"weezl",
]
[[package]]
name = "gif"
version = "0.14.1"
@@ -2237,7 +2216,7 @@ dependencies = [
"hyper",
"libc",
"pin-project-lite",
"socket2 0.6.1",
"socket2 0.6.2",
"tokio",
"tower-service",
"tracing",
@@ -2246,7 +2225,7 @@ dependencies = [
[[package]]
name = "i-slint-backend-linuxkms"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"calloop 0.14.3",
"drm",
@@ -2264,7 +2243,7 @@ dependencies = [
[[package]]
name = "i-slint-backend-selector"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"cfg-if",
"i-slint-backend-linuxkms",
@@ -2277,7 +2256,7 @@ dependencies = [
[[package]]
name = "i-slint-backend-winit"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"block2 0.6.2",
"cfg-if",
@@ -2316,7 +2295,7 @@ dependencies = [
[[package]]
name = "i-slint-common"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"fontique",
"ttf-parser 0.25.1",
@@ -2325,7 +2304,7 @@ dependencies = [
[[package]]
name = "i-slint-compiler"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"annotate-snippets",
"by_address",
@@ -2353,7 +2332,7 @@ dependencies = [
[[package]]
name = "i-slint-core"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"auto_enums",
"bitflags 2.10.0",
@@ -2388,7 +2367,7 @@ dependencies = [
"slab",
"strum",
"sys-locale",
"thiserror 2.0.17",
"thiserror 2.0.18",
"unicode-linebreak",
"unicode-script",
"unicode-segmentation",
@@ -2396,13 +2375,12 @@ dependencies = [
"wasm-bindgen",
"web-sys",
"web-time",
"webbrowser",
]
[[package]]
name = "i-slint-core-macros"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"quote",
"serde_json",
@@ -2412,7 +2390,7 @@ dependencies = [
[[package]]
name = "i-slint-renderer-femtovg"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"cfg-if",
"const-field-offset",
@@ -2434,7 +2412,7 @@ dependencies = [
[[package]]
name = "i-slint-renderer-skia"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"bytemuck",
"cfg-if",
@@ -2469,7 +2447,7 @@ dependencies = [
[[package]]
name = "i-slint-renderer-software"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"bytemuck",
"clru",
@@ -2633,7 +2611,7 @@ dependencies = [
"rgb",
"tiff",
"zune-core 0.5.1",
"zune-jpeg 0.5.9",
"zune-jpeg 0.5.11",
]
[[package]]
@@ -2648,9 +2626,9 @@ dependencies = [
[[package]]
name = "imagesize"
version = "0.13.0"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285"
checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c"
[[package]]
name = "imgref"
@@ -2864,9 +2842,9 @@ dependencies = [
[[package]]
name = "kurbo"
version = "0.11.3"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62"
checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32"
dependencies = [
"arrayvec",
"euclid",
@@ -2875,9 +2853,9 @@ dependencies = [
[[package]]
name = "kurbo"
version = "0.12.0"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32"
checksum = "7564e90fe3c0d5771e1f0bc95322b21baaeaa0d9213fa6a0b61c99f8b17b3bfb"
dependencies = [
"arrayvec",
"euclid",
@@ -2924,9 +2902,9 @@ dependencies = [
[[package]]
name = "libm"
version = "0.2.15"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "libredox"
@@ -3244,7 +3222,7 @@ dependencies = [
"objc2-foundation 0.3.2",
"once_cell",
"png 0.17.16",
"thiserror 2.0.17",
"thiserror 2.0.18",
"windows-sys 0.60.2",
]
@@ -3360,9 +3338,9 @@ dependencies = [
[[package]]
name = "num-conv"
version = "0.1.0"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
[[package]]
name = "num-derive"
@@ -4095,9 +4073,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.105"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
@@ -4216,9 +4194,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.43"
version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
dependencies = [
"proc-macro2",
]
@@ -4318,7 +4296,7 @@ dependencies = [
"rand 0.9.2",
"rand_chacha 0.9.0",
"simd_helpers",
"thiserror 2.0.17",
"thiserror 2.0.18",
"v_frame",
"wasm-bindgen",
]
@@ -4456,11 +4434,11 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "resvg"
version = "0.45.1"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43"
checksum = "b563218631706d614e23059436526d005b50ab5f2d506b55a17eb65c5eb83419"
dependencies = [
"gif 0.13.3",
"gif 0.14.1",
"image-webp",
"log",
"pico-args",
@@ -4468,7 +4446,7 @@ dependencies = [
"svgtypes",
"tiny-skia",
"usvg",
"zune-jpeg 0.4.21",
"zune-jpeg 0.5.11",
]
[[package]]
@@ -4482,7 +4460,7 @@ dependencies = [
[[package]]
name = "rog-control-center"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"asusd",
"concat-idents",
@@ -4513,7 +4491,7 @@ dependencies = [
[[package]]
name = "rog_anime"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"dmi_id",
"gif 0.12.0",
@@ -4527,7 +4505,7 @@ dependencies = [
[[package]]
name = "rog_aura"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"dmi_id",
"log",
@@ -4538,7 +4516,7 @@ dependencies = [
[[package]]
name = "rog_dbus"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"asusd",
"rog_anime",
@@ -4552,7 +4530,7 @@ dependencies = [
[[package]]
name = "rog_platform"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"concat-idents",
"inotify",
@@ -4565,7 +4543,7 @@ dependencies = [
[[package]]
name = "rog_profiles"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"log",
"rog_platform",
@@ -4576,7 +4554,7 @@ dependencies = [
[[package]]
name = "rog_scsi"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"ron",
"serde",
@@ -4586,7 +4564,7 @@ dependencies = [
[[package]]
name = "rog_simulators"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"log",
"rog_anime",
@@ -4596,7 +4574,7 @@ dependencies = [
[[package]]
name = "rog_slash"
version = "6.3.1"
version = "6.3.2"
dependencies = [
"dmi_id",
"serde",
@@ -4629,12 +4607,6 @@ dependencies = [
"text-size",
]
[[package]]
name = "roxmltree"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
[[package]]
name = "roxmltree"
version = "0.21.1"
@@ -4924,9 +4896,9 @@ dependencies = [
[[package]]
name = "siphasher"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
[[package]]
name = "skia-bindings"
@@ -4975,7 +4947,7 @@ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
[[package]]
name = "slint"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"const-field-offset",
"i-slint-backend-selector",
@@ -4995,7 +4967,7 @@ dependencies = [
[[package]]
name = "slint-build"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"derive_more",
"i-slint-compiler",
@@ -5006,7 +4978,7 @@ dependencies = [
[[package]]
name = "slint-macros"
version = "1.15.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"i-slint-compiler",
"proc-macro2",
@@ -5068,7 +5040,7 @@ dependencies = [
"log",
"memmap2",
"rustix 1.1.3",
"thiserror 2.0.17",
"thiserror 2.0.18",
"wayland-backend",
"wayland-client",
"wayland-csd-frame",
@@ -5140,9 +5112,9 @@ dependencies = [
[[package]]
name = "socket2"
version = "0.6.1"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"
dependencies = [
"libc",
"windows-sys 0.60.2",
@@ -5242,11 +5214,11 @@ dependencies = [
[[package]]
name = "svgtypes"
version = "0.15.3"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc"
checksum = "695b5790b3131dafa99b3bbfd25a216edb3d216dad9ca208d4657bfb8f2abc3d"
dependencies = [
"kurbo 0.11.3",
"kurbo 0.13.0",
"siphasher",
]
@@ -5330,7 +5302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9"
dependencies = [
"quick-xml 0.37.5",
"thiserror 2.0.17",
"thiserror 2.0.18",
"windows 0.61.3",
"windows-version",
]
@@ -5380,11 +5352,11 @@ dependencies = [
[[package]]
name = "thiserror"
version = "2.0.17"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
"thiserror-impl 2.0.17",
"thiserror-impl 2.0.18",
]
[[package]]
@@ -5400,9 +5372,9 @@ dependencies = [
[[package]]
name = "thiserror-impl"
version = "2.0.17"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
@@ -5434,9 +5406,9 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.45"
version = "0.3.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd"
checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5"
dependencies = [
"deranged",
"num-conv",
@@ -5447,9 +5419,9 @@ dependencies = [
[[package]]
name = "time-core"
version = "0.1.7"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca"
checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
[[package]]
name = "tiny-skia"
@@ -5526,7 +5498,7 @@ dependencies = [
"libc",
"mio 1.1.1",
"pin-project-lite",
"socket2 0.6.1",
"socket2 0.6.2",
"tokio-macros",
"tracing",
"windows-sys 0.61.2",
@@ -5940,19 +5912,19 @@ dependencies = [
[[package]]
name = "usvg"
version = "0.45.1"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef"
checksum = "e419dff010bb12512b0ae9e3d2f318dfbdf0167fde7eb05465134d4e8756076f"
dependencies = [
"base64 0.22.1",
"data-url",
"flate2",
"fontdb",
"imagesize",
"kurbo 0.11.3",
"kurbo 0.13.0",
"log",
"pico-args",
"roxmltree 0.20.0",
"roxmltree",
"rustybuzz",
"simplecss",
"siphasher",
@@ -5973,9 +5945,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.19.0"
version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"
dependencies = [
"js-sys",
"serde_core",
@@ -6030,7 +6002,7 @@ dependencies = [
[[package]]
name = "vtable"
version = "0.3.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"const-field-offset",
"portable-atomic",
@@ -6041,7 +6013,7 @@ dependencies = [
[[package]]
name = "vtable-macro"
version = "0.3.0"
source = "git+https://github.com/slint-ui/slint.git#75fb4125d8082c5c64b4ce8220c6fe607c8caac0"
source = "git+https://github.com/slint-ui/slint.git#f55d24727b3917ad6953f89a1dd32b48556b290e"
dependencies = [
"proc-macro2",
"quote",
@@ -6296,22 +6268,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "webbrowser"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97"
dependencies = [
"core-foundation 0.10.1",
"jni",
"log",
"ndk-context",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
"url",
"web-sys",
]
[[package]]
name = "weezl"
version = "0.1.12"
@@ -6933,7 +6889,7 @@ dependencies = [
"calloop 0.13.0",
"cfg_aliases",
"concurrent-queue",
"core-foundation 0.9.4",
"core-foundation",
"core-graphics",
"cursor-icon",
"dpi",
@@ -7152,9 +7108,9 @@ dependencies = [
[[package]]
name = "zbus"
version = "5.13.1"
version = "5.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f79257df967b6779afa536788657777a0001f5b42524fcaf5038d4344df40b"
checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1"
dependencies = [
"async-broadcast",
"async-executor",
@@ -7187,9 +7143,9 @@ dependencies = [
[[package]]
name = "zbus_macros"
version = "5.13.1"
version = "5.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aad23e2d2f91cae771c7af7a630a49e755f1eb74f8a46e9f6d5f7a146edf5a37"
checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1"
dependencies = [
"proc-macro-crate",
"proc-macro2",
@@ -7219,18 +7175,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"
[[package]]
name = "zerocopy"
version = "0.8.33"
version = "0.8.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
checksum = "71ddd76bcebeed25db614f82bf31a9f4222d3fbba300e6fb6c00afa26cbd4d9d"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.33"
version = "0.8.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
checksum = "d8187381b52e32220d50b255276aa16a084ec0a9017a0ca2152a1f55c539758d"
dependencies = [
"proc-macro2",
"quote",
@@ -7294,9 +7250,9 @@ dependencies = [
[[package]]
name = "zmij"
version = "1.0.15"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2"
checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439"
[[package]]
name = "zune-core"
@@ -7330,18 +7286,18 @@ dependencies = [
[[package]]
name = "zune-jpeg"
version = "0.5.9"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87c86acb70a85b2c16f071f171847d1945e8f44812630463cd14ec83900ad01c"
checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2"
dependencies = [
"zune-core 0.5.1",
]
[[package]]
name = "zvariant"
version = "5.9.1"
version = "5.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "326aaed414f04fe839777b4c443d4e94c74e7b3621093bd9c5e649ac8aa96543"
checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4"
dependencies = [
"endi",
"enumflags2",
@@ -7353,9 +7309,9 @@ dependencies = [
[[package]]
name = "zvariant_derive"
version = "5.9.1"
version = "5.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba44e1f8f4da9e6e2d25d2a60b116ef8b9d0be174a7685e55bb12a99866279a7"
checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c"
dependencies = [
"proc-macro-crate",
"proc-macro2",

View File

@@ -1,5 +1,5 @@
[workspace.package]
version = "6.3.1"
version = "6.3.2"
rust-version = "1.82"
license = "MPL-2.0"
readme = "README.md"

View File

@@ -8,7 +8,7 @@ use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Direction, Speed};
#[derive(FromArgs, Debug, Clone)]
#[argh(
subcommand,
name = "aura-power-old",
name = "power-tuf",
description = "aura power (old ROGs and TUF laptops)"
)]
pub struct LedPowerCommand1 {
@@ -38,7 +38,7 @@ pub struct LedPowerCommand1 {
}
#[derive(FromArgs, Debug, Clone)]
#[argh(subcommand, name = "aura-power", description = "aura power")]
#[argh(subcommand, name = "power", description = "aura power")]
pub struct LedPowerCommand2 {
#[argh(subcommand)]
pub command: Option<SetAuraZoneEnabled>,

View File

@@ -18,9 +18,7 @@ pub struct CliStart {
#[derive(FromArgs, Debug)]
#[argh(subcommand)]
pub enum CliCommand {
Aura(LedModeCommand),
AuraPowerOld(LedPowerCommand1),
AuraPower(LedPowerCommand2),
Aura(AuraCommand),
Brightness(BrightnessCommand),
Profile(ProfileCommand),
FanCurve(FanCurveCommand),
@@ -99,7 +97,7 @@ pub struct ProfileSetCommand {
}
#[derive(FromArgs, Debug, Default)]
#[argh(subcommand, name = "aura", description = "led mode commands")]
#[argh(subcommand, name = "effect", description = "led mode commands")]
pub struct LedModeCommand {
#[argh(switch, description = "switch to next aura mode")]
pub next_mode: bool,
@@ -111,6 +109,21 @@ pub struct LedModeCommand {
pub command: Option<SetAuraBuiltin>,
}
#[derive(FromArgs, Debug)]
#[argh(subcommand, name = "aura", description = "aura device commands")]
pub struct AuraCommand {
#[argh(subcommand)]
pub command: AuraSubCommand,
}
#[derive(FromArgs, Debug)]
#[argh(subcommand)]
pub enum AuraSubCommand {
Power(LedPowerCommand2),
PowerTuf(LedPowerCommand1),
Effect(LedModeCommand),
}
#[derive(FromArgs, Debug, Default)]
#[argh(
subcommand,

View File

@@ -186,9 +186,11 @@ fn do_parsed(
conn: Connection,
) -> Result<(), Box<dyn std::error::Error>> {
match &parsed.command {
CliCommand::Aura(mode) => handle_led_mode(mode)?,
CliCommand::AuraPowerOld(pow) => handle_led_power1(pow)?,
CliCommand::AuraPower(pow) => handle_led_power2(pow)?,
CliCommand::Aura(a) => match &a.command {
crate::cli_opts::AuraSubCommand::Effect(mode) => handle_led_mode(mode)?,
crate::cli_opts::AuraSubCommand::PowerTuf(pow) => handle_led_power1(pow)?,
crate::cli_opts::AuraSubCommand::Power(pow) => handle_led_power2(pow)?,
},
CliCommand::Brightness(cmd) => handle_brightness(cmd)?,
CliCommand::Profile(cmd) => handle_throttle_profile(&conn, supported_properties, cmd)?,
CliCommand::FanCurve(cmd) => handle_fan_curve(&conn, cmd)?,
@@ -720,7 +722,7 @@ fn handle_led_power1(power: &LedPowerCommand1) -> Result<(), Box<dyn std::error:
&& !power.keyboard
&& !power.lightbar
{
println!("Missing arg or command; run 'asusctl aura-power-old --help' for usage");
println!("Missing arg or command; run 'asusctl aura power-tuf --help' for usage");
return Ok(());
}
@@ -773,7 +775,7 @@ fn handle_led_power2(power: &LedPowerCommand2) -> Result<(), Box<dyn std::error:
}
if power.command.is_none() {
println!("Missing arg or command; run 'asusctl aura-power --help' for usage");
println!("Missing arg or command; run 'asusctl aura power --help' for usage");
println!("Commands available");
return Ok(());
}
@@ -968,52 +970,72 @@ fn print_firmware_attr(attr: &AsusArmouryProxyBlocking) -> Result<(), Box<dyn st
let name = attr.name()?;
println!("{}:", <&str>::from(name));
let attrs = attr.available_attrs()?;
if attrs.contains(&"min_value".to_string())
&& attrs.contains(&"max_value".to_string())
&& attrs.contains(&"current_value".to_string())
{
let c = attr.current_value()?;
let min = attr.min_value()?;
let max = attr.max_value()?;
println!(" current: {min}..[{c}]..{max}");
if attrs.contains(&"default_value".to_string()) {
println!(" default: {}\n", attr.default_value()?);
// Be resilient to DBus read failures: if any read fails, show "unavailable"
let attrs = attr.available_attrs().unwrap_or_default();
let has_min = attrs.contains(&"min_value".to_string());
let has_max = attrs.contains(&"max_value".to_string());
let has_current = attrs.contains(&"current_value".to_string());
let has_possible = attrs.contains(&"possible_values".to_string());
let has_default = attrs.contains(&"default_value".to_string());
if has_min && has_max && has_current {
let c = attr.current_value().ok();
let min = attr.min_value().ok();
let max = attr.max_value().ok();
match (min, c, max) {
(Some(min), Some(c), Some(max)) => println!(" current: {min}..[{c}]..{max}"),
_ => println!(" current: unavailable"),
}
if has_default {
match attr.default_value().ok() {
Some(d) => println!(" default: {}\n", d),
None => println!(" default: unavailable\n"),
}
} else {
println!();
}
} else if attrs.contains(&"possible_values".to_string())
&& attrs.contains(&"current_value".to_string())
{
let c = attr.current_value()?;
let v = attr.possible_values()?;
for p in v.iter().enumerate() {
if p.0 == 0 {
print!(" current: [");
} else if has_possible && has_current {
let c = attr.current_value().ok();
let v = attr.possible_values().ok();
if let (Some(c), Some(v)) = (c, v) {
for p in v.iter().enumerate() {
if p.0 == 0 {
print!(" current: [");
}
if *p.1 == c {
print!("({c})");
} else {
print!("{}", p.1);
}
if p.0 < v.len() - 1 {
print!(",");
}
if p.0 == v.len() - 1 {
print!("]");
}
}
if *p.1 == c {
print!("({c})");
if has_default {
match attr.default_value().ok() {
Some(d) => println!(" default: {}\n", d),
None => println!(" default: unavailable\n"),
}
} else {
print!("{}", p.1);
println!("\n");
}
if p.0 < v.len() - 1 {
print!(",");
}
if p.0 == v.len() - 1 {
print!("]");
}
}
if attrs.contains(&"default_value".to_string()) {
println!(" default: {}\n", attr.default_value()?);
} else {
println!("\n");
println!(" current: unavailable\n");
}
} else if has_current {
match attr.current_value().ok() {
Some(c) => println!(" current: {c}\n"),
None => println!(" current: unavailable\n"),
}
} else if attrs.contains(&"current_value".to_string()) {
let c = attr.current_value()?;
println!(" current: {c}\n");
} else {
println!();
println!(" unavailable\n");
}
Ok(())
}

View File

@@ -654,6 +654,15 @@ impl CtrlPlatform {
.enabled = enable;
self.config.lock().await.write();
// Re-emit armoury attribute limits so GUI sees updated min/max for PPT
// attributes which can change when enabling/disabling PPT tuning groups.
// Fire-and-forget: we don't want to fail the property call if emit fails.
let _ = self
.armoury_registry
.emit_limits(&self.connection)
.await
.map_err(|e| log::error!("Failed to emit armoury limits: {e:?}"));
Ok(())
}
}
@@ -712,6 +721,13 @@ impl ReloadAndNotify for CtrlPlatform {
*config = data;
config.base_charge_control_end_threshold =
base_charge_control_end_threshold.unwrap_or_default();
// Ensure any armoury limits changes from the new config are emitted
let _ = self
.armoury_registry
.emit_limits(&self.connection)
.await
.map_err(|e| log::error!("Failed to emit armoury limits after reload: {e:?}"));
}
Ok(())
}

View File

@@ -20,7 +20,7 @@
%global debug_package %{nil}
%endif
%define version 6.3.1
%define version 6.3.2
%define specrelease %{?dist}
%define pkg_release 1%{specrelease}

View File

@@ -125,7 +125,7 @@
advanced_type: r#None,
power_zones: [Keyboard],
),
(
(
device_name: "FX607V",
product_id: "",
layout_name: "fa506i",
@@ -351,13 +351,13 @@
power_zones: [Keyboard, Lightbar, Logo, RearGlow],
),
(
device_name: "G635L",
product_id: "",
layout_name: "g635l-per-key",
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
basic_zones: [],
advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo],
device_name: "G635L",
product_id: "",
layout_name: "g635l-per-key",
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
basic_zones: [],
advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo],
),
(
device_name: "G712LI",
@@ -579,7 +579,7 @@
device_name: "G835L",
product_id: "",
layout_name: "g814ji-per-key",
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Comet, Flash],
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
basic_zones: [],
advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo],
@@ -998,4 +998,4 @@
advanced_type: r#None,
power_zones: [Ally],
),
])
])

View File

@@ -148,6 +148,12 @@ async fn main() -> Result<()> {
}
};
let is_tuf = {
let b = board_name.to_lowercase();
let p = prod_family.to_lowercase();
b.contains("tuf") || p.contains("tuf")
};
#[cfg(feature = "rog_ally")]
if is_rog_ally {
config.notifications.enabled = false;
@@ -198,7 +204,7 @@ async fn main() -> Result<()> {
loop {
if is_rog_ally {
let config_copy_2 = config.clone();
let newui = setup_window(config.clone(), prefetched_supported.clone());
let newui = setup_window(config.clone(), prefetched_supported.clone(), is_tuf);
newui.window().on_close_requested(move || {
exit(0);
});
@@ -256,7 +262,7 @@ async fn main() -> Result<()> {
});
} else {
let config_copy_2 = config_copy.clone();
let newui = setup_window(config_copy, pref_for_invoke.clone());
let newui = setup_window(config_copy, pref_for_invoke.clone(), is_tuf);
newui.window().on_close_requested(move || {
if let Ok(mut app_state) = app_state_copy.lock() {
*app_state = AppState::MainWindowClosed;

View File

@@ -1,9 +1,14 @@
pub mod setup_anime;
pub mod setup_aura;
pub mod setup_fans;
pub mod setup_gpu;
pub mod setup_system;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::{Arc, Mutex};
use std::time::Duration;
static TOAST_SEQ: AtomicU64 = AtomicU64::new(0);
use config_traits::StdConfig;
use log::warn;
@@ -70,21 +75,52 @@ pub fn show_toast(
handle: Weak<MainWindow>,
result: zbus::Result<()>,
) {
// bump sequence so that any previously spawned timers won't clear newer toasts
let seq = TOAST_SEQ.fetch_add(1, Ordering::SeqCst) + 1;
match result {
Ok(_) => {
slint::invoke_from_event_loop(move || handle.unwrap().invoke_show_toast(success)).ok()
let delayed_handle = handle.clone();
let delayed_text = success.clone();
slint::invoke_from_event_loop(move || handle.unwrap().invoke_show_toast(success)).ok();
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(5)).await;
if TOAST_SEQ.load(Ordering::SeqCst) == seq {
slint::invoke_from_event_loop(move || {
delayed_handle
.unwrap()
.invoke_clear_toast_if_matches(delayed_text)
})
.ok();
}
});
}
Err(e) => {
let delayed_handle = handle.clone();
let delayed_text = fail.clone();
slint::invoke_from_event_loop(move || {
log::warn!("{fail}: {e}");
handle.unwrap().invoke_show_toast(fail)
})
.ok();
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(5)).await;
if TOAST_SEQ.load(Ordering::SeqCst) == seq {
slint::invoke_from_event_loop(move || {
delayed_handle
.unwrap()
.invoke_clear_toast_if_matches(delayed_text)
})
.ok();
}
});
}
Err(e) => slint::invoke_from_event_loop(move || {
log::warn!("{fail}: {e}");
handle.unwrap().invoke_show_toast(fail)
})
.ok(),
};
}
pub fn setup_window(
config: Arc<Mutex<Config>>,
prefetched_supported: std::sync::Arc<Option<Vec<i32>>>,
is_tuf: bool,
) -> MainWindow {
slint::set_xdg_app_id("rog-control-center")
.map_err(|e| warn!("Couldn't set application ID: {e:?}"))
@@ -92,6 +128,8 @@ pub fn setup_window(
let ui = MainWindow::new()
.map_err(|e| warn!("Couldn't create main window: {e:?}"))
.unwrap();
// propagate TUF flag to the UI so the sidebar can swap logo branding
ui.set_is_tuf(is_tuf);
ui.window()
.show()
.map_err(|e| warn!("Couldn't show main window: {e:?}"))
@@ -128,9 +166,12 @@ pub fn setup_window(
setup_anime_page(&ui, config.clone());
}
if available.contains(&"xyz.ljones.FanCurves".to_string()) {
setup_fan_curve_page(&ui, config);
setup_fan_curve_page(&ui, config.clone());
}
// Populate GPU page choices and callbacks
setup_gpu::setup_gpu_page(&ui);
ui
}

View File

@@ -0,0 +1,182 @@
use log::error;
use rog_platform::asus_armoury::{AttrValue, FirmwareAttributes};
use slint::{ComponentHandle, ModelRc, SharedString};
use crate::{GPUPageData, MainWindow};
// Populate GPU page choices and wire the `cb_set_gpu_mode` callback
pub fn setup_gpu_page(ui: &MainWindow) {
let handle = ui.as_weak();
tokio::spawn(async move {
// Read available attributes
let attrs = FirmwareAttributes::new();
let gpu_mux_available = attrs
.gpu_mux_mode()
.map(|a| a.base_path_exists())
.unwrap_or(false);
// Prepare choice strings
let mut choices: Vec<SharedString> = Vec::new();
choices.push(SharedString::from("Integrated"));
if gpu_mux_available {
choices.push(SharedString::from("Ultimate"));
}
choices.push(SharedString::from("Hybrid"));
// Read current attribute values to initialise UI state
let current_dgpu = attrs
.dgpu_disable()
.and_then(|a| a.current_value().ok())
.unwrap_or(AttrValue::Integer(0));
let current_mux = attrs
.gpu_mux_mode()
.and_then(|a| a.current_value().ok())
.unwrap_or(AttrValue::Integer(1));
// Convert to UI-able values
let dgpu_disabled = matches!(current_dgpu, AttrValue::Integer(v) if v == 1);
// Determine initial index for gpu_mux_mode property
let initial_index: i32 = if gpu_mux_available {
// If mux attr says 0 -> Ultimate, else try dgpu to refine
match current_mux {
AttrValue::Integer(0) => 1, // Ultimate
_ => {
match current_dgpu {
AttrValue::Integer(1) => 0, // Integrated
_ => 2, // Hybrid/Optimus fallback
}
}
}
} else {
// Only Integrated / Hybrid
match current_dgpu {
AttrValue::Integer(1) => 0,
_ => 1,
}
};
let handle_copy = handle.clone();
if let Err(e) = handle.upgrade_in_event_loop(move |handle| {
let global = handle.global::<GPUPageData>();
// set choices model
let model: ModelRc<SharedString> = choices.as_slice().into();
global.set_gpu_modes_choises(model);
global.set_gpu_mux_available(gpu_mux_available);
// set initial state
global.set_dgpu_disabled(if dgpu_disabled { 1 } else { 0 });
global.set_gpu_mux_mode(initial_index);
// register callback
let handle_cb = handle_copy.clone();
global.on_cb_set_gpu_mode(move |index: i32| {
// show a blue toast informing user a reboot is required (auto-clears)
let toast_handle = handle_cb.clone();
crate::ui::show_toast(
SharedString::from(
"GPU mode change scheduled — reboot required for changes to apply.",
),
SharedString::from("Failed to set GPU mode"),
toast_handle.clone(),
Ok(()),
);
let handle_next = handle_cb.clone();
tokio::spawn(async move {
let attrs = FirmwareAttributes::new();
let mux_avail = attrs
.gpu_mux_mode()
.map(|a| a.base_path_exists())
.unwrap_or(false);
// helper to set attribute ignoring errors
if mux_avail {
match index {
0 => {
// Integrated
if let Some(attr) = attrs.dgpu_disable() {
let _ = attr.set_current_value(&AttrValue::Integer(1));
}
if let Some(attr) = attrs.gpu_mux_mode() {
let _ = attr.set_current_value(&AttrValue::Integer(1));
}
}
1 => {
// Ultimate
if let Some(attr) = attrs.dgpu_disable() {
let _ = attr.set_current_value(&AttrValue::Integer(0));
}
if let Some(attr) = attrs.gpu_mux_mode() {
let _ = attr.set_current_value(&AttrValue::Integer(0));
}
}
2 => {
// Dynamic
if let Some(attr) = attrs.dgpu_disable() {
let _ = attr.set_current_value(&AttrValue::Integer(0));
}
if let Some(attr) = attrs.gpu_mux_mode() {
let _ = attr.set_current_value(&AttrValue::Integer(1));
}
}
_ => {}
}
} else {
match index {
0 => {
if let Some(attr) = attrs.dgpu_disable() {
let _ = attr.set_current_value(&AttrValue::Integer(1));
}
}
1 => {
if let Some(attr) = attrs.dgpu_disable() {
let _ = attr.set_current_value(&AttrValue::Integer(0));
}
}
_ => {}
}
};
// After attempting write(s), refresh UI from attributes
let attrs2 = FirmwareAttributes::new();
let cur_dgpu = attrs2
.dgpu_disable()
.and_then(|a| a.current_value().ok())
.unwrap_or(AttrValue::Integer(0));
let cur_mux = attrs2
.gpu_mux_mode()
.and_then(|a| a.current_value().ok())
.unwrap_or(AttrValue::Integer(1));
let dgpu_disabled = matches!(cur_dgpu, AttrValue::Integer(v) if v == 1);
let new_index: i32 = if mux_avail {
match cur_mux {
AttrValue::Integer(0) => 1,
_ => match cur_dgpu {
AttrValue::Integer(1) => 0,
_ => 2,
},
}
} else {
match cur_dgpu {
AttrValue::Integer(1) => 0,
_ => 1,
}
};
if let Err(e) = handle_next.upgrade_in_event_loop(move |h| {
let g = h.global::<GPUPageData>();
g.set_dgpu_disabled(if dgpu_disabled { 1 } else { 0 });
g.set_gpu_mux_mode(new_index);
}) {
error!("setup_gpu callback: upgrade_in_event_loop: {e:?}");
}
});
});
}) {
error!("setup_gpu_page: upgrade_in_event_loop: {e:?}");
}
});
}

View File

@@ -40,10 +40,6 @@ pub fn setup_system_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
ui.global::<SystemPageData>().set_platform_profile(-1);
ui.global::<SystemPageData>().set_panel_overdrive(-1);
ui.global::<SystemPageData>().set_boot_sound(-1);
ui.global::<SystemPageData>().set_kbd_leds_awake(-1);
ui.global::<SystemPageData>().set_kbd_leds_sleep(-1);
ui.global::<SystemPageData>().set_kbd_leds_boot(-1);
ui.global::<SystemPageData>().set_kbd_leds_shutdown(-1);
ui.global::<SystemPageData>().set_screen_auto_brightness(-1);
ui.global::<SystemPageData>().set_mcu_powersave(-1);
ui.global::<SystemPageData>().set_mini_led_mode(-1);
@@ -673,26 +669,6 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc<Mutex<Config>>)
setup_callback!(boot_sound, handle, attr, i32);
setup_external!(boot_sound, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsAwake => {
init_property!(kbd_leds_awake, handle, value, i32);
setup_callback!(kbd_leds_awake, handle, attr, i32);
setup_external!(kbd_leds_awake, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsSleep => {
init_property!(kbd_leds_sleep, handle, value, i32);
setup_callback!(kbd_leds_sleep, handle, attr, i32);
setup_external!(kbd_leds_sleep, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsBoot => {
init_property!(kbd_leds_boot, handle, value, i32);
setup_callback!(kbd_leds_boot, handle, attr, i32);
setup_external!(kbd_leds_boot, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsShutdown => {
init_property!(kbd_leds_shutdown, handle, value, i32);
setup_callback!(kbd_leds_shutdown, handle, attr, i32);
setup_external!(kbd_leds_shutdown, i32, handle, attr, value)
}
FirmwareAttribute::ScreenAutoBrightness => {
init_property!(screen_auto_brightness, handle, value, i32);
setup_callback!(screen_auto_brightness, handle, attr, i32);

View File

@@ -7,7 +7,7 @@ import { PageFans } from "pages/fans.slint";
import { PageAnime, AnimePageData } from "pages/anime.slint";
import { RogItem } from "widgets/common.slint";
import { PageAura } from "pages/aura.slint";
import { PageGPU } from "pages/gpu.slint";
import { PageGPU, GPUPageData } from "pages/gpu.slint";
import { Node } from "widgets/graph.slint";
export { Node }
import { FanPageData, FanType, Profile } from "types/fan_types.slint";
@@ -16,7 +16,7 @@ import { AuraPageData, AuraDevType, LaptopAuraPower, AuraPowerState, PowerZones,
export { AuraPageData, AuraDevType, LaptopAuraPower, AuraPowerState, PowerZones, AuraEffect }
import { PageAppSettings, AppSettingsPageData } from "pages/app_settings.slint";
export { AppSize, AttrMinMax, SystemPageData, AnimePageData, AppSettingsPageData }
export { AppSize, AttrMinMax, SystemPageData, AnimePageData, AppSettingsPageData, GPUPageData }
export component MainWindow inherits Window {
title: "ROG Control";
@@ -35,6 +35,8 @@ export component MainWindow inherits Window {
true, // About
];
private property <bool> show_notif;
// TODO: change if TUF on the logo in the menu on the main page
in property <bool> is_tuf: false;
private property <bool> fade_cover;
private property <bool> toast: false;
private property <string> toast_text: "I show when something is waiting";
@@ -43,6 +45,13 @@ export component MainWindow inherits Window {
toast = text != "";
toast_text = text;
}
callback clear_toast_if_matches(string);
clear_toast_if_matches(text) => {
if (toast && toast_text == text) {
toast = false;
toast_text = "";
}
}
callback exit-app();
callback show_notification(bool);
show_notification(yes) => {
@@ -73,6 +82,7 @@ export component MainWindow inherits Window {
@tr("Menu7" => "About"),
];
available: root.sidebar_items_avilable;
is_tuf: root.is_tuf;
}
Button {
@@ -94,31 +104,37 @@ export component MainWindow inherits Window {
/*if(side-bar.current-item == 1):*/ aura := PageAura {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 1;
}
if(side-bar.current-item == 2): PageAnime {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 2;
}
if(side-bar.current-item == 3): fans := PageFans {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 3;
}
if(side-bar.current-item == 4): PageGPU {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 4;
}
if(side-bar.current-item == 5): PageAppSettings {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 5;
}
if(side-bar.current-item == 6): PageAbout {
width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 6;
}

View File

@@ -238,15 +238,47 @@ export component PageAura inherits Rectangle {
}
}
}
}
}
Button {
x: root.width - self.width - 6px;
y: 6px;
text: "✕";
height: 36px;
clicked => {
root.show_aura_power = false;
root.show_fade_cover = false;
// TUF devices: show the same configurable power groups as `New`, since
// `setup_aura` fills `AuraPageData.supported_power_zones` and `led_power`
// appropriately for TUF devices. This ensures the Power Settings panel
// reflects what the firmware reports for TUF models.
if root.show_aura_power && AuraPageData.device_type == AuraDevType.Tuf: Rectangle {
background: Palette.background;
width: 100%;
height: 100%;
opacity: 1;
ScrollView {
VerticalLayout {
padding: 30px;
padding-top: 10px;
spacing: 10px;
alignment: LayoutAlignment.start;
for state[idx] in AuraPageData.led_power.states: tuf_zone := AuraPowerGroup {
group-title: AuraPageData.power_zone_names[state.zone_name_idx];
boot_checked: state.boot;
boot_toggled => {
AuraPageData.led_power.states[idx].boot = tuf_zone.boot_checked;
AuraPageData.cb_led_power(AuraPageData.led_power);
}
awake_checked: state.awake;
awake_toggled => {
AuraPageData.led_power.states[idx].awake = tuf_zone.awake_checked;
AuraPageData.cb_led_power(AuraPageData.led_power);
}
sleep_checked: state.sleep;
sleep_toggled => {
AuraPageData.led_power.states[idx].sleep = tuf_zone.sleep_checked;
AuraPageData.cb_led_power(AuraPageData.led_power);
}
shutdown_checked: state.shutdown;
shutdown_toggled => {
AuraPageData.led_power.states[idx].shutdown = tuf_zone.shutdown_checked;
AuraPageData.cb_led_power(AuraPageData.led_power);
}
}
}
}
@@ -292,17 +324,17 @@ export component PageAura inherits Rectangle {
}
}
}
}
}
Button {
x: root.width - self.width - 6px;
y: 6px;
text: "✕";
height: 36px;
clicked => {
root.show_aura_power = false;
root.show_fade_cover = false;
}
}
if root.show_aura_power: Button {
x: root.width - self.width - 6px;
y: 6px;
text: "✕";
height: 36px;
clicked => {
root.show_aura_power = false;
root.show_fade_cover = false;
}
}
}

View File

@@ -8,10 +8,9 @@ export global GPUPageData {
in-out property <int> gpu_mux_mode: 1; // 0 = Ultra/Discreet, 1 = Integrated/Optimus
in-out property <int> dgpu_disabled: 0; // 1 == dGPU disabled
in-out property <int> egpu_enabled: 0; // 1 == eGPU (XGMobile) enabled
in-out property <[string]> gpu_modes_choises: [@tr("Ultra"), @tr("Integrated")];
callback cb_gpu_mux_mode(int);
callback cb_dgpu_disabled(int);
callback cb_egpu_enabled(int);
in-out property <[string]> gpu_modes_choises: [@tr("Integrated"), @tr("Hybrid")];
in-out property <bool> gpu_mux_available: false;
callback cb_set_gpu_mode(int);
}
export component PageGPU inherits Rectangle {
@@ -19,16 +18,45 @@ export component PageGPU inherits Rectangle {
ScrollView {
VerticalLayout {
padding: 10px;
spacing: 10px;
SystemDropdown {
text: @tr("GPU mode");
current_index <=> GPUPageData.gpu_mux_mode;
current_value: GPUPageData.gpu_modes_choises[GPUPageData.gpu_mux_mode];
model <=> GPUPageData.gpu_modes_choises;
selected => {
GPUPageData.cb_gpu_mux_mode(0);
GPUPageData.cb_gpu_mux_mode(1);
padding: 12px;
spacing: 8px;
Rectangle {
background: Palette.alternate-background;
border-color: Palette.border;
border-width: 1px;
border-radius: 2px;
height: 36px;
Text {
font-size: 16px;
color: Palette.control-foreground;
horizontal-alignment: TextHorizontalAlignment.center;
text: @tr("Internal/Discrete GPU");
}
}
HorizontalLayout {
padding-right: 10px;
padding-left: 10px;
alignment: LayoutAlignment.space-between;
Rectangle {
height: 32px;
Text {
font-size: 16px;
text: @tr("Note: Changes take effect after a reboot. The dropdown always shows the current mode.");
}
}
}
HorizontalLayout {
SystemDropdown {
text: @tr("GPU mode");
model <=> GPUPageData.gpu_modes_choises;
current_index <=> GPUPageData.gpu_mux_mode;
current_value: GPUPageData.gpu_modes_choises[GPUPageData.gpu_mux_mode];
selected => {
GPUPageData.cb_set_gpu_mode(GPUPageData.gpu_mux_mode)
}
}
}
}

View File

@@ -51,14 +51,6 @@ export global SystemPageData {
callback cb_panel_overdrive(int);
in-out property <int> boot_sound;
callback cb_boot_sound(int);
in-out property <int> kbd_leds_awake;
callback cb_kbd_leds_awake(int);
in-out property <int> kbd_leds_sleep;
callback cb_kbd_leds_sleep(int);
in-out property <int> kbd_leds_boot;
callback cb_kbd_leds_boot(int);
in-out property <int> kbd_leds_shutdown;
callback cb_kbd_leds_shutdown(int);
in-out property <int> screen_auto_brightness;
callback cb_screen_auto_brightness(int);
in-out property <int> mcu_powersave;
@@ -252,66 +244,6 @@ export component PageSystem inherits Rectangle {
}
}
if SystemPageData.kbd_leds_awake != -1 ||
SystemPageData.kbd_leds_sleep != -1 ||
SystemPageData.kbd_leds_boot != -1 ||
SystemPageData.kbd_leds_shutdown != -1: VerticalLayout {
padding: 0px;
spacing: 0px;
alignment: LayoutAlignment.start;
Rectangle {
background: Palette.alternate-background;
border-color: Palette.border;
border-width: 1px;
border-radius: 2px;
height: 40px;
Text {
font-size: 16px;
color: Palette.control-foreground;
horizontal-alignment: TextHorizontalAlignment.center;
text: @tr("Keyboard Power Management");
}
}
GroupBox {
HorizontalLayout {
spacing: 10px;
if SystemPageData.kbd_leds_awake != -1: SystemToggleInt {
text: @tr("Keyboard Awake Effect");
checked_int <=> SystemPageData.kbd_leds_awake;
toggled => {
SystemPageData.cb_kbd_leds_awake(SystemPageData.kbd_leds_awake)
}
}
if SystemPageData.kbd_leds_sleep != -1: SystemToggleInt {
text: @tr("Keyboard Sleep Effect");
checked_int <=> SystemPageData.kbd_leds_sleep;
toggled => {
SystemPageData.cb_kbd_leds_sleep(SystemPageData.kbd_leds_sleep)
}
}
if SystemPageData.kbd_leds_boot != -1: SystemToggleInt {
text: @tr("Keyboard Boot Effect");
checked_int <=> SystemPageData.kbd_leds_boot;
toggled => {
SystemPageData.cb_kbd_leds_boot(SystemPageData.kbd_leds_boot)
}
}
if SystemPageData.kbd_leds_shutdown != -1: SystemToggleInt {
text: @tr("Keyboard Shutdown Effect");
checked_int <=> SystemPageData.kbd_leds_shutdown;
toggled => {
SystemPageData.cb_kbd_leds_shutdown(SystemPageData.kbd_leds_shutdown)
}
}
}
}
}
Rectangle {
background: Palette.alternate-background;
border-color: Palette.border;
@@ -634,7 +566,7 @@ export component PageSystem inherits Rectangle {
}
SystemDropdown {
text: @tr("EPP for Quiet Policy");
text: @tr("EPP for ") + SystemPageData.platform_profile_choices[2] + @tr(" Policy");
current_index <=> SystemPageData.profile_quiet_epp;
current_value: SystemPageData.energy_performance_choices[SystemPageData.profile_quiet_epp];
model <=> SystemPageData.energy_performance_choices;

View File

@@ -52,6 +52,7 @@ component SideBarItem inherits Rectangle {
export component SideBar inherits Rectangle {
in property <[string]> model: [];
in property <[bool]> available: [];
in property <bool> is_tuf: false;
out property <int> current-item: 0;
out property <int> current-focused: fs.has-focus ? fs.focused-tab : -1;
@@ -99,6 +100,9 @@ export component SideBar inherits Rectangle {
Image {
height: 100px;
// TODO: change if TUF on the logo in the menu on the main page
// If running on a TUF model, replace the ROG red with TUF orange
// (add data/tuf-control-center.png and switch here when available)
source: @image-url("../../data/rog-control-center.png");
horizontal-alignment: center;
image-fit: contain;

View File

@@ -257,7 +257,6 @@ impl FirmwareAttributes {
pub enum FirmwareAttributeType {
#[default]
Immediate,
TUFKeyboard,
Ppt,
Gpu,
Bios,
@@ -346,11 +345,6 @@ define_attribute_getters!(
panel_hd_mode: Immediate,
panel_od: Immediate,
kbd_leds_awake: TUFKeyboard,
kbd_leds_sleep: TUFKeyboard,
kbd_leds_boot: TUFKeyboard,
kbd_leds_shutdown: TUFKeyboard,
charge_mode: Immediate,
}
);
@@ -400,10 +394,6 @@ pub enum FirmwareAttribute {
PptEnabled = 24,
None = 25,
ScreenAutoBrightness = 26,
KbdLedsAwake = 27,
KbdLedsSleep = 28,
KbdLedsBoot = 29,
KbdLedsShutdown = 30,
}
impl From<&str> for FirmwareAttribute {
@@ -425,10 +415,6 @@ impl From<&str> for FirmwareAttribute {
"nv_tgp" => Self::DgpuTgp,
"charge_mode" => Self::ChargeMode,
"boot_sound" => Self::BootSound,
"kbd_leds_awake" => Self::KbdLedsAwake,
"kbd_leds_sleep" => Self::KbdLedsSleep,
"kbd_leds_boot" => Self::KbdLedsBoot,
"kbd_leds_shutdown" => Self::KbdLedsShutdown,
"mcu_powersave" => Self::McuPowersave,
"panel_overdrive" => Self::PanelOverdrive,
"panel_hd_mode" => Self::PanelHdMode,
@@ -474,10 +460,6 @@ impl From<FirmwareAttribute> for &str {
FirmwareAttribute::DgpuDisable => "dgpu_disable",
FirmwareAttribute::GpuMuxMode => "gpu_mux_mode",
FirmwareAttribute::MiniLedMode => "mini_led_mode",
FirmwareAttribute::KbdLedsAwake => "kbd_leds_awake",
FirmwareAttribute::KbdLedsSleep => "kbd_leds_sleep",
FirmwareAttribute::KbdLedsBoot => "kbd_leds_boot",
FirmwareAttribute::KbdLedsShutdown => "kbd_leds_shutdown",
FirmwareAttribute::PendingReboot => "pending_reboot",
FirmwareAttribute::ScreenAutoBrightness => "screen_auto_brightness",
FirmwareAttribute::None => "none",