Compare commits

..

15 Commits

Author SHA1 Message Date
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
Denis Benato
5901a4b4d9 fix: aura CLI interface 2026-01-24 17:58:54 +01:00
Denis Benato
9cd14d108c wip: reload current settings in rogcc for LEDs 2026-01-24 17:26:42 +01:00
Denis Benato
5d4b164b3b fix: LEDs managfement in rogcc 2026-01-24 16:49:48 +01:00
28 changed files with 996 additions and 704 deletions

View File

@@ -7,6 +7,8 @@
- Improve firmware attributes handling - Improve firmware attributes handling
- Very good looking UI restyling from @shevchenko0013 - Very good looking UI restyling from @shevchenko0013
- Added support for GA402NV matrix: thanks @Ghoul4500 - Added support for GA402NV matrix: thanks @Ghoul4500
- Fixed aura CLI interface
- Fixed LEDs handling in rogcc
## [6.3.1] ## [6.3.1]

260
Cargo.lock generated
View File

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

View File

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

View File

@@ -8,7 +8,7 @@ use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Direction, Speed};
#[derive(FromArgs, Debug, Clone)] #[derive(FromArgs, Debug, Clone)]
#[argh( #[argh(
subcommand, subcommand,
name = "aura-power-old", name = "power-tuf",
description = "aura power (old ROGs and TUF laptops)" description = "aura power (old ROGs and TUF laptops)"
)] )]
pub struct LedPowerCommand1 { pub struct LedPowerCommand1 {
@@ -38,7 +38,7 @@ pub struct LedPowerCommand1 {
} }
#[derive(FromArgs, Debug, Clone)] #[derive(FromArgs, Debug, Clone)]
#[argh(subcommand, name = "aura-power", description = "aura power")] #[argh(subcommand, name = "power", description = "aura power")]
pub struct LedPowerCommand2 { pub struct LedPowerCommand2 {
#[argh(subcommand)] #[argh(subcommand)]
pub command: Option<SetAuraZoneEnabled>, pub command: Option<SetAuraZoneEnabled>,
@@ -312,6 +312,133 @@ pub struct TwoColourSpeed {
pub zone: AuraZone, pub zone: AuraZone,
} }
/// Two-colour star effect (separate subcommand name)
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(subcommand, name = "stars", description = "two-colour star effect")]
pub struct StarsTwoColour {
#[argh(option, description = "set the first RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(option, description = "set the second RGB value e.g. ff00ff")]
pub colour2: Colour,
#[argh(option, description = "set the speed: low, med, high")]
pub speed: Speed,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
/// Rain effect (single-speed, separate subcommand name)
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(
subcommand,
name = "rain",
description = "single speed-based rain effect"
)]
pub struct RainSingleSpeed {
#[argh(option, description = "set the speed: low, med, high")]
pub speed: Speed,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
/// Laser (single-colour with speed) separate subcommand
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(
subcommand,
name = "laser",
description = "single-colour effect with speed"
)]
pub struct LaserSingleColourSpeed {
#[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(option, description = "set the speed: low, med, high")]
pub speed: Speed,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
/// Ripple (single-colour with speed) separate subcommand
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(
subcommand,
name = "ripple",
description = "single-colour effect with speed"
)]
pub struct RippleSingleColourSpeed {
#[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(option, description = "set the speed: low, med, high")]
pub speed: Speed,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
/// Pulse / Comet / Flash variants (single-colour) separate subcommands
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(subcommand, name = "pulse", description = "single-colour pulse effect")]
pub struct PulseSingleColour {
#[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(subcommand, name = "comet", description = "single-colour comet effect")]
pub struct CometSingleColour {
#[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
#[derive(FromArgs, Debug, Clone, Default)]
#[argh(subcommand, name = "flash", description = "single-colour flash effect")]
pub struct FlashSingleColour {
#[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")]
pub colour: Colour,
#[argh(
option,
default = "AuraZone::None",
description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left"
)]
pub zone: AuraZone,
}
/// Multi-zone colour settings /// Multi-zone colour settings
#[derive(FromArgs, Debug, Clone, Default)] #[derive(FromArgs, Debug, Clone, Default)]
#[allow(dead_code)] #[allow(dead_code)]
@@ -359,14 +486,14 @@ pub enum SetAuraBuiltin {
Breathe(TwoColourSpeed), // 1 Breathe(TwoColourSpeed), // 1
RainbowCycle(SingleSpeed), // 2 RainbowCycle(SingleSpeed), // 2
RainbowWave(SingleSpeedDirection), // 3 RainbowWave(SingleSpeedDirection), // 3
Stars(TwoColourSpeed), // 4 Stars(StarsTwoColour), // 4
Rain(SingleSpeed), // 5 Rain(RainSingleSpeed), // 5
Highlight(SingleColourSpeed), // 6 Highlight(SingleColourSpeed), // 6
Laser(SingleColourSpeed), // 7 Laser(LaserSingleColourSpeed), // 7
Ripple(SingleColourSpeed), // 8 Ripple(RippleSingleColourSpeed), // 8
Pulse(SingleColour), // 10 Pulse(PulseSingleColour), // 10
Comet(SingleColour), // 11 Comet(CometSingleColour), // 11
Flash(SingleColour), // 12 Flash(FlashSingleColour), // 12
} }
impl Default for SetAuraBuiltin { impl Default for SetAuraBuiltin {
@@ -428,6 +555,79 @@ impl From<&SingleSpeedDirection> for AuraEffect {
} }
} }
impl From<&StarsTwoColour> for AuraEffect {
fn from(aura: &StarsTwoColour) -> Self {
Self {
colour1: aura.colour,
colour2: aura.colour2,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&RainSingleSpeed> for AuraEffect {
fn from(aura: &RainSingleSpeed) -> Self {
Self {
speed: aura.speed,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&LaserSingleColourSpeed> for AuraEffect {
fn from(aura: &LaserSingleColourSpeed) -> Self {
Self {
colour1: aura.colour,
speed: aura.speed,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&RippleSingleColourSpeed> for AuraEffect {
fn from(aura: &RippleSingleColourSpeed) -> Self {
Self {
colour1: aura.colour,
speed: aura.speed,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&PulseSingleColour> for AuraEffect {
fn from(aura: &PulseSingleColour) -> Self {
Self {
colour1: aura.colour,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&CometSingleColour> for AuraEffect {
fn from(aura: &CometSingleColour) -> Self {
Self {
colour1: aura.colour,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&FlashSingleColour> for AuraEffect {
fn from(aura: &FlashSingleColour) -> Self {
Self {
colour1: aura.colour,
zone: aura.zone,
..Default::default()
}
}
}
impl From<&SetAuraBuiltin> for AuraEffect { impl From<&SetAuraBuiltin> for AuraEffect {
fn from(aura: &SetAuraBuiltin) -> Self { fn from(aura: &SetAuraBuiltin) -> Self {
match aura { match aura {

View File

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

View File

@@ -186,9 +186,11 @@ fn do_parsed(
conn: Connection, conn: Connection,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
match &parsed.command { match &parsed.command {
CliCommand::Aura(mode) => handle_led_mode(mode)?, CliCommand::Aura(a) => match &a.command {
CliCommand::AuraPowerOld(pow) => handle_led_power1(pow)?, crate::cli_opts::AuraSubCommand::Effect(mode) => handle_led_mode(mode)?,
CliCommand::AuraPower(pow) => handle_led_power2(pow)?, 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::Brightness(cmd) => handle_brightness(cmd)?,
CliCommand::Profile(cmd) => handle_throttle_profile(&conn, supported_properties, cmd)?, CliCommand::Profile(cmd) => handle_throttle_profile(&conn, supported_properties, cmd)?,
CliCommand::FanCurve(cmd) => handle_fan_curve(&conn, 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.keyboard
&& !power.lightbar && !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(()); return Ok(());
} }
@@ -773,7 +775,7 @@ fn handle_led_power2(power: &LedPowerCommand2) -> Result<(), Box<dyn std::error:
} }
if power.command.is_none() { 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"); println!("Commands available");
return Ok(()); return Ok(());
} }

View File

@@ -33,7 +33,6 @@ pub struct AuraConfig {
} }
impl StdConfig for AuraConfig { impl StdConfig for AuraConfig {
/// Detect the keyboard type and load from default DB if data available
fn new() -> Self { fn new() -> Self {
panic!("This should not be used"); panic!("This should not be used");
} }

View File

@@ -25,30 +25,6 @@ pub struct Aura {
impl Aura { impl Aura {
/// Initialise the device if required. /// Initialise the device if required.
pub async fn do_initialization(&self) -> Result<(), RogError> { pub async fn do_initialization(&self) -> Result<(), RogError> {
if let Some(hid) = &self.hid {
let hid = hid.lock().await;
let init_1: [u8; 2] = [
0x5d, 0xb9,
];
let init_2 = b"]ASUS Tech.Inc.";
let init_3: [u8; 6] = [
0x5d, 0x05, 0x20, 0x31, 0, 0x1a,
];
hid.write_bytes(&init_1)?;
hid.write_bytes(init_2)?;
hid.write_bytes(&init_3)?;
let config = self.config.lock().await;
if config.support_data.device_name.contains("GZ30")
|| config.support_data.device_name.contains("Z13")
{
let z13_init: [u8; 4] = [
0x5d, 0xc0, 0x03, 0x01,
];
hid.write_bytes(&z13_init)?;
}
}
Ok(()) Ok(())
} }
@@ -176,54 +152,9 @@ impl Aura {
} }
} }
let mut enabled = config.enabled.clone(); let bytes = config.enabled.to_bytes(config.led_type);
if config.support_data.device_name.contains("GZ30")
|| config.support_data.device_name.contains("Z13")
{
let logo_state = enabled
.states
.iter()
.find(|s| s.zone == PowerZones::Logo)
.cloned();
if let Some(logo) = logo_state {
let mut lid_found = false;
let mut bar_found = false;
for s in enabled.states.iter_mut() {
if s.zone == PowerZones::Lid {
s.boot = logo.boot;
s.awake = logo.awake;
s.sleep = logo.sleep;
s.shutdown = logo.shutdown;
lid_found = true;
}
if s.zone == PowerZones::Lightbar {
s.boot = logo.boot;
s.awake = logo.awake;
s.sleep = logo.sleep;
s.shutdown = logo.shutdown;
bar_found = true;
}
}
if !lid_found {
let mut new_state = logo;
new_state.zone = PowerZones::Lid;
enabled.states.push(new_state.clone());
new_state.zone = PowerZones::Lightbar;
enabled.states.push(new_state);
} else if !bar_found {
// Lid found but not bar?
let mut new_state = logo;
new_state.zone = PowerZones::Lightbar;
enabled.states.push(new_state);
}
}
}
let bytes = enabled.to_bytes(config.led_type);
let msg = [ let msg = [
0x5d, 0xbd, 0x01, bytes[0], bytes[1], bytes[2], bytes[3], 0xff, 0x5d, 0xbd, 0x01, bytes[0], bytes[1], bytes[2], bytes[3],
]; ];
hid_raw.write_bytes(&msg)?; hid_raw.write_bytes(&msg)?;
} }

View File

@@ -182,7 +182,6 @@ impl AuraZbus {
self.0.set_brightness(config.brightness.into()).await?; self.0.set_brightness(config.brightness.into()).await?;
config.set_builtin(effect); config.set_builtin(effect);
config.write(); config.write();
Ok(()) Ok(())
} }
@@ -208,9 +207,10 @@ impl AuraZbus {
let mut config = self.0.config.lock().await; let mut config = self.0.config.lock().await;
for opt in options.states { for opt in options.states {
let zone = opt.zone; let zone = opt.zone;
for config in config.enabled.states.iter_mut() { for state in config.enabled.states.iter_mut() {
if config.zone == zone { if state.zone == zone {
*config = opt; *state = opt;
break;
} }
} }
} }

View File

@@ -196,6 +196,7 @@ impl DeviceHandle {
Some(Arc::new(Mutex::new(k))) Some(Arc::new(Mutex::new(k)))
}); });
// Load saved mode, colours, brightness, power from disk; apply on reload
let mut config = AuraConfig::load_and_update_config(prod_id); let mut config = AuraConfig::load_and_update_config(prod_id);
config.led_type = aura_type; config.led_type = aura_type;
let aura = Aura { let aura = Aura {

View File

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

View File

@@ -125,7 +125,7 @@
advanced_type: r#None, advanced_type: r#None,
power_zones: [Keyboard], power_zones: [Keyboard],
), ),
( (
device_name: "FX607V", device_name: "FX607V",
product_id: "", product_id: "",
layout_name: "fa506i", layout_name: "fa506i",
@@ -351,13 +351,13 @@
power_zones: [Keyboard, Lightbar, Logo, RearGlow], power_zones: [Keyboard, Lightbar, Logo, RearGlow],
), ),
( (
device_name: "G635L", device_name: "G635L",
product_id: "", product_id: "",
layout_name: "g635l-per-key", layout_name: "g635l-per-key",
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash], basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
basic_zones: [], basic_zones: [],
advanced_type: PerKey, advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo], power_zones: [Keyboard, Lightbar, Logo],
), ),
( (
device_name: "G712LI", device_name: "G712LI",
@@ -579,7 +579,7 @@
device_name: "G835L", device_name: "G835L",
product_id: "", product_id: "",
layout_name: "g814ji-per-key", 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: [], basic_zones: [],
advanced_type: PerKey, advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo], power_zones: [Keyboard, Lightbar, Logo],
@@ -980,24 +980,6 @@
advanced_type: r#None, advanced_type: r#None,
power_zones: [Keyboard], power_zones: [Keyboard],
), ),
(
device_name: "GZ302",
product_id: "18c6",
layout_name: "",
basic_modes: [Static, Breathe, Pulse],
basic_zones: [],
advanced_type: r#None,
power_zones: [Logo],
),
(
device_name: "GZ302",
product_id: "1a30",
layout_name: "ga401q",
basic_modes: [Static, Breathe, Pulse],
basic_zones: [],
advanced_type: r#None,
power_zones: [Keyboard],
),
( (
device_name: "RC71L", device_name: "RC71L",
product_id: "", product_id: "",
@@ -1016,4 +998,4 @@
advanced_type: r#None, advanced_type: r#None,
power_zones: [Ally], power_zones: [Ally],
), ),
]) ])

View File

@@ -123,8 +123,7 @@ impl AuraPowerState {
| ((self.shutdown as u32) << 7) | ((self.shutdown as u32) << 7)
} }
PowerZones::Lightbar => { PowerZones::Lightbar => {
((self.awake as u32) << (7 + 1)) ((self.boot as u32) << (7 + 2))
| ((self.boot as u32) << (7 + 2))
| ((self.awake as u32) << (7 + 3)) | ((self.awake as u32) << (7 + 3))
| ((self.sleep as u32) << (7 + 4)) | ((self.sleep as u32) << (7 + 4))
| ((self.shutdown as u32) << (7 + 5)) | ((self.shutdown as u32) << (7 + 5))
@@ -134,20 +133,12 @@ impl AuraPowerState {
| ((self.awake as u32) << (15 + 2)) | ((self.awake as u32) << (15 + 2))
| ((self.sleep as u32) << (15 + 3)) | ((self.sleep as u32) << (15 + 3))
| ((self.shutdown as u32) << (15 + 4)) | ((self.shutdown as u32) << (15 + 4))
| ((self.boot as u32) << (15 + 5))
| ((self.awake as u32) << (15 + 6))
| ((self.sleep as u32) << (15 + 7))
| ((self.shutdown as u32) << (15 + 8))
} }
PowerZones::RearGlow => { PowerZones::RearGlow => {
((self.boot as u32) << (23 + 1)) ((self.boot as u32) << (23 + 1))
| ((self.awake as u32) << (23 + 2)) | ((self.awake as u32) << (23 + 2))
| ((self.sleep as u32) << (23 + 3)) | ((self.sleep as u32) << (23 + 3))
| ((self.shutdown as u32) << (23 + 4)) | ((self.shutdown as u32) << (23 + 4))
| ((self.boot as u32) << (23 + 5))
| ((self.awake as u32) << (23 + 6))
| ((self.sleep as u32) << (23 + 7))
| ((self.shutdown as u32) << (23 + 8))
} }
PowerZones::None | PowerZones::KeyboardAndLightbar => 0, PowerZones::None | PowerZones::KeyboardAndLightbar => 0,
} }
@@ -627,19 +618,19 @@ mod test {
assert_eq!(shut_keyb_, "10000000, 00000000, 00000000, 00000000"); assert_eq!(shut_keyb_, "10000000, 00000000, 00000000, 00000000");
// //
assert_eq!(boot_bar__, "00000000, 00000010, 00000000, 00000000"); assert_eq!(boot_bar__, "00000000, 00000010, 00000000, 00000000");
assert_eq!(awake_bar_, "00000000, 00000101, 00000000, 00000000"); assert_eq!(awake_bar_, "00000000, 00000100, 00000000, 00000000");
assert_eq!(sleep_bar_, "00000000, 00001000, 00000000, 00000000"); assert_eq!(sleep_bar_, "00000000, 00001000, 00000000, 00000000");
assert_eq!(shut_bar__, "00000000, 00010000, 00000000, 00000000"); assert_eq!(shut_bar__, "00000000, 00010000, 00000000, 00000000");
// //
assert_eq!(boot_lid__, "00000000, 00000000, 00010001, 00000000"); assert_eq!(boot_lid__, "00000000, 00000000, 00000001, 00000000");
assert_eq!(awake_lid_, "00000000, 00000000, 00100010, 00000000"); assert_eq!(awake_lid_, "00000000, 00000000, 00000010, 00000000");
assert_eq!(sleep_lid_, "00000000, 00000000, 01000100, 00000000"); assert_eq!(sleep_lid_, "00000000, 00000000, 00000100, 00000000");
assert_eq!(shut_lid__, "00000000, 00000000, 10001000, 00000000"); assert_eq!(shut_lid__, "00000000, 00000000, 00001000, 00000000");
// //
assert_eq!(boot_rear_, "00000000, 00000000, 00000000, 00010001"); assert_eq!(boot_rear_, "00000000, 00000000, 00000000, 00000001");
assert_eq!(awake_rear, "00000000, 00000000, 00000000, 00100010"); assert_eq!(awake_rear, "00000000, 00000000, 00000000, 00000010");
assert_eq!(sleep_rear, "00000000, 00000000, 00000000, 01000100"); assert_eq!(sleep_rear, "00000000, 00000000, 00000000, 00000100");
assert_eq!(shut_rear_, "00000000, 00000000, 00000000, 10001000"); assert_eq!(shut_rear_, "00000000, 00000000, 00000000, 00001000");
// All on // All on
let byte1 = to_binary_string_post2021(&LaptopAuraPower { let byte1 = to_binary_string_post2021(&LaptopAuraPower {
@@ -666,6 +657,6 @@ mod test {
}, },
], ],
}); });
assert_eq!(byte1, "11111111, 00011111, 11111111, 11111111"); assert_eq!(byte1, "11111111, 00011110, 00001111, 00001111");
} }
} }

View File

@@ -106,10 +106,10 @@ impl From<&str> for AuraDeviceType {
match s.to_lowercase().trim_start_matches("0x") { match s.to_lowercase().trim_start_matches("0x") {
"tuf" => AuraDeviceType::LaptopKeyboardTuf, "tuf" => AuraDeviceType::LaptopKeyboardTuf,
"1932" => AuraDeviceType::ScsiExtDisk, "1932" => AuraDeviceType::ScsiExtDisk,
"1866" | "1869" | "1854" => Self::LaptopKeyboardPre2021, "1866" | "18c6" | "1869" | "1854" => Self::LaptopKeyboardPre2021,
"1abe" | "1b4c" => Self::Ally, "1abe" | "1b4c" => Self::Ally,
"19b3" | "193b" => Self::AnimeOrSlash, "19b3" | "193b" => Self::AnimeOrSlash,
"19b6" | "1a30" | "18c6" => Self::LaptopKeyboard2021, "19b6" => Self::LaptopKeyboard2021,
_ => Self::Unknown, _ => Self::Unknown,
} }
} }

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")] #[cfg(feature = "rog_ally")]
if is_rog_ally { if is_rog_ally {
config.notifications.enabled = false; config.notifications.enabled = false;
@@ -187,12 +193,18 @@ async fn main() -> Result<()> {
slint::init_translations!(concat!(env!("CARGO_MANIFEST_DIR"), "/translations/")); slint::init_translations!(concat!(env!("CARGO_MANIFEST_DIR"), "/translations/"));
} }
// Prefetch supported Aura modes once at startup and move into the
// spawned UI thread so the UI uses a stable, immutable list.
let prefetched_supported: std::sync::Arc<Option<Vec<i32>>> = std::sync::Arc::new(
rog_control_center::ui::setup_aura::prefetch_supported_basic_modes().await,
);
thread::spawn(move || { thread::spawn(move || {
let mut state = AppState::StartingUp; let mut state = AppState::StartingUp;
loop { loop {
if is_rog_ally { if is_rog_ally {
let config_copy_2 = config.clone(); let config_copy_2 = config.clone();
let newui = setup_window(config.clone()); let newui = setup_window(config.clone(), prefetched_supported.clone(), is_tuf);
newui.window().on_close_requested(move || { newui.window().on_close_requested(move || {
exit(0); exit(0);
}); });
@@ -233,6 +245,9 @@ async fn main() -> Result<()> {
let config_copy = config.clone(); let config_copy = config.clone();
let app_state_copy = app_state.clone(); let app_state_copy = app_state.clone();
// Avoid moving the original `prefetched_supported` into the
// closure — clone an Arc for the closure to capture.
let pref_for_invoke = prefetched_supported.clone();
slint::invoke_from_event_loop(move || { slint::invoke_from_event_loop(move || {
UI.with(|ui| { UI.with(|ui| {
let app_state_copy = app_state_copy.clone(); let app_state_copy = app_state_copy.clone();
@@ -247,7 +262,7 @@ async fn main() -> Result<()> {
}); });
} else { } else {
let config_copy_2 = config_copy.clone(); let config_copy_2 = config_copy.clone();
let newui = setup_window(config_copy); let newui = setup_window(config_copy, pref_for_invoke.clone(), is_tuf);
newui.window().on_close_requested(move || { newui.window().on_close_requested(move || {
if let Ok(mut app_state) = app_state_copy.lock() { if let Ok(mut app_state) = app_state_copy.lock() {
*app_state = AppState::MainWindowClosed; *app_state = AppState::MainWindowClosed;

View File

@@ -1,9 +1,14 @@
pub mod setup_anime; pub mod setup_anime;
pub mod setup_aura; pub mod setup_aura;
pub mod setup_fans; pub mod setup_fans;
pub mod setup_gpu;
pub mod setup_system; pub mod setup_system;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Duration;
static TOAST_SEQ: AtomicU64 = AtomicU64::new(0);
use config_traits::StdConfig; use config_traits::StdConfig;
use log::warn; use log::warn;
@@ -70,25 +75,61 @@ pub fn show_toast(
handle: Weak<MainWindow>, handle: Weak<MainWindow>,
result: zbus::Result<()>, 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 { match result {
Ok(_) => { 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>>) -> MainWindow { 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") slint::set_xdg_app_id("rog-control-center")
.map_err(|e| warn!("Couldn't set application ID: {e:?}")) .map_err(|e| warn!("Couldn't set application ID: {e:?}"))
.ok(); .ok();
let ui = MainWindow::new() let ui = MainWindow::new()
.map_err(|e| warn!("Couldn't create main window: {e:?}")) .map_err(|e| warn!("Couldn't create main window: {e:?}"))
.unwrap(); .unwrap();
// propagate TUF flag to the UI so the sidebar can swap logo branding
ui.set_is_tuf(is_tuf);
ui.window() ui.window()
.show() .show()
.map_err(|e| warn!("Couldn't show main window: {e:?}")) .map_err(|e| warn!("Couldn't show main window: {e:?}"))
@@ -119,15 +160,18 @@ pub fn setup_window(config: Arc<Mutex<Config>>) -> MainWindow {
setup_system_page_callbacks(&ui, config.clone()); setup_system_page_callbacks(&ui, config.clone());
} }
if available.contains(&"xyz.ljones.Aura".to_string()) { if available.contains(&"xyz.ljones.Aura".to_string()) {
setup_aura_page(&ui, config.clone()); setup_aura_page(&ui, config.clone(), prefetched_supported.as_ref().clone());
} }
if available.contains(&"xyz.ljones.Anime".to_string()) { if available.contains(&"xyz.ljones.Anime".to_string()) {
setup_anime_page(&ui, config.clone()); setup_anime_page(&ui, config.clone());
} }
if available.contains(&"xyz.ljones.FanCurves".to_string()) { 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 ui
} }

View File

@@ -34,63 +34,103 @@ fn decode_hex(s: &str) -> RgbaColor<u8> {
} }
} }
/// Returns the first available Aura interface
// TODO: return all
async fn find_aura_iface() -> Result<AuraProxy<'static>, Box<dyn std::error::Error>> { async fn find_aura_iface() -> Result<AuraProxy<'static>, Box<dyn std::error::Error>> {
let conn = zbus::Connection::system().await?; let conn = zbus::Connection::system().await?;
let f = zbus::fdo::ObjectManagerProxy::new(&conn, "xyz.ljones.Asusd", "/").await?; let mgr = zbus::fdo::ObjectManagerProxy::new(&conn, "xyz.ljones.Asusd", "/").await?;
let interfaces = f.get_managed_objects().await?; let objs = mgr.get_managed_objects().await?;
let mut aura_paths = Vec::new(); let mut paths: Vec<zbus::zvariant::OwnedObjectPath> = objs
for v in interfaces.iter() { .iter()
for k in v.1.keys() { .filter(|(_, ifaces)| ifaces.keys().any(|k| k.as_str() == "xyz.ljones.Aura"))
if k.as_str() == "xyz.ljones.Aura" { .map(|(p, _)| p.clone())
println!("Found aura device at {}, {}", v.0, k); .collect();
aura_paths.push(v.0.clone()); if paths.len() > 1 {
} log::debug!("Multiple aura devices: {paths:?}");
}
} }
if aura_paths.len() > 1 { let path = paths.pop().ok_or("No Aura interface")?;
println!("Multiple aura devices found: {aura_paths:?}"); AuraProxy::builder(&conn)
println!("TODO: enable selection"); .path(path)?
} .destination("xyz.ljones.Asusd")?
if let Some(path) = aura_paths.first() { .build()
return Ok(AuraProxy::builder(&conn) .await
.path(path.clone())? .map_err(Into::into)
.destination("xyz.ljones.Asusd")?
.build()
.await?);
}
Err("No Aura interface".into())
} }
pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) { pub async fn prefetch_supported_basic_modes() -> Option<Vec<i32>> {
ui.global::<AuraPageData>().on_cb_hex_from_colour(|c| { let proxy = find_aura_iface().await.ok()?;
let modes = proxy.supported_basic_modes().await.ok()?;
Some(modes.iter().map(|n| (*n).into()).collect())
}
pub fn setup_aura_page(
ui: &MainWindow,
_states: Arc<Mutex<Config>>,
prefetched_supported: Option<Vec<i32>>,
) {
let g = ui.global::<AuraPageData>();
g.on_cb_hex_from_colour(|c| {
format!("#{:02X}{:02X}{:02X}", c.red(), c.green(), c.blue()).into() format!("#{:02X}{:02X}{:02X}", c.red(), c.green(), c.blue()).into()
}); });
g.on_cb_hex_to_colour(|s| decode_hex(s.as_str()).into());
ui.global::<AuraPageData>()
.on_cb_hex_to_colour(|s| decode_hex(s.as_str()).into());
let handle = ui.as_weak(); let handle = ui.as_weak();
tokio::spawn(async move { tokio::spawn(async move {
let Ok(aura) = find_aura_iface().await else { let Ok(aura) = find_aura_iface().await else {
info!("This device appears to have no aura interfaces"); info!("No aura interfaces");
return Ok::<(), zbus::Error>(()); return Ok::<(), zbus::Error>(());
}; };
set_ui_props_async!(handle, aura, AuraPageData, brightness); set_ui_props_async!(handle, aura, AuraPageData, brightness);
set_ui_props_async!(handle, aura, AuraPageData, led_mode);
set_ui_props_async!(handle, aura, AuraPageData, led_mode_data);
set_ui_props_async!(handle, aura, AuraPageData, led_power); set_ui_props_async!(handle, aura, AuraPageData, led_power);
set_ui_props_async!(handle, aura, AuraPageData, device_type); set_ui_props_async!(handle, aura, AuraPageData, device_type);
let modes_vec: Vec<i32> = match prefetched_supported {
Some(p) => p,
None => aura
.supported_basic_modes()
.await
.ok()
.map(|m| m.iter().map(|n| (*n).into()).collect())
.unwrap_or_default(),
};
// Restore saved mode, colours, zone, speed, direction from asusd (persisted to disk).
// Use effect.mode as single source — avoid led_mode() which can fail (try_lock).
let restore = aura.led_mode_data().await.ok();
let raw_mode: Option<i32> = restore.as_ref().map(|d| d.mode.into());
let d_slint = restore.map(|d| d.into());
handle
.upgrade_in_event_loop(move |h| {
let names = h.global::<AuraPageData>().get_mode_names();
let mut raws = Vec::new();
let mut mode_names = Vec::new();
for (i, name) in names.iter().enumerate() {
let raw = i as i32;
if modes_vec.contains(&raw) && i != 9 {
raws.push(raw);
mode_names.push(name.clone());
}
}
h.global::<AuraPageData>()
.set_supported_basic_modes(raws.as_slice().into());
h.global::<AuraPageData>()
.set_available_mode_names(mode_names.as_slice().into());
if let Some(d) = d_slint {
h.global::<AuraPageData>().invoke_update_led_mode_data(d);
if let Some(cm) = raw_mode {
let idx = raws.iter().position(|&r| r == cm).unwrap_or(0) as i32;
h.global::<AuraPageData>().set_current_available_mode(idx);
}
h.invoke_external_colour_change();
}
})
.map_err(|e| error!("{e}"))
.ok();
if let Ok(mut pow3r) = aura.supported_power_zones().await { if let Ok(mut pow3r) = aura.supported_power_zones().await {
let dev_type = aura let dev = aura
.device_type() .device_type()
.await .await
.unwrap_or(AuraDeviceType::LaptopKeyboard2021); .unwrap_or(AuraDeviceType::LaptopKeyboard2021);
log::debug!("Available LED power modes {pow3r:?}");
handle handle
.upgrade_in_event_loop(move |handle| { .upgrade_in_event_loop(move |handle| {
let names: Vec<SharedString> = handle let names: Vec<SharedString> = handle
@@ -98,135 +138,103 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
.get_power_zone_names() .get_power_zone_names()
.iter() .iter()
.collect(); .collect();
if dev.is_old_laptop() {
if dev_type.is_old_laptop() {
// Need to add the specific KeyboardAndLightbar
if pow3r.contains(&PowerZones::Keyboard) if pow3r.contains(&PowerZones::Keyboard)
&& pow3r.contains(&PowerZones::Lightbar) && pow3r.contains(&PowerZones::Lightbar)
{ {
pow3r.push(PowerZones::KeyboardAndLightbar); pow3r.push(PowerZones::KeyboardAndLightbar);
} }
let names: Vec<SharedString> = let n: Vec<SharedString> =
pow3r.iter().map(|n| names[(*n) as usize].clone()).collect(); pow3r.iter().map(|z| names[(*z) as usize].clone()).collect();
handle handle
.global::<AuraPageData>() .global::<AuraPageData>()
.set_power_zone_names_old(names.as_slice().into()); .set_power_zone_names_old(n.as_slice().into());
} else { } else {
let power: Vec<SlintPowerZones> = let p: Vec<SlintPowerZones> = pow3r.iter().map(|z| (*z).into()).collect();
pow3r.iter().map(|p| (*p).into()).collect();
handle handle
.global::<AuraPageData>() .global::<AuraPageData>()
.set_supported_power_zones(power.as_slice().into()); .set_supported_power_zones(p.as_slice().into());
} }
}) })
.ok(); .ok();
} }
if let Ok(modes) = aura.supported_basic_modes().await { let proxy = aura.clone();
log::debug!("Available LED modes {modes:?}"); let weak = handle.clone();
handle
.upgrade_in_event_loop(move |handle| {
let m: Vec<i32> = modes.iter().map(|n| (*n).into()).collect();
handle
.global::<AuraPageData>()
.set_supported_basic_modes(m.as_slice().into());
// Get the translated names
let names = handle.global::<AuraPageData>().get_mode_names();
let res: Vec<SharedString> = names
.iter()
.enumerate()
.filter(|(n, _)| modes.contains(&(*n as i32).into()) && *n != 9)
.map(|(_, i)| i)
.collect();
handle
.global::<AuraPageData>()
.set_available_mode_names(res.as_slice().into());
})
.map_err(|e| error!("{e:}"))
.ok();
}
let proxy_copy = aura.clone();
handle handle
.upgrade_in_event_loop(move |handle| { .upgrade_in_event_loop(move |h| {
set_ui_callbacks!(handle, set_ui_callbacks!(h,
AuraPageData(.into()), AuraPageData(.into()),
proxy_copy.brightness(.into()), proxy.brightness(.into()),
"Keyboard LED brightness successfully set to {}", "Brightness set to {}",
"Setting keyboard LED brightness failed" "Brightness failed"
); );
set_ui_callbacks!(handle, let p = proxy.clone();
AuraPageData(.into()), let w = weak.clone();
proxy_copy.led_mode(.into()), h.global::<AuraPageData>().on_apply_led_mode_data(move || {
"Keyboard LED mode successfully set to {}", let Some(ui) = w.upgrade() else { return };
"Setting keyboard LEDmode failed" let slint_effect = ui.global::<AuraPageData>().get_led_mode_data();
); let raw: rog_aura::AuraEffect = slint_effect.into();
let pp = p.clone();
set_ui_callbacks!(handle, let t = w.clone();
AuraPageData(.into()), tokio::spawn(async move {
proxy_copy.led_mode_data(.into()), let r = pp.set_led_mode_data(raw).await;
"Keyboard LED mode set to {:?}", show_toast("LED mode applied".into(), "LED mode failed".into(), t, r);
"Setting keyboard LED mode failed"
);
// set_ui_callbacks!(handle,
// AuraPageData(.clone().into()),
// proxy_copy.led_power(.into()),
// "Keyboard LED power successfully set to {:?}",
// "Setting keyboard power failed"
// );
handle.invoke_external_colour_change();
})
.ok();
let handle_copy = handle.clone();
let proxy_copy = aura.clone();
handle
.upgrade_in_event_loop(|handle| {
handle
.global::<AuraPageData>()
.on_cb_led_power(move |power| {
let handle_copy = handle_copy.clone();
let proxy_copy = aura.clone();
let power: LaptopAuraPower = power.into();
tokio::spawn(async move {
show_toast(
"Aura power settings changed".into(),
"Failed to set Aura power settings".into(),
handle_copy,
proxy_copy.set_led_power(power).await,
);
});
}); });
});
h.invoke_external_colour_change();
}) })
.map_err(|e| error!("{e:}"))
.ok(); .ok();
// Need to update the UI if the mode changes let weak_power = handle.clone();
let handle_copy = handle.clone(); let proxy_power = aura.clone();
// spawn required since the while let never exits handle
.upgrade_in_event_loop(|h| {
h.global::<AuraPageData>().on_cb_led_power(move |power| {
let w = weak_power.clone();
let p = proxy_power.clone();
let pw: LaptopAuraPower = power.into();
tokio::spawn(async move {
show_toast(
"Aura power updated".into(),
"Aura power failed".into(),
w,
p.set_led_power(pw).await,
);
});
});
})
.map_err(|e| error!("{e}"))
.ok();
let stream_handle = handle.clone();
let aura_stream = aura.clone();
tokio::spawn(async move { tokio::spawn(async move {
let mut x = proxy_copy.receive_led_mode_data_changed().await;
use futures_util::StreamExt; use futures_util::StreamExt;
while let Some(e) = x.next().await { let mut stream = aura_stream.receive_led_mode_data_changed().await;
while let Some(e) = stream.next().await {
if let Ok(out) = e.get().await { if let Ok(out) = e.get().await {
handle_copy let raw: i32 = out.mode.into();
.upgrade_in_event_loop(move |handle| { let data = out.into();
handle stream_handle
.upgrade_in_event_loop(move |h| {
h.global::<AuraPageData>().invoke_update_led_mode_data(data);
let supported: Vec<i32> = h
.global::<AuraPageData>() .global::<AuraPageData>()
.invoke_update_led_mode_data(out.into()); .get_supported_basic_modes()
handle.invoke_external_colour_change(); .iter()
.collect();
let idx = supported.iter().position(|&x| x == raw).unwrap_or(0) as i32;
h.global::<AuraPageData>().set_current_available_mode(idx);
h.invoke_external_colour_change();
}) })
.map_err(|e| error!("{e:}")) .map_err(|e| error!("{e}"))
.ok(); .ok();
} }
} }
}); });
debug!("Aura setup tasks complete"); debug!("Aura setup done");
Ok(()) Ok(())
}); });
} }

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_platform_profile(-1);
ui.global::<SystemPageData>().set_panel_overdrive(-1); ui.global::<SystemPageData>().set_panel_overdrive(-1);
ui.global::<SystemPageData>().set_boot_sound(-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_screen_auto_brightness(-1);
ui.global::<SystemPageData>().set_mcu_powersave(-1); ui.global::<SystemPageData>().set_mcu_powersave(-1);
ui.global::<SystemPageData>().set_mini_led_mode(-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_callback!(boot_sound, handle, attr, i32);
setup_external!(boot_sound, i32, handle, attr, value) 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 => { FirmwareAttribute::ScreenAutoBrightness => {
init_property!(screen_auto_brightness, handle, value, i32); init_property!(screen_auto_brightness, handle, value, i32);
setup_callback!(screen_auto_brightness, handle, attr, 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 { PageAnime, AnimePageData } from "pages/anime.slint";
import { RogItem } from "widgets/common.slint"; import { RogItem } from "widgets/common.slint";
import { PageAura } from "pages/aura.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"; import { Node } from "widgets/graph.slint";
export { Node } export { Node }
import { FanPageData, FanType, Profile } from "types/fan_types.slint"; 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 } export { AuraPageData, AuraDevType, LaptopAuraPower, AuraPowerState, PowerZones, AuraEffect }
import { PageAppSettings, AppSettingsPageData } from "pages/app_settings.slint"; 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 { export component MainWindow inherits Window {
title: "ROG Control"; title: "ROG Control";
@@ -35,6 +35,8 @@ export component MainWindow inherits Window {
true, // About true, // About
]; ];
private property <bool> show_notif; 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> fade_cover;
private property <bool> toast: false; private property <bool> toast: false;
private property <string> toast_text: "I show when something is waiting"; private property <string> toast_text: "I show when something is waiting";
@@ -43,6 +45,13 @@ export component MainWindow inherits Window {
toast = text != ""; toast = text != "";
toast_text = 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 exit-app();
callback show_notification(bool); callback show_notification(bool);
show_notification(yes) => { show_notification(yes) => {
@@ -73,6 +82,7 @@ export component MainWindow inherits Window {
@tr("Menu7" => "About"), @tr("Menu7" => "About"),
]; ];
available: root.sidebar_items_avilable; available: root.sidebar_items_avilable;
is_tuf: root.is_tuf;
} }
Button { Button {
@@ -94,31 +104,37 @@ export component MainWindow inherits Window {
/*if(side-bar.current-item == 1):*/ aura := PageAura { /*if(side-bar.current-item == 1):*/ aura := PageAura {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 1; visible: side-bar.current-item == 1;
} }
if(side-bar.current-item == 2): PageAnime { if(side-bar.current-item == 2): PageAnime {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 2; visible: side-bar.current-item == 2;
} }
if(side-bar.current-item == 3): fans := PageFans { if(side-bar.current-item == 3): fans := PageFans {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 3; visible: side-bar.current-item == 3;
} }
if(side-bar.current-item == 4): PageGPU { if(side-bar.current-item == 4): PageGPU {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 4; visible: side-bar.current-item == 4;
} }
if(side-bar.current-item == 5): PageAppSettings { if(side-bar.current-item == 5): PageAppSettings {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 5; visible: side-bar.current-item == 5;
} }
if(side-bar.current-item == 6): PageAbout { if(side-bar.current-item == 6): PageAbout {
width: root.width - side-bar.width; width: root.width - side-bar.width;
height: root.height + 12px;
visible: side-bar.current-item == 6; visible: side-bar.current-item == 6;
} }

View File

@@ -42,10 +42,14 @@ export component PageAura inherits Rectangle {
current_value: AuraPageData.available_mode_names[self.current-index]; current_value: AuraPageData.available_mode_names[self.current-index];
model <=> AuraPageData.available_mode_names; model <=> AuraPageData.available_mode_names;
selected => { selected => {
AuraPageData.led_mode_data.mode = AuraPageData.led_mode; AuraPageData.apply_effect({
AuraPageData.led_mode_data.mode = AuraPageData.current_available_mode; mode: AuraPageData.supported_basic_modes[self.current-index],
self.current_value = AuraPageData.available_mode_names[self.current-index]; zone: AuraPageData.led_mode_data.zone,
AuraPageData.cb_led_mode(AuraPageData.current_available_mode); colour1: AuraPageData.led_mode_data.colour1,
colour2: AuraPageData.led_mode_data.colour2,
speed: AuraPageData.led_mode_data.speed,
direction: AuraPageData.led_mode_data.direction,
});
} }
} }
} }
@@ -62,47 +66,44 @@ export component PageAura inherits Rectangle {
vertical-alignment: TextVerticalAlignment.center; vertical-alignment: TextVerticalAlignment.center;
horizontal-alignment: TextHorizontalAlignment.center; horizontal-alignment: TextHorizontalAlignment.center;
} }
HorizontalBox { HorizontalBox {
c1 := ColourSlider { c1 := ColourSlider {
enabled: AuraPageData.led_mode == 0 || AuraPageData.led_mode == 1 || AuraPageData.led_mode == 4 || AuraPageData.led_mode == 6 || AuraPageData.led_mode == 7 || AuraPageData.led_mode == 8 || AuraPageData.led_mode == 10 || AuraPageData.led_mode == 11 || AuraPageData.led_mode == 12; enabled: AuraPageData.colour1_enabled;
final_colour <=> AuraPageData.color1; final_colour <=> AuraPageData.color1;
colourbox <=> AuraPageData.colorbox1; colourbox <=> AuraPageData.colorbox1;
set_hex_from_colour(c1) => { set_hex_from_colour(c) => { return AuraPageData.cb_hex_from_colour(c); }
return AuraPageData.cb_hex_from_colour(c1); hex_to_colour(s) => { return AuraPageData.cb_hex_to_colour(s); }
}
hex_to_colour(s) => {
return AuraPageData.cb_hex_to_colour(s);
}
released => { released => {
AuraPageData.led_mode_data.colour1 = AuraPageData.color1; AuraPageData.apply_effect({
AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); mode: AuraPageData.led_mode_data.mode,
zone: AuraPageData.led_mode_data.zone,
colour1: AuraPageData.color1,
colour2: AuraPageData.led_mode_data.colour2,
speed: AuraPageData.led_mode_data.speed,
direction: AuraPageData.led_mode_data.direction,
});
} }
} }
} }
} }
VerticalBox { VerticalBox {
Text { Text { text: @tr("Colour 2"); vertical-alignment: TextVerticalAlignment.center; horizontal-alignment: TextHorizontalAlignment.center; }
text: @tr("Colour 2");
vertical-alignment: TextVerticalAlignment.center;
horizontal-alignment: TextHorizontalAlignment.center;
}
HorizontalBox { HorizontalBox {
c2 := ColourSlider { c2 := ColourSlider {
enabled: AuraPageData.led_mode == 1 || AuraPageData.led_mode == 4; enabled: AuraPageData.colour2_enabled;
final_colour <=> AuraPageData.color2; final_colour <=> AuraPageData.color2;
colourbox <=> AuraPageData.colorbox2; colourbox <=> AuraPageData.colorbox2;
set_hex_from_colour(c1) => { set_hex_from_colour(c) => { return AuraPageData.cb_hex_from_colour(c); }
return AuraPageData.cb_hex_from_colour(c1); hex_to_colour(s) => { return AuraPageData.cb_hex_to_colour(s); }
}
hex_to_colour(s) => {
return AuraPageData.cb_hex_to_colour(s);
}
released => { released => {
AuraPageData.led_mode_data.colour2 = AuraPageData.color2; AuraPageData.apply_effect({
AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); mode: AuraPageData.led_mode_data.mode,
zone: AuraPageData.led_mode_data.zone,
colour1: AuraPageData.led_mode_data.colour1,
colour2: AuraPageData.color2,
speed: AuraPageData.led_mode_data.speed,
direction: AuraPageData.led_mode_data.direction,
});
} }
} }
} }
@@ -116,63 +117,63 @@ export component PageAura inherits Rectangle {
max-height: 90px; max-height: 90px;
RogItem { RogItem {
VerticalBox { VerticalBox {
Text { Text { text: @tr("Zone"); vertical-alignment: TextVerticalAlignment.center; horizontal-alignment: TextHorizontalAlignment.center; }
text: @tr("Zone");
vertical-alignment: TextVerticalAlignment.center;
horizontal-alignment: TextHorizontalAlignment.center;
}
ComboBox { ComboBox {
// enabled: AuraPageData.led_mode == ; enabled: false;
enabled: false;
current_index <=> AuraPageData.zone; current_index <=> AuraPageData.zone;
current_value: AuraPageData.zone_names[self.current-index]; current_value: AuraPageData.zone_names[self.current-index];
model <=> AuraPageData.zone_names; model <=> AuraPageData.zone_names;
selected => { selected => {
AuraPageData.led_mode_data.zone = self.current-index; AuraPageData.apply_effect({
AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); mode: AuraPageData.led_mode_data.mode,
zone: self.current-index,
colour1: AuraPageData.led_mode_data.colour1,
colour2: AuraPageData.led_mode_data.colour2,
speed: AuraPageData.led_mode_data.speed,
direction: AuraPageData.led_mode_data.direction,
});
} }
} }
} }
} }
RogItem { RogItem {
VerticalBox { VerticalBox {
Text { Text { text: @tr("Direction"); vertical-alignment: TextVerticalAlignment.center; horizontal-alignment: TextHorizontalAlignment.center; }
text: @tr("Direction");
vertical-alignment: TextVerticalAlignment.center;
horizontal-alignment: TextHorizontalAlignment.center;
}
ComboBox { ComboBox {
enabled: AuraPageData.led_mode == 3; enabled: AuraPageData.direction_enabled;
current_index <=> AuraPageData.direction; current_index <=> AuraPageData.direction;
current_value: AuraPageData.direction_names[self.current-index]; current_value: AuraPageData.direction_names[self.current-index];
model <=> AuraPageData.direction_names; model <=> AuraPageData.direction_names;
selected => { selected => {
AuraPageData.led_mode_data.direction = self.current-index; AuraPageData.apply_effect({
AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); mode: AuraPageData.led_mode_data.mode,
zone: AuraPageData.led_mode_data.zone,
colour1: AuraPageData.led_mode_data.colour1,
colour2: AuraPageData.led_mode_data.colour2,
speed: AuraPageData.led_mode_data.speed,
direction: self.current-index,
});
} }
} }
} }
} }
RogItem { RogItem {
VerticalBox { VerticalBox {
Text { Text { text: @tr("Speed"); vertical-alignment: TextVerticalAlignment.center; horizontal-alignment: TextHorizontalAlignment.center; }
text: @tr("Speed");
vertical-alignment: TextVerticalAlignment.center;
horizontal-alignment: TextHorizontalAlignment.center;
}
ComboBox { ComboBox {
enabled: AuraPageData.led_mode == 1 || AuraPageData.led_mode == 2 || AuraPageData.led_mode == 3 || AuraPageData.led_mode == 4 || AuraPageData.led_mode == 5 || AuraPageData.led_mode == 6 || AuraPageData.led_mode == 7 || AuraPageData.led_mode == 8; enabled: AuraPageData.speed_enabled;
current_index <=> AuraPageData.speed; current_index <=> AuraPageData.speed;
current_value: AuraPageData.speed_names[self.current-index]; current_value: AuraPageData.speed_names[self.current-index];
model <=> AuraPageData.speed_names; model <=> AuraPageData.speed_names;
selected => { selected => {
AuraPageData.led_mode_data.speed = self.current-index; AuraPageData.apply_effect({
AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); mode: AuraPageData.led_mode_data.mode,
zone: AuraPageData.led_mode_data.zone,
colour1: AuraPageData.led_mode_data.colour1,
colour2: AuraPageData.led_mode_data.colour2,
speed: self.current-index,
direction: AuraPageData.led_mode_data.direction,
});
} }
} }
} }
@@ -237,15 +238,47 @@ export component PageAura inherits Rectangle {
} }
} }
} }
}
}
Button { // TUF devices: show the same configurable power groups as `New`, since
x: root.width - self.width - 6px; // `setup_aura` fills `AuraPageData.supported_power_zones` and `led_power`
y: 6px; // appropriately for TUF devices. This ensures the Power Settings panel
text: "✕"; // reflects what the firmware reports for TUF models.
height: 36px; if root.show_aura_power && AuraPageData.device_type == AuraDevType.Tuf: Rectangle {
clicked => { background: Palette.background;
root.show_aura_power = false; width: 100%;
root.show_fade_cover = false; 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);
}
} }
} }
} }
@@ -291,17 +324,17 @@ export component PageAura inherits Rectangle {
} }
} }
} }
}
}
Button { if root.show_aura_power: Button {
x: root.width - self.width - 6px; x: root.width - self.width - 6px;
y: 6px; y: 6px;
text: "✕"; text: "✕";
height: 36px; height: 36px;
clicked => { clicked => {
root.show_aura_power = false; root.show_aura_power = false;
root.show_fade_cover = 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> gpu_mux_mode: 1; // 0 = Ultra/Discreet, 1 = Integrated/Optimus
in-out property <int> dgpu_disabled: 0; // 1 == dGPU disabled in-out property <int> dgpu_disabled: 0; // 1 == dGPU disabled
in-out property <int> egpu_enabled: 0; // 1 == eGPU (XGMobile) enabled in-out property <int> egpu_enabled: 0; // 1 == eGPU (XGMobile) enabled
in-out property <[string]> gpu_modes_choises: [@tr("Ultra"), @tr("Integrated")]; in-out property <[string]> gpu_modes_choises: [@tr("Integrated"), @tr("Hybrid")];
callback cb_gpu_mux_mode(int); in-out property <bool> gpu_mux_available: false;
callback cb_dgpu_disabled(int); callback cb_set_gpu_mode(int);
callback cb_egpu_enabled(int);
} }
export component PageGPU inherits Rectangle { export component PageGPU inherits Rectangle {
@@ -19,18 +18,63 @@ export component PageGPU inherits Rectangle {
ScrollView { ScrollView {
VerticalLayout { VerticalLayout {
padding: 10px; padding: 12px;
spacing: 10px; spacing: 8px;
SystemDropdown {
text: @tr("GPU mode"); Rectangle {
current_index <=> GPUPageData.gpu_mux_mode; background: Palette.alternate-background;
current_value: GPUPageData.gpu_modes_choises[GPUPageData.gpu_mux_mode]; border-color: Palette.border;
model <=> GPUPageData.gpu_modes_choises; border-width: 1px;
selected => { border-radius: 2px;
GPUPageData.cb_gpu_mux_mode(0); height: 36px;
GPUPageData.cb_gpu_mux_mode(1); Text {
font-size: 16px;
color: Palette.control-foreground;
horizontal-alignment: TextHorizontalAlignment.center;
text: @tr("Coming Soon: GPU Configuration");
} }
} }
/*
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); callback cb_panel_overdrive(int);
in-out property <int> boot_sound; in-out property <int> boot_sound;
callback cb_boot_sound(int); 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; in-out property <int> screen_auto_brightness;
callback cb_screen_auto_brightness(int); callback cb_screen_auto_brightness(int);
in-out property <int> mcu_powersave; 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 { Rectangle {
background: Palette.alternate-background; background: Palette.alternate-background;
border-color: Palette.border; border-color: Palette.border;
@@ -634,7 +566,7 @@ export component PageSystem inherits Rectangle {
} }
SystemDropdown { 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_index <=> SystemPageData.profile_quiet_epp;
current_value: SystemPageData.energy_performance_choices[SystemPageData.profile_quiet_epp]; current_value: SystemPageData.energy_performance_choices[SystemPageData.profile_quiet_epp];
model <=> SystemPageData.energy_performance_choices; model <=> SystemPageData.energy_performance_choices;

View File

@@ -46,8 +46,10 @@ export struct LaptopAuraPower {
states: [AuraPowerState], states: [AuraPowerState],
} }
// Modes with colour1: Static,Breathe,Star,Rain,Highlight,Laser,Ripple,Pulse,Comet,Flash (excl. Strobe,Rainbow,Nothing)
// Modes with colour2: Breathe, Star only.
// Speed: Breathe,Strobe,Rainbow,Star,Rain,Highlight,Laser,Ripple. Direction: Rainbow only.
export global AuraPageData { export global AuraPageData {
// The ordering must match the rog-aura crate
in-out property <[string]> power_zone_names: [ in-out property <[string]> power_zone_names: [
@tr("Aura power zone" => "Logo"), @tr("Aura power zone" => "Logo"),
@tr("Aura power zone" => "Keyboard"), @tr("Aura power zone" => "Keyboard"),
@@ -87,15 +89,9 @@ export global AuraPageData {
@tr("Basic aura mode" => "Comet"), @tr("Basic aura mode" => "Comet"),
@tr("Basic aura mode" => "Flash"), @tr("Basic aura mode" => "Flash"),
]; ];
in-out property <[string]> available_mode_names: [ in-out property <[string]> available_mode_names: [ @tr("Basic aura mode" => "Static"), @tr("Basic aura mode" => "Breathe"), @tr("Basic aura mode" => "Strobe") ];
@tr("Basic aura mode" => "Static"),
@tr("Basic aura mode" => "Breathe"),
@tr("Basic aura mode" => "Strobe"),
];
in-out property <int> current_available_mode: 0; in-out property <int> current_available_mode: 0;
in-out property <[int]> supported_basic_modes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12]; in-out property <[int]> supported_basic_modes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12];
in-out property <int> led_mode;
callback cb_led_mode(int);
in-out property <[string]> zone_names: [ in-out property <[string]> zone_names: [
@tr("Aura zone" => "None"), @tr("Aura zone" => "None"),
@tr("Aura zone" => "Key1"), @tr("Aura zone" => "Key1"),
@@ -106,51 +102,57 @@ export global AuraPageData {
@tr("Aura zone" => "Lightbar Left"), @tr("Aura zone" => "Lightbar Left"),
@tr("Aura zone" => "Lightbar Right"), @tr("Aura zone" => "Lightbar Right"),
]; ];
in-out property <int> zone;
in-out property <[string]> direction_names: [ in-out property <[string]> direction_names: [
@tr("Aura direction" => "Right"), @tr("Aura direction" => "Right"),
@tr("Aura direction" => "Left"), @tr("Aura direction" => "Left"),
@tr("Aura direction" => "Up"), @tr("Aura direction" => "Up"),
@tr("Aura direction" => "Down"), @tr("Aura direction" => "Down"),
]; ];
in-out property <int> direction;
in-out property <[string]> speed_names: [ in-out property <[string]> speed_names: [
@tr("Aura speed" => "Low"), @tr("Aura speed" => "Low"),
@tr("Aura speed" => "Medium"), @tr("Aura speed" => "Medium"),
@tr("Aura speed" => "High"), @tr("Aura speed" => "High"),
]; ];
in-out property <int> speed;
in-out property <AuraEffect> led_mode_data: { in-out property <AuraEffect> led_mode_data: {
mode: 0, mode: 0,
zone: 0, zone: 0,
colour1: Colors.aquamarine, colour1: Colors.aquamarine,
colourbox1: Colors.aquamarine,
colour2: Colors.hotpink, colour2: Colors.hotpink,
colourbox2: Colors.hotpink,
speed: 0, speed: 0,
direction: 0, direction: 0,
}; };
callback cb_led_mode_data(AuraEffect);
in-out property <color> color1; in-out property <color> color1;
in-out property <brush> colorbox1; in-out property <brush> colorbox1;
in-out property <color> color2; in-out property <color> color2;
in-out property <brush> colorbox2; in-out property <brush> colorbox2;
out property <bool> colour1_enabled: led_mode_data.mode == 0 || led_mode_data.mode == 1 || led_mode_data.mode == 4 || led_mode_data.mode == 6 || led_mode_data.mode == 7 || led_mode_data.mode == 8 || led_mode_data.mode == 10 || led_mode_data.mode == 11 || led_mode_data.mode == 12;
out property <bool> colour2_enabled: led_mode_data.mode == 1 || led_mode_data.mode == 4;
out property <bool> speed_enabled: led_mode_data.mode == 1 || led_mode_data.mode == 2 || led_mode_data.mode == 3 || led_mode_data.mode == 4 || led_mode_data.mode == 5 || led_mode_data.mode == 6 || led_mode_data.mode == 7 || led_mode_data.mode == 8;
out property <bool> direction_enabled: led_mode_data.mode == 3;
callback apply_led_mode_data();
callback apply_effect(AuraEffect);
apply_effect(e) => { led_mode_data = e; apply_led_mode_data(); }
in-out property <int> zone;
in-out property <int> speed;
in-out property <int> direction;
callback update_led_mode_data(AuraEffect); callback update_led_mode_data(AuraEffect);
update_led_mode_data(data) => { update_led_mode_data(d) => {
led_mode_data = data; led_mode_data = d;
current_available_mode = data.mode; zone = d.zone;
zone = data.zone; speed = d.speed;
speed = data.speed; direction = d.direction;
direction = data.direction; color1 = d.colour1;
color1 = data.colour1; color2 = d.colour2;
color2 = data.colour2; colorbox1 = d.colour1;
colorbox1 = data.colour1; colorbox2 = d.colour2;
colorbox2 = data.colour2;
} }
callback cb_hex_from_colour(color) -> string; callback cb_hex_from_colour(color) -> string;
callback cb_hex_to_colour(string) -> color; callback cb_hex_to_colour(string) -> color;
in-out property <AuraDevType> device_type: AuraDevType.Old; in-out property <AuraDevType> device_type: AuraDevType.Old;
// List of indexes to power_zone_names. Must correspond to rog-aura crate
in-out property <[PowerZones]> supported_power_zones: [ in-out property <[PowerZones]> supported_power_zones: [
PowerZones.Keyboard, PowerZones.Keyboard,
PowerZones.Lightbar, PowerZones.Lightbar,

View File

@@ -52,6 +52,7 @@ component SideBarItem inherits Rectangle {
export component SideBar inherits Rectangle { export component SideBar inherits Rectangle {
in property <[string]> model: []; in property <[string]> model: [];
in property <[bool]> available: []; in property <[bool]> available: [];
in property <bool> is_tuf: false;
out property <int> current-item: 0; out property <int> current-item: 0;
out property <int> current-focused: fs.has-focus ? fs.focused-tab : -1; out property <int> current-focused: fs.has-focus ? fs.focused-tab : -1;
@@ -99,6 +100,9 @@ export component SideBar inherits Rectangle {
Image { Image {
height: 100px; 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"); source: @image-url("../../data/rog-control-center.png");
horizontal-alignment: center; horizontal-alignment: center;
image-fit: contain; image-fit: contain;

View File

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

View File

@@ -162,6 +162,7 @@ impl CurveData {
/// Write this curve to the device fan specified by `self.fan` /// Write this curve to the device fan specified by `self.fan`
pub fn write_to_device(&self, device: &mut Device) -> std::io::Result<()> { pub fn write_to_device(&self, device: &mut Device) -> std::io::Result<()> {
let pwm_num: char = self.fan.into(); let pwm_num: char = self.fan.into();
let enable = if self.enabled { '1' } else { '2' };
for (index, out) in self.pwm.iter().enumerate() { for (index, out) in self.pwm.iter().enumerate() {
let pwm = pwm_str(pwm_num, index); let pwm = pwm_str(pwm_num, index);
@@ -175,20 +176,10 @@ impl CurveData {
device.set_attribute_value(&temp, out.to_string())?; device.set_attribute_value(&temp, out.to_string())?;
} }
// Note: pwm_enable is set by write_profile_curve_to_platform after all // Enable must be done *after* all points are written pwm3_enable
// curves are written, because on some devices (e.g., ASUS Z13 2025)
// setting any pwm_enable to 2 resets ALL fan enables.
Ok(())
}
/// Set the enable state for this fan curve
pub fn set_enable(&self, device: &mut Device) -> std::io::Result<()> {
let pwm_num: char = self.fan.into();
let enable = if self.enabled { "1" } else { "2" };
let enable_attr = format!("pwm{pwm_num}_enable");
device device
.set_attribute_value(&enable_attr, enable.to_string()) .set_attribute_value(format!("pwm{pwm_num}_enable"), enable.to_string())
.map_err(|e| error!("Failed to set {enable_attr} to {enable}: {e:?}")) .map_err(|e| error!("Failed to set pwm{pwm_num}_enable to {enable}: {e:?}"))
.ok(); .ok();
Ok(()) Ok(())
} }

View File

@@ -181,29 +181,15 @@ impl FanCurveProfiles {
PlatformProfile::Quiet | PlatformProfile::LowPower => &mut self.quiet, PlatformProfile::Quiet | PlatformProfile::LowPower => &mut self.quiet,
PlatformProfile::Custom => &mut self.custom, PlatformProfile::Custom => &mut self.custom,
}; };
for fan in fans.iter().filter(|f| !f.enabled) {
// First write all curve data (pwm/temp values) for all fans debug!("write_profile_curve_to_platform: writing profile:{profile}, {fan:?}");
for fan in fans.iter() {
debug!("write_profile_curve_to_platform: writing curve data for profile:{profile}, {fan:?}");
fan.write_to_device(device)?; fan.write_to_device(device)?;
} }
// Write enabled fans last because the kernel currently resets *all* if one is
// Then set enables: disabled fans first, then enabled fans last. // disabled
// This order is important because on some devices (e.g., ASUS Z13 2025)
// setting any pwm_enable to 2 (disabled) resets ALL fan enables.
for fan in fans.iter().filter(|f| !f.enabled) {
debug!(
"write_profile_curve_to_platform: disabling fan for profile:{profile}, {:?}",
fan.fan
);
fan.set_enable(device)?;
}
for fan in fans.iter().filter(|f| f.enabled) { for fan in fans.iter().filter(|f| f.enabled) {
debug!( debug!("write_profile_curve_to_platform: writing profile:{profile}, {fan:?}");
"write_profile_curve_to_platform: enabling fan for profile:{profile}, {:?}", fan.write_to_device(device)?;
fan.fan
);
fan.set_enable(device)?;
} }
Ok(()) Ok(())
} }