diff --git a/Cargo.lock b/Cargo.lock index 0853c328..4ea0891b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.20" @@ -115,6 +121,23 @@ version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -394,6 +417,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "axum" version = "0.7.9" @@ -468,26 +514,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "betrayer" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d203a32f00dea0d6d76c3547bb70fbcfa7fd45da8f7eff13f9688783c915c0f" -dependencies = [ - "async-io", - "block2", - "flume", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "parking_lot", - "png", - "windows-result 0.2.0", - "windows-sys 0.59.0", - "zbus 5.1.1", -] - [[package]] name = "bindgen" version = "0.69.5" @@ -532,6 +558,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block" version = "0.1.6" @@ -578,6 +610,12 @@ dependencies = [ "cfg_aliases", ] +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -699,6 +737,16 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -1496,18 +1544,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1618,6 +1654,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -1638,6 +1685,7 @@ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -1695,10 +1743,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -2494,7 +2540,29 @@ checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif 0.13.1", + "image-webp", "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +dependencies = [ + "byteorder-lite", + "quick-error", ] [[package]] @@ -2579,6 +2647,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -2680,6 +2759,24 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "ksni" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc9a5e60d55371fd681051b05e9b58e1d818f5085f6364afe872c9347311f91" +dependencies = [ + "async-executor", + "async-io", + "async-lock", + "futures-channel", + "futures-lite", + "futures-util", + "once_cell", + "paste", + "serde", + "zbus 5.1.1", +] + [[package]] name = "kurbo" version = "0.11.1" @@ -2720,6 +2817,16 @@ version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +[[package]] +name = "libfuzzer-sys" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.5" @@ -2824,16 +2931,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.22" @@ -2850,6 +2947,15 @@ dependencies = [ "zbus 5.1.1", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru" version = "0.12.5" @@ -2934,6 +3040,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3029,15 +3145,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "ndk" version = "0.9.0" @@ -3068,6 +3175,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -3091,6 +3204,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify-rust" version = "4.11.3" @@ -3104,12 +3223,53 @@ dependencies = [ "zbus 4.4.0", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3436,29 +3596,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.7", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "paste" version = "1.0.15" @@ -3637,6 +3774,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.89", +] + [[package]] name = "prost" version = "0.13.3" @@ -3678,6 +3834,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.31.0" @@ -3735,6 +3897,56 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -3873,7 +4085,6 @@ name = "rog-control-center" version = "6.0.12" dependencies = [ "asusd", - "betrayer", "cargo-husky", "concat-idents", "config-traits", @@ -3882,6 +4093,8 @@ dependencies = [ "dmi_id", "env_logger", "gumdrop", + "image 0.25.5", + "ksni", "log", "nix", "notify-rust", @@ -4174,7 +4387,7 @@ checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3" dependencies = [ "cfg-if", "libc", - "version-compare", + "version-compare 0.1.1", ] [[package]] @@ -4276,6 +4489,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simplecss" version = "0.2.1" @@ -4495,15 +4717,6 @@ dependencies = [ "x11rb", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spin_on" version = "0.1.1" @@ -4635,6 +4848,19 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare 0.2.0", +] + [[package]] name = "tar" version = "0.4.43" @@ -4646,6 +4872,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tauri-winrt-notification" version = "0.2.1" @@ -5261,6 +5493,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" @@ -5279,6 +5522,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -6341,6 +6590,12 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -6350,6 +6605,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.2.0" diff --git a/data/icons/asus_notif_red.png b/data/icons/asus_notif_red.png index acf2271e..6cc77c20 100644 Binary files a/data/icons/asus_notif_red.png and b/data/icons/asus_notif_red.png differ diff --git a/rog-control-center/Cargo.toml b/rog-control-center/Cargo.toml index aa7dfed3..cd28a581 100644 --- a/rog-control-center/Cargo.toml +++ b/rog-control-center/Cargo.toml @@ -20,7 +20,8 @@ console-subscriber = { version = "^0.4", optional = true } nix = { version = "^0.29.0", features = ["fs"] } tempfile = "3.3.0" -betrayer = { version = "0.3.0" } +ksni = { version = "0.3", default-features = false, features = ["async-io"] } +image = "0.25.5" asusd = { path = "../asusd" } config-traits = { path = "../config-traits" } diff --git a/rog-control-center/src/tray.rs b/rog-control-center/src/tray.rs index 84132982..8d7afcce 100644 --- a/rog-control-center/src/tray.rs +++ b/rog-control-center/src/tray.rs @@ -4,16 +4,15 @@ use std::fs::OpenOptions; use std::io::{Read, Write}; use std::path::{Path, PathBuf}; -use std::process::exit; use std::sync::{Arc, Mutex, OnceLock}; -use std::thread::sleep; use std::time::Duration; -use betrayer::{Icon, Menu, MenuItem, TrayEvent, TrayIcon, TrayIconBuilder}; -use log::{debug, error, info, warn}; +use ksni::{Handle, Icon, TrayMethods}; +// use betrayer::{Icon, Menu, MenuItem, TrayEvent, TrayIcon, TrayIconBuilder}; +use log::{error, info, warn}; use rog_platform::platform::Properties; use supergfxctl::pci_device::{Device, GfxMode, GfxPower}; -use supergfxctl::zbus_proxy::DaemonProxyBlocking as GfxProxy; +use supergfxctl::zbus_proxy::DaemonProxy as GfxProxy; use versions::Versioning; use crate::config::Config; @@ -32,27 +31,12 @@ struct Icons { static ICONS: OnceLock = OnceLock::new(); -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -enum TrayAction { - Open, - Quit, -} - -fn open_app() { +fn toggle_app(open: bool) { if let Ok(mut ipc) = get_ipc_file().map_err(|e| { error!("ROGTray: get_ipc_file: {}", e); }) { - debug!("Tray told app to show self"); - ipc.write_all(&[SHOW_GUI, 0]).ok(); - } -} - -fn quit_app() { - if let Ok(mut ipc) = get_ipc_file().map_err(|e| { - error!("ROGTray: get_ipc_file: {}", e); - }) { - debug!("Tray told app to show self"); - ipc.write_all(&[QUIT_APP, 0]).ok(); + let action = if open { SHOW_GUI } else { QUIT_APP }; + ipc.write_all(&[action, 0]).ok(); } } @@ -63,34 +47,70 @@ fn read_icon(file: &Path) -> Icon { let mut bytes = Vec::new(); file.read_to_end(&mut bytes).unwrap(); - Icon::from_png_bytes(&bytes) - .unwrap_or(Icon::from_rgba(vec![255u8; 32 * 32 * 4], 32, 32).unwrap()) -} + let mut img = image::load_from_memory_with_format(&bytes, image::ImageFormat::Png) + .expect("icon not found") + .to_rgba8(); + for image::Rgba(pixel) in img.pixels_mut() { + // (╯°□°)╯︵ ┻━┻ + *pixel = u32::from_be_bytes(*pixel).rotate_right(8).to_be_bytes(); + } -fn build_menu() -> Menu { - Menu::new([ - MenuItem::separator(), - MenuItem::button("Open", TrayAction::Open), - MenuItem::button("Quit App", TrayAction::Quit), - ]) -} - -fn do_action(event: TrayEvent) { - if let TrayEvent::Menu(action) = event { - match action { - TrayAction::Open => open_app(), - TrayAction::Quit => { - quit_app(); - exit(0); - } - } + let (width, height) = img.dimensions(); + Icon { + width: width as i32, + height: height as i32, + data: img.into_raw(), } } -fn set_tray_icon_and_tip( +struct AsusTray { + current_title: String, + current_icon: Icon, +} + +impl ksni::Tray for AsusTray { + fn id(&self) -> String { + TRAY_LABEL.into() + } + + fn icon_pixmap(&self) -> Vec { + vec![self.current_icon.clone()] + } + + fn title(&self) -> String { + self.current_title.clone() + } + + fn status(&self) -> ksni::Status { + ksni::Status::Active + } + + fn menu(&self) -> Vec> { + use ksni::menu::*; + vec![ + StandardItem { + label: "Open ROGCC".into(), + icon_name: "rog-control-center".into(), + activate: Box::new(|_| toggle_app(true)), + ..Default::default() + } + .into(), + MenuItem::Separator, + StandardItem { + label: "Quit ROGCC".into(), + icon_name: "application-exit".into(), + activate: Box::new(|_| std::process::exit(0)), + ..Default::default() + } + .into(), + ] + } +} + +async fn set_tray_icon_and_tip( mode: GfxMode, power: GfxPower, - tray: &mut TrayIcon, + tray: &mut Handle, supergfx_active: bool, ) { if let Some(icons) = ICONS.get() { @@ -113,16 +133,16 @@ fn set_tray_icon_and_tip( } } }; - // *tray = TrayIconBuilder::::new() - // .with_icon(icon) - // .with_tooltip(format!("ROG: gpu mode = {mode:?}, gpu power = {power:?}")) - // .with_menu(build_menu()) - // .build(do_action) - // .map_err(|e| log::error!("Tray unable to be initialised: {e:?}")) - // .unwrap(); - tray.set_icon(Some(icon)); - tray.set_tooltip(format!("ROG: gpu mode = {mode:?}, gpu power = {power:?}")); + tray.update(|tray: &mut AsusTray| { + dbg!(power); + tray.current_icon = icon; + tray.current_title = format!( + "ROG: gpu mode = {mode:?}, gpu power = + {power:?}" + ); + }) + .await; } } @@ -142,86 +162,85 @@ fn find_dgpu() -> Option { /// The tray is controlled somewhat by `Arc>` pub fn init_tray(_supported_properties: Vec, config: Arc>) { - std::thread::spawn(move || { + tokio::spawn(async move { let rog_red = read_icon(&PathBuf::from("asus_notif_red.png")); - if let Ok(mut tray) = TrayIconBuilder::::new() - .with_icon(rog_red.clone()) - .with_tooltip(TRAY_LABEL) - .with_menu(build_menu()) - .build(do_action) + let tray = AsusTray { + current_title: TRAY_LABEL.to_string(), + current_icon: rog_red.clone(), + }; + + let mut tray = tray + .spawn_without_dbus_name() + .await .map_err(|e| { log::error!( "Tray unable to be initialised: {e:?}. Do you have a system tray enabled?" ) }) - { - info!("Tray started"); - let rog_blue = read_icon(&PathBuf::from("asus_notif_blue.png")); - let rog_green = read_icon(&PathBuf::from("asus_notif_green.png")); - let rog_white = read_icon(&PathBuf::from("asus_notif_white.png")); - let gpu_integrated = read_icon(&PathBuf::from("rog-control-center.png")); - ICONS.get_or_init(|| Icons { - rog_blue, - rog_red: rog_red.clone(), - rog_green, - rog_white, - gpu_integrated, - }); + .unwrap(); - let mut has_supergfx = false; - let conn = zbus::blocking::Connection::system().unwrap(); - if let Ok(gfx_proxy) = GfxProxy::new(&conn) { - match gfx_proxy.mode() { - Ok(_) => { - has_supergfx = true; - if let Ok(version) = gfx_proxy.version() { - if let Some(version) = Versioning::new(&version) { - let curr_gfx = Versioning::new("5.2.0").unwrap(); - warn!("supergfxd version = {version}"); - if version < curr_gfx { - // Don't allow mode changing if too old a version - warn!("supergfxd found but is too old to use"); - has_supergfx = false; - } + info!("Tray started"); + let rog_blue = read_icon(&PathBuf::from("asus_notif_blue.png")); + let rog_green = read_icon(&PathBuf::from("asus_notif_green.png")); + let rog_white = read_icon(&PathBuf::from("asus_notif_white.png")); + let gpu_integrated = read_icon(&PathBuf::from("rog-control-center.png")); + ICONS.get_or_init(|| Icons { + rog_blue, + rog_red: rog_red.clone(), + rog_green, + rog_white, + gpu_integrated, + }); + + let mut has_supergfx = false; + let conn = zbus::Connection::system().await.unwrap(); + if let Ok(gfx_proxy) = GfxProxy::new(&conn).await { + match gfx_proxy.mode().await { + Ok(_) => { + has_supergfx = true; + if let Ok(version) = gfx_proxy.version().await { + if let Some(version) = Versioning::new(&version) { + let curr_gfx = Versioning::new("5.2.0").unwrap(); + warn!("supergfxd version = {version}"); + if version < curr_gfx { + // Don't allow mode changing if too old a version + warn!("supergfxd found but is too old to use"); + has_supergfx = false; } } } - Err(e) => warn!("Couldn't get mode form supergfxd: {e:?}"), } + Err(e) => warn!("Couldn't get mode form supergfxd: {e:?}"), + } - info!("Started ROGTray"); - let mut last_power = GfxPower::Unknown; - let dev = find_dgpu(); - loop { - sleep(Duration::from_millis(1000)); - if let Ok(lock) = config.try_lock() { - if !lock.enable_tray_icon { - return; - } + info!("Started ROGTray"); + let mut last_power = GfxPower::Unknown; + let dev = find_dgpu(); + loop { + tokio::time::sleep(Duration::from_millis(1000)).await; + if let Ok(lock) = config.try_lock() { + if !lock.enable_tray_icon { + return; } - if has_supergfx { - if let Ok(mode) = gfx_proxy.mode() { - if let Ok(power) = gfx_proxy.power() { - if last_power != power { - set_tray_icon_and_tip(mode, power, &mut tray, has_supergfx); - last_power = power; - } - } - } - } else if let Some(dev) = dev.as_ref() { - if let Ok(power) = dev.get_runtime_status() { + } + if has_supergfx { + if let Ok(mode) = gfx_proxy.mode().await { + if let Ok(power) = gfx_proxy.power().await { if last_power != power { - set_tray_icon_and_tip( - GfxMode::Hybrid, - power, - &mut tray, - has_supergfx, - ); + set_tray_icon_and_tip(mode, power, &mut tray, has_supergfx).await; last_power = power; } } } + } else if let Some(dev) = dev.as_ref() { + if let Ok(power) = dev.get_runtime_status() { + if last_power != power { + set_tray_icon_and_tip(GfxMode::Hybrid, power, &mut tray, has_supergfx) + .await; + last_power = power; + } + } } } } diff --git a/rog-control-center/translations/en/rog-control-center.po b/rog-control-center/translations/en/rog-control-center.po index 971d7791..f57f4223 100644 --- a/rog-control-center/translations/en/rog-control-center.po +++ b/rog-control-center/translations/en/rog-control-center.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2024-11-28 03:29+0000\n" +"POT-Creation-Date: 2024-12-17 09:05+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -12,251 +12,6 @@ msgstr "" "Language: \n" "Plural-Forms: nplurals=1; plural=0;\n" -#: rog-control-center/ui/pages/anime.slint:6 -msgctxt "Anime Brightness" -msgid "Off" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:7 -msgctxt "Anime Brightness" -msgid "Low" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:8 -msgctxt "Anime Brightness" -msgid "Med" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:9 -msgctxt "Anime Brightness" -msgid "High" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:23 -msgctxt "AnimePageData" -msgid "Glitch Construction" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:23 -msgctxt "AnimePageData" -msgid "Static Emergence" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:25 -msgctxt "AnimePageData" -msgid "Binary Banner Scroll" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:25 -msgctxt "AnimePageData" -msgid "Rog Logo Glitch" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:27 -msgctxt "AnimePageData" -msgid "Banner Swipe" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:27 -msgctxt "AnimePageData" -msgid "Starfield" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:29 -msgctxt "AnimePageData" -msgid "Glitch Out" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:29 -msgctxt "AnimePageData" -msgid "See Ya" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:50 -msgctxt "Anime Brightness" -msgid "Brightness" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:66 -msgctxt "PageAnime" -msgid "Enable display" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:74 rog-control-center/ui/pages/anime.slint:97 -msgctxt "PageAnime" -msgid "Advanced" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:89 -msgctxt "PageAnime" -msgid "Use built-in animations" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:146 -msgctxt "PageAnime" -msgid "Set which builtin animations are played" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:150 -msgctxt "Anime built-in selection" -msgid "Boot Animation" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:160 -msgctxt "Anime built-in selection" -msgid "Running Animation" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:170 -msgctxt "Anime built-in selection" -msgid "Sleep Animation" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:180 -msgctxt "Anime built-in selection" -msgid "Shutdown Animation" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:220 -msgctxt "PageAnime" -msgid "Advanced Display Settings" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:225 -msgctxt "PageAnime" -msgid "Off when lid closed" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:234 -msgctxt "PageAnime" -msgid "Off when suspended" -msgstr "" - -#: rog-control-center/ui/pages/anime.slint:243 -msgctxt "PageAnime" -msgid "Off when on battery" -msgstr "" - -#: rog-control-center/ui/pages/app_settings.slint:26 -msgctxt "PageAppSettings" -msgid "Run in background after closing" -msgstr "" - -#: rog-control-center/ui/pages/app_settings.slint:34 -msgctxt "PageAppSettings" -msgid "Start app in background (UI closed)" -msgstr "" - -#: rog-control-center/ui/pages/app_settings.slint:42 -msgctxt "PageAppSettings" -msgid "Enable system tray icon" -msgstr "" - -#: rog-control-center/ui/pages/app_settings.slint:50 -msgctxt "PageAppSettings" -msgid "Enable dGPU notifications" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:28 -msgctxt "PageAura" -msgid "Brightness" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:39 -msgctxt "PageAura" -msgid "Aura mode" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:59 -msgctxt "PageAura" -msgid "Colour 1" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:85 -msgctxt "PageAura" -msgid "Colour 2" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:119 -msgctxt "PageAura" -msgid "Zone" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:142 -msgctxt "PageAura" -msgid "Direction" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:164 -msgctxt "PageAura" -msgid "Speed" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:185 -msgctxt "PageAura" -msgid "Power Settings" -msgstr "" - -#: rog-control-center/ui/pages/aura.slint:270 -msgctxt "PageAura" -msgid "Power Zones" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:26 -msgctxt "FanTab" -msgid "This fan is not avilable on this machine" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:34 -msgctxt "FanTab" -msgid "Enabled" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:43 -msgctxt "FanTab" -msgid "Apply" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:51 -msgctxt "FanTab" -msgid "Cancel" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:59 -msgctxt "FanTab" -msgid "Factory Default (all fans)" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:72 -msgctxt "PageFans" -msgid "Balanced" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:75 rog-control-center/ui/pages/fans.slint:134 rog-control-center/ui/pages/fans.slint:193 -msgctxt "PageFans" -msgid "CPU" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:93 rog-control-center/ui/pages/fans.slint:152 rog-control-center/ui/pages/fans.slint:211 -msgctxt "PageFans" -msgid "Mid" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:111 rog-control-center/ui/pages/fans.slint:170 rog-control-center/ui/pages/fans.slint:229 -msgctxt "PageFans" -msgid "GPU" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:131 -msgctxt "PageFans" -msgid "Performance" -msgstr "" - -#: rog-control-center/ui/pages/fans.slint:190 -msgctxt "PageFans" -msgid "Quiet" -msgstr "" - #: rog-control-center/ui/pages/system.slint:26 msgctxt "SystemPageData" msgid "Balanced" @@ -412,6 +167,251 @@ msgctxt "PageSystem" msgid "Throttle Policy on AC" msgstr "" +#: rog-control-center/ui/pages/aura.slint:28 +msgctxt "PageAura" +msgid "Brightness" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:39 +msgctxt "PageAura" +msgid "Aura mode" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:59 +msgctxt "PageAura" +msgid "Colour 1" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:85 +msgctxt "PageAura" +msgid "Colour 2" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:119 +msgctxt "PageAura" +msgid "Zone" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:142 +msgctxt "PageAura" +msgid "Direction" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:164 +msgctxt "PageAura" +msgid "Speed" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:185 +msgctxt "PageAura" +msgid "Power Settings" +msgstr "" + +#: rog-control-center/ui/pages/aura.slint:270 +msgctxt "PageAura" +msgid "Power Zones" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:6 +msgctxt "Anime Brightness" +msgid "Off" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:7 +msgctxt "Anime Brightness" +msgid "Low" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:8 +msgctxt "Anime Brightness" +msgid "Med" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:9 +msgctxt "Anime Brightness" +msgid "High" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:23 +msgctxt "AnimePageData" +msgid "Glitch Construction" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:23 +msgctxt "AnimePageData" +msgid "Static Emergence" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:25 +msgctxt "AnimePageData" +msgid "Binary Banner Scroll" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:25 +msgctxt "AnimePageData" +msgid "Rog Logo Glitch" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:27 +msgctxt "AnimePageData" +msgid "Banner Swipe" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:27 +msgctxt "AnimePageData" +msgid "Starfield" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:29 +msgctxt "AnimePageData" +msgid "Glitch Out" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:29 +msgctxt "AnimePageData" +msgid "See Ya" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:50 +msgctxt "Anime Brightness" +msgid "Brightness" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:66 +msgctxt "PageAnime" +msgid "Enable display" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:74 rog-control-center/ui/pages/anime.slint:97 +msgctxt "PageAnime" +msgid "Advanced" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:89 +msgctxt "PageAnime" +msgid "Use built-in animations" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:146 +msgctxt "PageAnime" +msgid "Set which builtin animations are played" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:150 +msgctxt "Anime built-in selection" +msgid "Boot Animation" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:160 +msgctxt "Anime built-in selection" +msgid "Running Animation" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:170 +msgctxt "Anime built-in selection" +msgid "Sleep Animation" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:180 +msgctxt "Anime built-in selection" +msgid "Shutdown Animation" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:220 +msgctxt "PageAnime" +msgid "Advanced Display Settings" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:225 +msgctxt "PageAnime" +msgid "Off when lid closed" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:234 +msgctxt "PageAnime" +msgid "Off when suspended" +msgstr "" + +#: rog-control-center/ui/pages/anime.slint:243 +msgctxt "PageAnime" +msgid "Off when on battery" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:26 +msgctxt "FanTab" +msgid "This fan is not avilable on this machine" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:34 +msgctxt "FanTab" +msgid "Enabled" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:43 +msgctxt "FanTab" +msgid "Apply" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:51 +msgctxt "FanTab" +msgid "Cancel" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:59 +msgctxt "FanTab" +msgid "Factory Default (all fans)" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:72 +msgctxt "PageFans" +msgid "Balanced" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:75 rog-control-center/ui/pages/fans.slint:134 rog-control-center/ui/pages/fans.slint:193 +msgctxt "PageFans" +msgid "CPU" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:93 rog-control-center/ui/pages/fans.slint:152 rog-control-center/ui/pages/fans.slint:211 +msgctxt "PageFans" +msgid "Mid" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:111 rog-control-center/ui/pages/fans.slint:170 rog-control-center/ui/pages/fans.slint:229 +msgctxt "PageFans" +msgid "GPU" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:131 +msgctxt "PageFans" +msgid "Performance" +msgstr "" + +#: rog-control-center/ui/pages/fans.slint:190 +msgctxt "PageFans" +msgid "Quiet" +msgstr "" + +#: rog-control-center/ui/pages/app_settings.slint:26 +msgctxt "PageAppSettings" +msgid "Run in background after closing" +msgstr "" + +#: rog-control-center/ui/pages/app_settings.slint:34 +msgctxt "PageAppSettings" +msgid "Start app in background (UI closed)" +msgstr "" + +#: rog-control-center/ui/pages/app_settings.slint:42 +msgctxt "PageAppSettings" +msgid "Enable system tray icon" +msgstr "" + +#: rog-control-center/ui/pages/app_settings.slint:50 +msgctxt "PageAppSettings" +msgid "Enable dGPU notifications" +msgstr "" + #: rog-control-center/ui/types/aura_types.slint:51 msgctxt "Aura power zone" msgid "Logo"