From 17df3cf01decf982eb5c9955f3a2df4ca8983696 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Mon, 25 Jul 2022 15:57:05 +1200 Subject: [PATCH] Add rog-control-center to the workspace --- CHANGELOG.md | 4 + Cargo.lock | 1475 ++++++++- Cargo.toml | 2 +- Makefile | 9 + README.md | 2 + .../.vscode/configurationCache.log | 1 + rog-control-center/.vscode/dryrun.log | 6 + rog-control-center/.vscode/settings.json | 3 + rog-control-center/.vscode/targets.log | 414 +++ rog-control-center/Cargo.lock | 2790 +++++++++++++++++ rog-control-center/Cargo.toml | 45 + rog-control-center/LICENSE | 373 +++ rog-control-center/Makefile | 65 + rog-control-center/README.md | 22 + .../data/rog-control-center.desktop | 11 + .../data/rog-control-center.png | Bin 0 -> 212632 bytes rog-control-center/src/app.rs | 127 + rog-control-center/src/config.rs | 92 + rog-control-center/src/error.rs | 43 + rog-control-center/src/lib.rs | 77 + rog-control-center/src/main.rs | 94 + rog-control-center/src/notify.rs | 222 ++ rog-control-center/src/page_states.rs | 294 ++ rog-control-center/src/widgets/anime_page.rs | 77 + rog-control-center/src/widgets/aura_page.rs | 455 +++ .../src/widgets/fan_curve_page.rs | 199 ++ rog-control-center/src/widgets/mod.rs | 13 + rog-control-center/src/widgets/side_panel.rs | 62 + rog-control-center/src/widgets/system_page.rs | 117 + rog-control-center/src/widgets/top_bar.rs | 53 + 30 files changed, 7124 insertions(+), 23 deletions(-) create mode 100644 rog-control-center/.vscode/configurationCache.log create mode 100644 rog-control-center/.vscode/dryrun.log create mode 100644 rog-control-center/.vscode/settings.json create mode 100644 rog-control-center/.vscode/targets.log create mode 100644 rog-control-center/Cargo.lock create mode 100644 rog-control-center/Cargo.toml create mode 100644 rog-control-center/LICENSE create mode 100644 rog-control-center/Makefile create mode 100644 rog-control-center/README.md create mode 100644 rog-control-center/data/rog-control-center.desktop create mode 100644 rog-control-center/data/rog-control-center.png create mode 100644 rog-control-center/src/app.rs create mode 100644 rog-control-center/src/config.rs create mode 100644 rog-control-center/src/error.rs create mode 100644 rog-control-center/src/lib.rs create mode 100644 rog-control-center/src/main.rs create mode 100644 rog-control-center/src/notify.rs create mode 100644 rog-control-center/src/page_states.rs create mode 100644 rog-control-center/src/widgets/anime_page.rs create mode 100644 rog-control-center/src/widgets/aura_page.rs create mode 100644 rog-control-center/src/widgets/fan_curve_page.rs create mode 100644 rog-control-center/src/widgets/mod.rs create mode 100644 rog-control-center/src/widgets/side_panel.rs create mode 100644 rog-control-center/src/widgets/system_page.rs create mode 100644 rog-control-center/src/widgets/top_bar.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index edbee198..d69be4ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased ] +### Added +- `rog-control-center` has now been moved in to the main workspace due to + the heavy dependencies on most of the rog crates + ## [4.3.0] - 2022-07-21 ### Added diff --git a/Cargo.lock b/Cargo.lock index 7a4d2887..c44fdf93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ab_glyph" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24606928a235e73cdef55a0c909719cadd72fce573e5713d58cb2952d8f5794c" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" + [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.18" @@ -17,6 +50,29 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" + +[[package]] +name = "arboard" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc120354d1b5ec6d7aaf4876b602def75595937b5e15d356eb554ab5177e08bb" +dependencies = [ + "clipboard-win", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot 0.12.1", + "thiserror", + "winapi", + "x11rb", +] + [[package]] name = "asus-notify" version = "3.1.0" @@ -59,7 +115,7 @@ dependencies = [ "easy-parallel", "event-listener", "futures-core", - "parking_lot", + "parking_lot 0.11.2", ] [[package]] @@ -145,7 +201,7 @@ checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" dependencies = [ "async-io", "blocking", - "cfg-if", + "cfg-if 1.0.0", "event-listener", "futures-lite", "libc", @@ -188,6 +244,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" +[[package]] +name = "atomic_refcell" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" + [[package]] name = "atty" version = "0.2.14" @@ -213,9 +275,9 @@ checksum = "f771a5d1f5503f7f4279a30f3643d3421ba149848b89ecaaec0ea2acf04a5ac4" [[package]] name = "bitflags" -version = "1.3.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "block" @@ -237,36 +299,151 @@ dependencies = [ "once_cell", ] +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "bytemuck" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd2f4180c5721da6335cc9e9061cce522b87a35e51cc57636d28d22a9863c80" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" + [[package]] name = "cache-padded" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" +[[package]] +name = "calloop" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" +dependencies = [ + "log", + "nix 0.22.3", +] + [[package]] name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "clipboard-win" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "combine" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -276,6 +453,94 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys 0.8.3", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "daemon" version = "4.3.1" @@ -305,7 +570,7 @@ dependencies = [ name = "daemon-user" version = "1.3.0" dependencies = [ - "dirs", + "dirs 4.0.0", "rog_anime", "rog_dbus", "rog_supported", @@ -318,6 +583,64 @@ dependencies = [ "zvariant_derive", ] +[[package]] +name = "dark-light" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b83576e2eee2d9cdaa8d08812ae59cbfe1b5ac7ac5ac4b8400303c6148a88c1" +dependencies = [ + "dconf_rs", + "detect-desktop-environment", + "dirs 4.0.0", + "objc", + "rust-ini", + "web-sys", + "winreg", + "zbus", + "zvariant", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dconf_rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" + [[package]] name = "derivative" version = "2.2.0" @@ -329,6 +652,21 @@ dependencies = [ "syn", ] +[[package]] +name = "detect-desktop-environment" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs" version = "4.0.0" @@ -344,7 +682,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "dirs-sys-next", ] @@ -370,12 +708,110 @@ dependencies = [ "winapi", ] +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlv-list" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df3f2b690c1b86e65ef7830956aededf3cb0a16f898f79b9a6f421a7b6211b" +dependencies = [ + "rand", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + [[package]] name = "easy-parallel" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" +[[package]] +name = "eframe" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", + "dark-light", + "egui", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "js-sys", + "percent-encoding", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winit", +] + +[[package]] +name = "egui" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "ahash 0.7.6", + "epaint", + "nohash-hasher", + "tracing", +] + +[[package]] +name = "egui-winit" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "arboard", + "egui", + "instant", + "smithay-clipboard", + "tracing", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", + "egui", + "glow", + "memoffset", + "tracing", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "emath" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", +] + [[package]] name = "embedded-graphics" version = "0.7.1" @@ -433,6 +869,30 @@ dependencies = [ "termcolor", ] +[[package]] +name = "epaint" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "ab_glyph", + "ahash 0.7.6", + "atomic_refcell", + "bytemuck", + "emath", + "nohash-hasher", + "parking_lot 0.12.1", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "event-listener" version = "2.5.2" @@ -457,6 +917,37 @@ dependencies = [ "num-traits", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "futures-core" version = "0.3.21" @@ -510,13 +1001,23 @@ dependencies = [ "slab", ] +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "getrandom" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi", ] @@ -531,6 +1032,17 @@ dependencies = [ "weezl", ] +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + [[package]] name = "glam" version = "0.20.5" @@ -540,6 +1052,90 @@ dependencies = [ "serde", ] +[[package]] +name = "glow" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00ea9dbe544bc8a657c4c4a798c2d16cd01b549820e47657297549d28371f6d2" +dependencies = [ + "android_glue", + "cgl", + "cocoa", + "core-foundation 0.9.3", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading", + "log", + "objc", + "osmesa-sys", + "parking_lot 0.11.2", + "wayland-client", + "wayland-egl", + "winapi", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" +dependencies = [ + "gl_generator", + "winapi", +] + +[[package]] +name = "glutin_emscripten_sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +dependencies = [ + "gl_generator", + "objc", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + [[package]] name = "gumdrop" version = "0.8.1" @@ -560,6 +1156,15 @@ dependencies = [ "syn", ] +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +dependencies = [ + "ahash 0.4.7", +] + [[package]] name = "heck" version = "0.3.3" @@ -590,13 +1195,33 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "instant" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -605,6 +1230,41 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "lazy_static" version = "1.4.0" @@ -617,6 +1277,16 @@ version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + [[package]] name = "libudev-sys" version = "0.1.4" @@ -655,7 +1325,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -691,12 +1361,36 @@ dependencies = [ "libc", ] +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a79b39c93a7a5a27eeaf9a23b5ff43f1b9e0ad6b1cdd441140ae53c35613fc7" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -712,6 +1406,12 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -722,6 +1422,134 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "ndk" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.2.2", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.3.0", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-glue" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk 0.5.0", + "ndk-context", + "ndk-macro", + "ndk-sys 0.2.2", +] + +[[package]] +name = "ndk-glue" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk 0.6.0", + "ndk-context", + "ndk-macro", + "ndk-sys 0.3.0", +] + +[[package]] +name = "ndk-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e06129fb611568ef4e868c14b326274959aa70ff7776e9d55323531c374945" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + [[package]] name = "nix" version = "0.23.1" @@ -730,11 +1558,28 @@ checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" dependencies = [ "bitflags", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset", ] +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "6.1.2" @@ -745,6 +1590,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "notify-rust" version = "4.5.8" @@ -768,6 +1623,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -818,6 +1694,16 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +[[package]] +name = "ordered-multimap" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c672c7ad9ec066e428c00eb917124a06f08db19e2584de982cc34b1f4c12485" +dependencies = [ + "dlv-list", + "hashbrown", +] + [[package]] name = "ordered-stream" version = "0.0.1" @@ -828,6 +1714,24 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" +dependencies = [ + "shared_library", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1e509cfe7a12db2a90bfa057dfcdbc55a347f5da677c506b53dd099cfec9d" +dependencies = [ + "ttf-parser", +] + [[package]] name = "parking" version = "2.0.0" @@ -842,7 +1746,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -851,7 +1765,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall", @@ -859,6 +1773,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -899,7 +1832,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "log", "wepoll-ffi", @@ -970,6 +1903,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "raw-window-handle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +dependencies = [ + "cty", +] + [[package]] name = "redox_syscall" version = "0.2.13" @@ -1016,6 +1958,28 @@ dependencies = [ "winapi", ] +[[package]] +name = "rog-control-center" +version = "0.1.3" +dependencies = [ + "dirs 3.0.2", + "eframe", + "egui", + "nix 0.20.2", + "notify-rust", + "rog_aura", + "rog_dbus", + "rog_profiles", + "rog_supported", + "serde", + "serde_derive", + "serde_json", + "smol", + "tempfile", + "toml", + "zbus", +] + [[package]] name = "rog_anime" version = "1.3.5" @@ -1087,12 +2051,37 @@ dependencies = [ "libusb1-sys", ] +[[package]] +name = "rust-ini" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63471c4aa97a1cf8332a5f97709a79a4234698de6a1f5087faf66f2dae810e22" +dependencies = [ + "cfg-if 1.0.0", + "ordered-multimap", +] + [[package]] name = "ryu" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -1156,6 +2145,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + [[package]] name = "signal-hook" version = "0.3.14" @@ -1181,12 +2180,68 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +[[package]] +name = "smithay-client-toolkit" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2 0.3.1", + "nix 0.22.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" +dependencies = [ + "bitflags", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.5", + "nix 0.24.2", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit 0.16.0", + "wayland-client", +] + [[package]] name = "smol" version = "1.2.5" @@ -1221,6 +2276,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strum" version = "0.22.0" @@ -1268,7 +2335,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "libc", "redox_syscall", @@ -1322,9 +2389,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44873aee48dd30712dc2610209902a78b9033a0148ac03c6c3e73e4ca2f49838" dependencies = [ "embedded-graphics", - "nom", + "nom 6.1.2", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + [[package]] name = "toml" version = "0.5.9" @@ -1340,7 +2422,7 @@ version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1366,6 +2448,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "ttf-parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" + [[package]] name = "udev" version = "0.6.3" @@ -1387,18 +2475,45 @@ dependencies = [ "winapi", ] +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + [[package]] name = "unicode-ident" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +[[package]] +name = "unicode-normalization" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -1417,12 +2532,196 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + +[[package]] +name = "wayland-client" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.22.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" +dependencies = [ + "nix 0.22.3", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" +dependencies = [ + "nix 0.22.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-egl" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83281d69ee162b59031c666385e93bde4039ec553b90c4191cdb128ceea29a3a" +dependencies = [ + "wayland-client", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +dependencies = [ + "jni", + "ndk-glue 0.6.2", + "url", + "web-sys", + "widestring", + "winapi", +] + [[package]] name = "weezl" version = "0.1.6" @@ -1438,6 +2737,12 @@ dependencies = [ "cc", ] +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + [[package]] name = "winapi" version = "0.3.9" @@ -1463,6 +2768,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1475,36 +2789,121 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9f39345ae0c8ab072c0ac7fe8a8b411636aa34f89be19ddd0d9226544f13944" dependencies = [ - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_i686_gnu 0.24.0", + "windows_i686_msvc 0.24.0", + "windows_x86_64_gnu 0.24.0", + "windows_x86_64_msvc 0.24.0", ] +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + [[package]] name = "windows_i686_gnu" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + [[package]] name = "windows_i686_msvc" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + [[package]] name = "windows_x86_64_gnu" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + [[package]] name = "windows_x86_64_msvc" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winit" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" +dependencies = [ + "bitflags", + "cocoa", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "ndk 0.5.0", + "ndk-glue 0.5.2", + "ndk-sys 0.2.2", + "objc", + "parking_lot 0.11.2", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit 0.15.4", + "wasm-bindgen", + "wayland-client", + "wayland-protocols", + "web-sys", + "winapi", + "x11-dl", +] + +[[package]] +name = "winreg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d107f8c6e916235c4c01cabb3e8acf7bea8ef6a63ca2e7fa0527c049badfc48c" +dependencies = [ + "winapi", +] + [[package]] name = "winrt-notification" version = "0.5.1" @@ -1516,6 +2915,38 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" +dependencies = [ + "gethostname", + "nix 0.22.3", + "winapi", + "winapi-wsapoll", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom 7.1.1", +] + [[package]] name = "xml-rs" version = "0.8.4" @@ -1538,7 +2969,7 @@ dependencies = [ "async-trait", "byteorder", "derivative", - "dirs", + "dirs 4.0.0", "enumflags2", "event-listener", "futures-core", @@ -1546,7 +2977,7 @@ dependencies = [ "futures-util", "hex", "lazy_static", - "nix", + "nix 0.23.1", "once_cell", "ordered-stream", "rand", diff --git a/Cargo.toml b/Cargo.toml index 373086cb..b2caec6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["asusctl", "asus-notify", "daemon", "daemon-user", "rog-supported", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles"] +members = ["asusctl", "asus-notify", "daemon", "daemon-user", "rog-supported", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"] [profile.release] # thin = 57s, asusd = 9.0M diff --git a/Makefile b/Makefile index 2b377323..57dbfede 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ datarootdir = $(prefix)/share libdir = $(exec_prefix)/lib zshcpl = $(datarootdir)/zsh/site-functions +BIN_ROG := rog-control-center BIN_C := asusctl BIN_D := asusd BIN_U := asusd-user @@ -39,6 +40,10 @@ distclean: rm -rf .cargo vendor vendor.tar.xz install: + $(INSTALL_PROGRAM) "./target/release/$(BIN_ROG)" "$(DESTDIR)$(bindir)/$(BIN_ROG)" + $(INSTALL_DATA) "./rog-control-center/data/$(BIN_ROG).desktop" "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + $(INSTALL_DATA) "./rog-control-center/data/$(BIN_ROG).png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + $(INSTALL_PROGRAM) "./target/release/$(BIN_C)" "$(DESTDIR)$(bindir)/$(BIN_C)" $(INSTALL_PROGRAM) "./target/release/$(BIN_D)" "$(DESTDIR)$(bindir)/$(BIN_D)" $(INSTALL_PROGRAM) "./target/release/$(BIN_U)" "$(DESTDIR)$(bindir)/$(BIN_U)" @@ -68,6 +73,10 @@ install: cd rog-anime/data && find "./anime" -type f -exec install -Dm 755 "{}" "$(DESTDIR)$(datarootdir)/asusd/{}" \; uninstall: + rm -f "$(DESTDIR)$(bindir)/$(BIN_ROG)" + rm -r "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + rm -f "$(DESTDIR)$(bindir)/$(BIN_C)" rm -f "$(DESTDIR)$(bindir)/$(BIN_D)" rm -f "$(DESTDIR)$(bindir)/$(BIN_N)" diff --git a/README.md b/README.md index 2f2f9cdc..af7d2122 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ `asusd` is a utility for Linux to control many aspects of various ASUS laptops but can also be used with non-asus laptops with reduced features. +Now includes a GUI, `rog-control-center`. + ## Kernel support **The minimum supported kernel version is 5.15** diff --git a/rog-control-center/.vscode/configurationCache.log b/rog-control-center/.vscode/configurationCache.log new file mode 100644 index 00000000..543723bc --- /dev/null +++ b/rog-control-center/.vscode/configurationCache.log @@ -0,0 +1 @@ +{"buildTargets":["all","build","clean","distclean","install","uninstall","update","vendor"],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}} \ No newline at end of file diff --git a/rog-control-center/.vscode/dryrun.log b/rog-control-center/.vscode/dryrun.log new file mode 100644 index 00000000..97f807b7 --- /dev/null +++ b/rog-control-center/.vscode/dryrun.log @@ -0,0 +1,6 @@ +make --dry-run --always-make --keep-going --print-directory +make: Entering directory '/home/luke/Projects/rog-control-center' + +cargo build --release +make: Leaving directory '/home/luke/Projects/rog-control-center' + diff --git a/rog-control-center/.vscode/settings.json b/rog-control-center/.vscode/settings.json new file mode 100644 index 00000000..65e1ec07 --- /dev/null +++ b/rog-control-center/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "makefile.extensionOutputFolder": "./.vscode" +} \ No newline at end of file diff --git a/rog-control-center/.vscode/targets.log b/rog-control-center/.vscode/targets.log new file mode 100644 index 00000000..6a99a93d --- /dev/null +++ b/rog-control-center/.vscode/targets.log @@ -0,0 +1,414 @@ +make all --print-data-base --no-builtin-variables --no-builtin-rules --question +# GNU Make 4.3 +# Built for x86_64-redhat-linux-gnu +# Copyright (C) 1988-2020 Free Software Foundation, Inc. +# License GPLv3+: GNU GPL version 3 or later +# This is free software: you are free to change and redistribute it. +# There is NO WARRANTY, to the extent permitted by law. + +# Make data base, printed on Mon Jul 25 13:56:15 2022 + +# Variables + +# makefile (from 'Makefile', line 4) +INSTALL_PROGRAM = ${INSTALL} -D -m 0755 +# environment +GDK_BACKEND = x11 +# environment +LC_ALL = C +# environment +NO_AT_BRIDGE = 1 +# makefile (from 'Makefile', line 15) +SRC := Cargo.toml Cargo.lock Makefile ./src/error.rs ./src/config.rs ./src/widgets/mod.rs ./src/widgets/top_bar.rs ./src/widgets/side_panel.rs ./src/widgets/anime_page.rs ./src/widgets/aura_page.rs ./src/widgets/fan_curve_page.rs ./src/widgets/system_page.rs ./src/app.rs ./src/lib.rs ./src/main.rs ./src/notify.rs ./src/page_states.rs +# environment +STARSHIP_SESSION_KEY = 2042530886117081 +# environment +GJS_DEBUG_OUTPUT = stderr +# environment +VSCODE_CWD = /home/luke +# makefile (from 'Makefile', line 7) +prefix = /usr +# environment +GDM_LANG = en_NZ.UTF-8 +# environment +WASMER_DIR = /home/luke/.wasmer +# default +MAKE_COMMAND := make +# environment +define BASH_FUNC_which%% +() { ( alias; + eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@ +} +endef +# automatic +@D = $(patsubst %/,%,$(dir $@)) +# environment +VSCODE_HANDLES_UNCAUGHT_ERRORS = true +# makefile (from 'Makefile', line 13) +BIN_ROG := rog-control-center +# default +.VARIABLES := +# environment +PWD = /home/luke/Projects/rog-control-center +# automatic +%D = $(patsubst %/,%,$(dir $%)) +# environment +HOSTNAME = fedora +# environment +MAIL = /var/spool/mail/luke +# environment +STEAM_FRAME_FORCE_CLOSE = 1 +# environment +XDG_DATA_DIRS = /home/luke/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/ +# automatic +^D = $(patsubst %/,%,$(dir $^)) +# automatic +%F = $(notdir $%) +# environment +VSCODE_CODE_CACHE_PATH = /home/luke/.config/Code/CachedData/3b889b090b5ad5793f524b5d1d39fda662b96a2a +# environment +LANG = C +# environment +XAUTHORITY = /run/user/1000/.mutter-Xwaylandauth.WG1MP1 +# default +.LOADED := +# default +.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include +# makefile +MAKEFLAGS = pqrR +# makefile +CURDIR := /home/luke/Projects/rog-control-center +# environment +APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL = true +# environment +LESSOPEN = ||/usr/bin/lesspipe.sh %s +# automatic +*D = $(patsubst %/,%,$(dir $*)) +# makefile (from 'Makefile', line 1) +VERSION := 0.1.2 +# environment +MFLAGS = -pqrR +# environment +SSH_AUTH_SOCK = /run/user/1000/keyring/ssh +# default +.SHELLFLAGS := -c +# environment +WAYLAND_DISPLAY = wayland-0 +# environment +HISTSIZE = 1000 +# automatic ++D = $(patsubst %/,%,$(dir $+)) +# environment +XDG_SESSION_DESKTOP = gnome +# makefile (from 'Makefile', line 1) +MAKEFILE_LIST := Makefile +# automatic +@F = $(notdir $@) +# environment +VSCODE_PID = 152272 +# environment +SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS = 0 +# environment +XDG_SESSION_TYPE = wayland +# automatic +?D = $(patsubst %/,%,$(dir $?)) +# makefile (from 'Makefile', line 3) +INSTALL = install +# environment +SESSION_MANAGER = local/unix:@/tmp/.ICE-unix/1985,unix/unix:/tmp/.ICE-unix/1985 +# automatic +*F = $(notdir $*) +# makefile (from 'Makefile', line 23) +VENDORED = 0 +# environment +CHROME_DESKTOP = code-url-handler.desktop +# environment +DBUS_SESSION_BUS_ADDRESS = unix:path=/run/user/1000/bus +# automatic + .cargo/config + echo 'directory = "vendor"' >> .cargo/config + mv .cargo/config ./cargo-config + rm -rf .cargo + tar pcfJ vendor_asusctl_$(VERSION).tar.xz vendor + rm -rf vendor + +uninstall: +# Phony target (prerequisite of .PHONY). +# Implicit rule search has not been done. +# File does not exist. +# File has not been updated. +# recipe to execute (from 'Makefile', line 42): + rm -f "$(DESTDIR)$(bindir)/$(BIN_ROG)" + rm -r "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + +clean: +# Phony target (prerequisite of .PHONY). +# Implicit rule search has not been done. +# File does not exist. +# File has not been updated. +# recipe to execute (from 'Makefile', line 31): + cargo clean + +# Not a target: +.DEFAULT: +# Implicit rule search has not been done. +# Modification time never checked. +# File has not been updated. + +all: build +# Phony target (prerequisite of .PHONY). +# Command line target. +# Implicit rule search has not been done. +# File does not exist. +# File has been updated. +# Needs to be updated (-q is set). +# variable set hash-table stats: +# Load=0/32=0%, Rehash=0, Collisions=0/4=0% + +build: +# Phony target (prerequisite of .PHONY). +# Implicit rule search has not been done. +# Implicit/static pattern stem: '' +# File does not exist. +# File has been updated. +# Needs to be updated (-q is set). +# automatic +# @ := build +# automatic +# * := +# automatic +# < := +# automatic +# + := +# automatic +# % := +# automatic +# ^ := +# automatic +# ? := +# automatic +# | := +# variable set hash-table stats: +# Load=8/32=25%, Rehash=0, Collisions=6/12=50% +# recipe to execute (from 'Makefile', line 63): + cargo build $(ARGS) + +install: +# Phony target (prerequisite of .PHONY). +# Implicit rule search has not been done. +# File does not exist. +# File has not been updated. +# recipe to execute (from 'Makefile', line 37): + $(INSTALL_PROGRAM) "./target/release/$(BIN_ROG)" "$(DESTDIR)$(bindir)/$(BIN_ROG)" + $(INSTALL_DATA) "./data/$(BIN_ROG).desktop" "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + $(INSTALL_DATA) "./data/$(BIN_ROG).png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + +# Not a target: +.SUFFIXES: +# Implicit rule search has not been done. +# Modification time never checked. +# File has not been updated. + +.PHONY: all clean distclean install uninstall update build +# Implicit rule search has not been done. +# Modification time never checked. +# File has not been updated. + +# files hash-table stats: +# Load=12/1024=1%, Rehash=0, Collisions=0/33=0% +# VPATH Search Paths + +# No 'vpath' search paths. + +# No general ('VPATH' variable) search path. + +# strcache buffers: 1 (0) / strings = 29 / storage = 279 B / avg = 9 B +# current buf: size = 8162 B / used = 279 B / count = 29 / avg = 9 B + +# strcache performance: lookups = 52 / hit rate = 44% +# hash-table stats: +# Load=29/8192=0%, Rehash=0, Collisions=0/52=0% +# Finished Make data base on Mon Jul 25 13:56:15 2022 + + diff --git a/rog-control-center/Cargo.lock b/rog-control-center/Cargo.lock new file mode 100644 index 00000000..72e109b1 --- /dev/null +++ b/rog-control-center/Cargo.lock @@ -0,0 +1,2790 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24606928a235e73cdef55a0c909719cadd72fce573e5713d58cb2952d8f5794c" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" + +[[package]] +name = "arboard" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc120354d1b5ec6d7aaf4876b602def75595937b5e15d356eb554ab5177e08bb" +dependencies = [ + "clipboard-win", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot 0.12.1", + "thiserror", + "winapi", + "x11rb", +] + +[[package]] +name = "async-broadcast" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d26004fe83b2d1cd3a97609b21e39f9a31535822210fe83205d2ce48866ea61" +dependencies = [ + "event-listener", + "futures-core", + "parking_lot 0.12.1", +] + +[[package]] +name = "async-channel" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "once_cell", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b3ca4f8ff117c37c278a2f7415ce9be55560b846b5bc4412aaa5d29c1c3dae2" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" +dependencies = [ + "concurrent-queue", + "futures-lite", + "libc", + "log", + "once_cell", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi", +] + +[[package]] +name = "async-lock" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-net" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5373304df79b9b4395068fb080369ec7178608827306ce4d081cba51cac551df" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" +dependencies = [ + "async-io", + "blocking", + "cfg-if 1.0.0", + "event-listener", + "futures-lite", + "libc", + "once_cell", + "signal-hook", + "winapi", +] + +[[package]] +name = "async-recursion" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-task" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" + +[[package]] +name = "async-trait" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" + +[[package]] +name = "atomic_refcell" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "blocking" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" +dependencies = [ + "async-channel", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "once_cell", +] + +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "bytemuck" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd2f4180c5721da6335cc9e9061cce522b87a35e51cc57636d28d22a9863c80" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" + +[[package]] +name = "cache-padded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" + +[[package]] +name = "calloop" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" +dependencies = [ + "log", + "nix 0.22.3", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "clipboard-win" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys 0.8.3", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "dark-light" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b83576e2eee2d9cdaa8d08812ae59cbfe1b5ac7ac5ac4b8400303c6148a88c1" +dependencies = [ + "dconf_rs", + "detect-desktop-environment", + "dirs 4.0.0", + "objc", + "rust-ini", + "web-sys", + "winreg", + "zbus", + "zvariant", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dconf_rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "detect-desktop-environment" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlv-list" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df3f2b690c1b86e65ef7830956aededf3cb0a16f898f79b9a6f421a7b6211b" +dependencies = [ + "rand", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "eframe" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", + "dark-light", + "egui", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "js-sys", + "percent-encoding", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winit", +] + +[[package]] +name = "egui" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "ahash 0.7.6", + "epaint", + "nohash-hasher", + "tracing", +] + +[[package]] +name = "egui-winit" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "arboard", + "egui", + "instant", + "smithay-clipboard", + "tracing", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", + "egui", + "glow", + "memoffset", + "tracing", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "emath" +version = "0.18.0" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "enumflags2" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.18.1" +source = "git+https://github.com/emilk/egui#0bf9fc9428423b375ae079782c095504e85ca42c" +dependencies = [ + "ab_glyph", + "ahash 0.7.6", + "atomic_refcell", + "bytemuck", + "emath", + "nohash-hasher", + "parking_lot 0.12.1", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + +[[package]] +name = "event-listener" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" +dependencies = [ + "serde", +] + +[[package]] +name = "glow" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00ea9dbe544bc8a657c4c4a798c2d16cd01b549820e47657297549d28371f6d2" +dependencies = [ + "android_glue", + "cgl", + "cocoa", + "core-foundation 0.9.3", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading", + "log", + "objc", + "osmesa-sys", + "parking_lot 0.11.2", + "wayland-client", + "wayland-egl", + "winapi", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" +dependencies = [ + "gl_generator", + "winapi", +] + +[[package]] +name = "glutin_emscripten_sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +dependencies = [ + "gl_generator", + "objc", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +dependencies = [ + "ahash 0.4.7", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "mac-notification-sys" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff231a88fe2e9985f9d159a2f02986fe46daa0f6af976a0d934be4870cc9d02" +dependencies = [ + "cc", + "dirs-next", + "objc-foundation", + "objc_id", + "time", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a79b39c93a7a5a27eeaf9a23b5ff43f1b9e0ad6b1cdd441140ae53c35613fc7" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "ndk" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.2.2", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.3.0", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-glue" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk 0.5.0", + "ndk-context", + "ndk-macro", + "ndk-sys 0.2.2", +] + +[[package]] +name = "ndk-glue" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk 0.6.0", + "ndk-context", + "ndk-macro", + "ndk-sys 0.3.0", +] + +[[package]] +name = "ndk-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e06129fb611568ef4e868c14b326274959aa70ff7776e9d55323531c374945" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "notify-rust" +version = "4.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4" +dependencies = [ + "mac-notification-sys", + "serde", + "winrt-notification", + "zbus", + "zvariant", + "zvariant_derive", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "numtoa" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" + +[[package]] +name = "ordered-multimap" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c672c7ad9ec066e428c00eb917124a06f08db19e2584de982cc34b1f4c12485" +dependencies = [ + "dlv-list", + "hashbrown", +] + +[[package]] +name = "ordered-stream" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "osmesa-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" +dependencies = [ + "shared_library", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1e509cfe7a12db2a90bfa057dfcdbc55a347f5da677c506b53dd099cfec9d" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pix" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2b6992b377680150280d4708bda8207ba9e71f70507b5504f2e28d8e8e48c1" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "png_pong" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b76c1da19406fed18e81972b9015a775447532647b04a8949135916d67778f" +dependencies = [ + "miniz_oxide", + "pix", +] + +[[package]] +name = "polling" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "log", + "wepoll-ffi", + "winapi", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "raw-window-handle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +dependencies = [ + "cty", +] + +[[package]] +name = "redox_syscall" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534cfe58d6a18cc17120fbf4635d53d14691c1fe4d951064df9bd326178d7d5a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rog-control-center" +version = "0.1.2" +dependencies = [ + "dirs 3.0.2", + "eframe", + "egui", + "nix 0.20.2", + "notify-rust", + "rog_aura", + "rog_dbus", + "rog_profiles", + "rog_supported", + "serde", + "serde_derive", + "serde_json", + "smol", + "tempfile", + "toml", + "zbus", +] + +[[package]] +name = "rog_anime" +version = "1.3.5" +source = "git+https://gitlab.com/asus-linux/asusctl.git#808a1d2470376cd60c6092348157eeb97c35c33d" +dependencies = [ + "gif", + "glam", + "log", + "pix", + "png_pong", + "serde", + "serde_derive", + "sysfs-class", + "udev", + "zbus", + "zvariant", +] + +[[package]] +name = "rog_aura" +version = "1.2.0" +source = "git+https://gitlab.com/asus-linux/asusctl.git#808a1d2470376cd60c6092348157eeb97c35c33d" +dependencies = [ + "serde", + "serde_derive", + "zvariant", +] + +[[package]] +name = "rog_dbus" +version = "4.2.0" +source = "git+https://gitlab.com/asus-linux/asusctl.git#808a1d2470376cd60c6092348157eeb97c35c33d" +dependencies = [ + "rog_anime", + "rog_aura", + "rog_profiles", + "rog_supported", + "zbus", + "zbus_macros", + "zvariant", +] + +[[package]] +name = "rog_profiles" +version = "1.1.3" +source = "git+https://gitlab.com/asus-linux/asusctl.git#808a1d2470376cd60c6092348157eeb97c35c33d" +dependencies = [ + "serde", + "serde_derive", + "udev", + "zvariant", + "zvariant_derive", +] + +[[package]] +name = "rog_supported" +version = "4.2.1" +source = "git+https://gitlab.com/asus-linux/asusctl.git#808a1d2470376cd60c6092348157eeb97c35c33d" +dependencies = [ + "rog_aura", + "serde", + "serde_derive", + "zvariant", + "zvariant_derive", +] + +[[package]] +name = "rust-ini" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63471c4aa97a1cf8332a5f97709a79a4234698de6a1f5087faf66f2dae810e22" +dependencies = [ + "cfg-if 1.0.0", + "ordered-multimap", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha1" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" + +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "signal-hook" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "smithay-client-toolkit" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2 0.3.1", + "nix 0.22.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" +dependencies = [ + "bitflags", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.5", + "nix 0.24.2", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit 0.16.0", + "wayland-client", +] + +[[package]] +name = "smol" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cf3b5351f3e783c1d79ab5fc604eeed8b8ae9abd36b166e8b87a089efd85e4" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sysfs-class" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1bbcf869732c45a77898f7f61ed6d411dfc37613517e444842f58d428856d1" +dependencies = [ + "numtoa", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +dependencies = [ + "libc", + "num_threads", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +dependencies = [ + "once_cell", +] + +[[package]] +name = "ttf-parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" + +[[package]] +name = "udev" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c960764f7e816eed851a96c364745d37f9fe71a2e7dba79fbd40104530b5dd0" +dependencies = [ + "libc", + "libudev-sys", + "pkg-config", +] + +[[package]] +name = "uds_windows" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +dependencies = [ + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" + +[[package]] +name = "unicode-normalization" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + +[[package]] +name = "wayland-client" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.22.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" +dependencies = [ + "nix 0.22.3", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" +dependencies = [ + "nix 0.22.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-egl" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83281d69ee162b59031c666385e93bde4039ec553b90c4191cdb128ceea29a3a" +dependencies = [ + "wayland-client", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +dependencies = [ + "jni", + "ndk-glue 0.6.2", + "url", + "web-sys", + "widestring", + "winapi", +] + +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-wsapoll" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f39345ae0c8ab072c0ac7fe8a8b411636aa34f89be19ddd0d9226544f13944" +dependencies = [ + "windows_i686_gnu 0.24.0", + "windows_i686_msvc 0.24.0", + "windows_x86_64_gnu 0.24.0", + "windows_x86_64_msvc 0.24.0", +] + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winit" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" +dependencies = [ + "bitflags", + "cocoa", + "core-foundation 0.9.3", + "core-graphics 0.22.3", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "ndk 0.5.0", + "ndk-glue 0.5.2", + "ndk-sys 0.2.2", + "objc", + "parking_lot 0.11.2", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit 0.15.4", + "wasm-bindgen", + "wayland-client", + "wayland-protocols", + "web-sys", + "winapi", + "x11-dl", +] + +[[package]] +name = "winreg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d107f8c6e916235c4c01cabb3e8acf7bea8ef6a63ca2e7fa0527c049badfc48c" +dependencies = [ + "winapi", +] + +[[package]] +name = "winrt-notification" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007a0353840b23e0c6dc73e5b962ff58ed7f6bc9ceff3ce7fe6fbad8d496edf4" +dependencies = [ + "strum", + "windows", + "xml-rs", +] + +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" +dependencies = [ + "gethostname", + "nix 0.22.3", + "winapi", + "winapi-wsapoll", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + +[[package]] +name = "zbus" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d8f1a037b2c4a67d9654dc7bdfa8ff2e80555bbefdd3c1833c1d1b27c963a6b" +dependencies = [ + "async-broadcast", + "async-channel", + "async-executor", + "async-io", + "async-lock", + "async-recursion", + "async-task", + "async-trait", + "byteorder", + "derivative", + "dirs 4.0.0", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "lazy_static", + "nix 0.23.1", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8fb5186d1c87ae88cf234974c240671238b4a679158ad3b94ec465237349a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "zbus_names" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a408fd8a352695690f53906dc7fd036be924ec51ea5e05666ff42685ed0af5" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zvariant" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd68e4e6432ef19df47d7e90e2e72b5e7e3d778e0ae3baddf12b951265cc758" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e977eaa3af652f63d479ce50d924254ad76722a6289ec1a1eac3231ca30430" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] diff --git a/rog-control-center/Cargo.toml b/rog-control-center/Cargo.toml new file mode 100644 index 00000000..73eebca2 --- /dev/null +++ b/rog-control-center/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "rog-control-center" +version = "0.1.3" +authors = ["Luke D. Jones "] +edition = "2021" + +[features] +mocking = [] + +[dependencies] +egui = { git = "https://github.com/emilk/egui" } +eframe= { git = "https://github.com/emilk/egui" } +#eframe= { git = "https://github.com/emilk/egui", default-features = false, features = ["dark-light", "default_fonts", "wgpu"] } + +rog_dbus = { path = "../rog-dbus" } +rog_aura = { path = "../rog-aura" } +rog_profiles = { path = "../rog-profiles" } +rog_supported = { path = "../rog-supported" } +# supergfxctl = { git = "https://gitlab.com/asus-linux/supergfxctl.git" } + +smol = "^1.2" + +serde = "^1.0" +toml = "^0.5" +serde_json = "^1.0" +serde_derive = "^1.0" +zbus = "^2.3" +nix = "^0.20.0" +tempfile = "3.2.0" +dirs = "3.0.1" + +[dependencies.notify-rust] +version = "^4.3" +default-features = false +features = ["z"] + +[profile.release] +lto = true +debug = false +opt-level = 3 +panic = "abort" + +[profile.bench] +debug = false +opt-level = 3 diff --git a/rog-control-center/LICENSE b/rog-control-center/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/rog-control-center/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/rog-control-center/Makefile b/rog-control-center/Makefile new file mode 100644 index 00000000..38b9f575 --- /dev/null +++ b/rog-control-center/Makefile @@ -0,0 +1,65 @@ +VERSION := $(shell grep -Pm1 'version = "(\d.\d.\d)"' Cargo.toml | cut -d'"' -f2) + +INSTALL = install +INSTALL_PROGRAM = ${INSTALL} -D -m 0755 +INSTALL_DATA = ${INSTALL} -D -m 0644 + +prefix = /usr +exec_prefix = $(prefix) +bindir = $(exec_prefix)/bin +datarootdir = $(prefix)/share +libdir = $(exec_prefix)/lib + +BIN_ROG := rog-control-center + +SRC := Cargo.toml Cargo.lock Makefile $(shell find -type f -wholename '**/src/*.rs') + +DEBUG ?= 0 +ifeq ($(DEBUG),0) + ARGS += --release + TARGET = release +endif + +VENDORED ?= 0 +ifeq ($(VENDORED),1) + ARGS += --frozen +endif + +all: build + +clean: + cargo clean + +distclean: + rm -rf .cargo vendor vendor.tar.xz + +install: + $(INSTALL_PROGRAM) "./target/release/$(BIN_ROG)" "$(DESTDIR)$(bindir)/$(BIN_ROG)" + $(INSTALL_DATA) "./data/$(BIN_ROG).desktop" "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + $(INSTALL_DATA) "./data/$(BIN_ROG).png" "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + +uninstall: + rm -f "$(DESTDIR)$(bindir)/$(BIN_ROG)" + rm -r "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop" + rm -r "$(DESTDIR)$(datarootdir)/icons/hicolor/512x512/apps/$(BIN_ROG).png" + +update: + cargo update + +vendor: + mkdir -p .cargo + cargo vendor | head -n -1 > .cargo/config + echo 'directory = "vendor"' >> .cargo/config + mv .cargo/config ./cargo-config + rm -rf .cargo + tar pcfJ vendor_asusctl_$(VERSION).tar.xz vendor + rm -rf vendor + +build: +ifeq ($(VENDORED),1) + @echo "version = $(VERSION)" + tar pxf vendor_asusctl_$(VERSION).tar.xz +endif + cargo build $(ARGS) + +.PHONY: all clean distclean install uninstall update build diff --git a/rog-control-center/README.md b/rog-control-center/README.md new file mode 100644 index 00000000..017c4070 --- /dev/null +++ b/rog-control-center/README.md @@ -0,0 +1,22 @@ +# App template + +This is a trial app cut down to bare essentials to show how to create an app that can run in the background +with some user-config options. + +egui based. Keep in mind that this is very much a bit of a mess due to experimenting. + +## Running + +Use `WINIT_UNIX_BACKEND=x11 rog-control-center`. `WINIT_UNIX_BACKEND` is required due to window decorations not updating and the window not really being set as visible/invisible on wayland. + +## Build features + +For testing some features that are typically not available on all laptops: + +```rust +cargo run --features mocking +``` + +## TODO + +- Add notification watch for certain UI elements to enforce an update (for example when a user changes Aura via a hot key). diff --git a/rog-control-center/data/rog-control-center.desktop b/rog-control-center/data/rog-control-center.desktop new file mode 100644 index 00000000..0e294f93 --- /dev/null +++ b/rog-control-center/data/rog-control-center.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=1.0 +Type=Application + +Name=ROG Control Center +Comment=Make your ASUS ROG Laptop go Brrrrr! +Categories=Settings + +Icon=rog-control-center +Exec=env WINIT_UNIX_BACKEND=x11 rog-control-center +Terminal=false diff --git a/rog-control-center/data/rog-control-center.png b/rog-control-center/data/rog-control-center.png new file mode 100644 index 0000000000000000000000000000000000000000..776e9eddb23d6bee49995dffb459b7ee6b67e2ec GIT binary patch literal 212632 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 z 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 literal 0 HcmV?d00001 diff --git a/rog-control-center/src/app.rs b/rog-control-center/src/app.rs new file mode 100644 index 00000000..4ded2cfe --- /dev/null +++ b/rog-control-center/src/app.rs @@ -0,0 +1,127 @@ +use std::{ + io::Write, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, +}; + +use egui::{Button, RichText}; +use rog_dbus::RogDbusClientBlocking; +use rog_supported::SupportedFunctions; + +use crate::{config::Config, get_ipc_file, page_states::PageDataStates, Page, SHOWING_GUI}; + +pub struct RogApp<'a> { + pub page: Page, + pub states: PageDataStates, + pub supported: SupportedFunctions, + /// Should the app begin showing the GUI + pub begin_show_gui: Arc, + /// Is the app GUI closed (and running in bg) + pub running_in_bg: bool, + // TODO: can probably just open and read whenever + pub config: Config, + pub asus_dbus: RogDbusClientBlocking<'a>, +} + +impl<'a> RogApp<'a> { + /// Called once before the first frame. + pub fn new( + start_closed: bool, + config: Config, + show_gui: Arc, + states: PageDataStates, + _cc: &eframe::CreationContext<'_>, + ) -> Self { + let (dbus, _) = RogDbusClientBlocking::new().unwrap(); + let supported = dbus.proxies().supported().supported_functions().unwrap(); + + Self { + supported, + states, + page: Page::System, + begin_show_gui: show_gui, + running_in_bg: start_closed, + config, + asus_dbus: dbus, + } + } +} + +impl<'a> eframe::App for RogApp<'a> { + fn on_exit_event(&mut self) -> bool { + if self.config.run_in_background { + self.running_in_bg = true; + get_ipc_file().unwrap().write_all(&[0]).unwrap(); + return false; + } + true + } + + /// Called each time the UI needs repainting, which may be many times per second. + /// Put your widgets into a `SidePanel`, `TopPanel`, `CentralPanel`, `Window` or `Area`. + fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { + let Self { + begin_show_gui: should_show_gui, + supported, + asus_dbus: dbus, + states, + .. + } = self; + if states.refresh_if_notfied(supported, dbus) { + ctx.request_repaint(); + } + + let page = self.page; + + if should_show_gui.load(Ordering::SeqCst) { + let mut ipc_file = get_ipc_file().unwrap(); + ipc_file.write_all(&[SHOWING_GUI]).unwrap(); + should_show_gui.store(false, Ordering::SeqCst); + frame.set_visible(true); + self.running_in_bg = false; + } + if self.running_in_bg { + // Request to draw nothing at all + ctx.request_repaint_after(Duration::from_millis(500)); + frame.set_visible(false); + return; + } + // Do all GUI display after this point + + self.top_bar(ctx, frame); + self.side_panel(ctx); + + if let Some(err) = self.states.error.clone() { + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading(RichText::new("Error!").size(28.0)); + + ui.centered_and_justified(|ui| { + ui.label(RichText::new(format!("The error was: {:?}", err)).size(22.0)); + }); + }); + egui::TopBottomPanel::bottom("error_bar") + .default_height(26.0) + .show(ctx, |ui| { + ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + if ui + .add(Button::new(RichText::new("Okay").size(20.0))) + .clicked() + { + self.states.error = None; + } + }); + }); + } else if page == Page::System { + self.system_page(ctx); + } else if page == Page::AuraEffects { + self.aura_page(ctx); + } else if page == Page::AnimeMatrix { + self.anime_page(ctx); + } else if page == Page::FanCurves { + self.fan_curve_page(ctx); + } + } +} diff --git a/rog-control-center/src/config.rs b/rog-control-center/src/config.rs new file mode 100644 index 00000000..bcb885b0 --- /dev/null +++ b/rog-control-center/src/config.rs @@ -0,0 +1,92 @@ +use std::{ + fs::{create_dir, OpenOptions}, + io::{Read, Write}, +}; + +use serde_derive::{Deserialize, Serialize}; +//use log::{error, info, warn}; + +use crate::error::Error; + +const CFG_DIR: &str = "rog"; +const CFG_FILE_NAME: &str = "app-template.cfg"; + +#[derive(Debug, Deserialize, Serialize)] +#[serde(default)] +pub struct Config { + pub run_in_background: bool, + pub startup_in_background: bool, + pub enable_notifications: bool, +} + +impl Default for Config { + fn default() -> Self { + Self { + run_in_background: true, + startup_in_background: false, + enable_notifications: true, + } + } +} + +impl Config { + pub fn load() -> Result { + let mut path = if let Some(dir) = dirs::config_dir() { + dir + } else { + return Err(Error::XdgVars); + }; + + path.push(CFG_DIR); + if !path.exists() { + create_dir(path.clone())?; + } + + path.push(CFG_FILE_NAME); + + let mut file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .open(&path)?; + + let mut buf = String::new(); + + if let Ok(read_len) = file.read_to_string(&mut buf) { + if read_len == 0 { + let default = Config::default(); + let t = toml::to_string_pretty(&default).unwrap(); + file.write_all(t.as_bytes())?; + return Ok(default); + } else if let Ok(data) = toml::from_str::(&buf) { + return Ok(data); + } + } + Err(Error::ConfigLoadFail) + } + + pub fn save(&self) -> Result<(), Error> { + let mut path = if let Some(dir) = dirs::config_dir() { + dir + } else { + return Err(Error::XdgVars); + }; + + path.push(CFG_DIR); + if !path.exists() { + create_dir(path.clone())?; + } + + path.push(CFG_FILE_NAME); + + let mut file = OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(&path)?; + + let t = toml::to_string_pretty(&self).unwrap(); + file.write_all(t.as_bytes())?; + Ok(()) + } +} diff --git a/rog-control-center/src/error.rs b/rog-control-center/src/error.rs new file mode 100644 index 00000000..98a9bef3 --- /dev/null +++ b/rog-control-center/src/error.rs @@ -0,0 +1,43 @@ +use std::fmt; + +#[derive(Debug)] +pub enum Error { + Io(std::io::Error), + Nix(nix::Error), + ConfigLoadFail, + ConfigLockFail, + XdgVars, +} + +impl fmt::Display for Error { + // This trait requires `fmt` with this exact signature. + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Error::Io(err) => write!(f, "Failed to open: {}", err), + Error::Nix(err) => write!(f, "Error: {}", err), + Error::ConfigLoadFail => write!(f, "Failed to load user config"), + Error::ConfigLockFail => write!(f, "Failed to lock user config"), + Error::XdgVars => write!(f, "XDG environment vars appear unset"), + } + } +} + +impl std::error::Error for Error {} + +impl From for Error { + fn from(err: std::io::Error) -> Self { + Error::Io(err) + } +} + +impl From for zbus::fdo::Error { + fn from(err: Error) -> Self { + zbus::fdo::Error::Failed(format!("Anime zbus error: {}", err)) + } +} + +impl From for Error { + fn from(err: nix::Error) -> Self { + Error::Nix(err) + } +} diff --git a/rog-control-center/src/lib.rs b/rog-control-center/src/lib.rs new file mode 100644 index 00000000..e97b287d --- /dev/null +++ b/rog-control-center/src/lib.rs @@ -0,0 +1,77 @@ +pub mod app; +use std::{ + fs::{remove_dir_all, File, OpenOptions}, + io::{Read, Write}, + process::exit, + thread::sleep, + time::Duration, +}; + +pub use app::RogApp; + +pub mod config; +pub mod error; +pub mod notify; +pub mod page_states; +pub mod widgets; + +use nix::{sys::stat, unistd}; +use tempfile::TempDir; +//use log::{error, info, warn}; + +pub const SHOWING_GUI: u8 = 1; +pub const SHOW_GUI: u8 = 2; + +#[derive(PartialEq, Clone, Copy)] +pub enum Page { + System, + AuraEffects, + AnimeMatrix, + FanCurves, +} + +/// Either exit the process, or return with a refreshed tmp-dir +pub fn on_tmp_dir_exists() -> Result { + let mut buf = [0u8; 4]; + let path = std::env::temp_dir().join("rog-gui"); + + let mut ipc_file = OpenOptions::new() + .read(true) + .write(true) + .create(false) + .open(path.join("ipc.pipe"))?; + + // If the app is running this ends up stacked on top of SHOWING_GUI + ipc_file.write_all(&[SHOW_GUI])?; + // tiny sleep to give the app a chance to respond + sleep(Duration::from_millis(10)); + ipc_file.read(&mut buf).ok(); + + // First entry is the actual state + if buf[0] == SHOWING_GUI { + ipc_file.write_all(&[SHOWING_GUI])?; // Store state again as we drained the fifo + exit(0); + } else if buf[0] == SHOW_GUI { + remove_dir_all(&path)?; + return tempfile::Builder::new() + .prefix("rog-gui") + .rand_bytes(0) + .tempdir(); + } + exit(-1); +} + +pub fn get_ipc_file() -> Result { + let tmp_dir = std::env::temp_dir().join("rog-gui"); + let fifo_path = tmp_dir.join("ipc.pipe"); + if let Err(e) = unistd::mkfifo(&fifo_path, stat::Mode::S_IRWXU) { + if !matches!(e, nix::Error::Sys(nix::errno::Errno::EEXIST)) { + return Err(e)?; + } + } + Ok(OpenOptions::new() + .read(true) + .write(true) + .truncate(true) + .open(&fifo_path)?) +} diff --git a/rog-control-center/src/main.rs b/rog-control-center/src/main.rs new file mode 100644 index 00000000..f194b840 --- /dev/null +++ b/rog-control-center/src/main.rs @@ -0,0 +1,94 @@ +use rog_control_center::{ + config::Config, get_ipc_file, notify::start_notifications, on_tmp_dir_exists, + page_states::PageDataStates, RogApp, SHOW_GUI, +}; +use rog_dbus::RogDbusClientBlocking; +use std::{ + io::Read, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + thread::spawn, + time::Duration, +}; + +fn main() -> Result<(), Box> { + // Startup + let mut config = Config::load()?; + let start_closed = config.startup_in_background; + + if config.startup_in_background { + config.run_in_background = true; + config.save()?; + } + + let (dbus, _) = RogDbusClientBlocking::new().unwrap(); + let supported = dbus.proxies().supported().supported_functions().unwrap(); + // Cheap method to alert to notifications rather than spinning a thread for each + // This is quite different when done in a retained mode app + let charge_notified = Arc::new(AtomicBool::new(false)); + let bios_notified = Arc::new(AtomicBool::new(false)); + let aura_notified = Arc::new(AtomicBool::new(false)); + let anime_notified = Arc::new(AtomicBool::new(false)); + let profiles_notified = Arc::new(AtomicBool::new(false)); + let fans_notified = Arc::new(AtomicBool::new(false)); + // TODO: change this to an error instead of the nested unwraps, then use to + // display a bare box app with error message. + let states = PageDataStates::new( + charge_notified.clone(), + bios_notified.clone(), + aura_notified.clone(), + anime_notified.clone(), + profiles_notified.clone(), + fans_notified.clone(), + &supported, + &dbus, + ); + + if config.enable_notifications { + start_notifications( + charge_notified, + bios_notified, + aura_notified, + anime_notified, + profiles_notified, + fans_notified, + )?; + } + + // tmp-dir must live to the end of program life + let _tmp_dir = match tempfile::Builder::new() + .prefix("rog-gui") + .rand_bytes(0) + .tempdir() + { + Ok(tmp) => tmp, + Err(_) => on_tmp_dir_exists().unwrap(), + }; + + let native_options = eframe::NativeOptions { + decorated: true, + ..Default::default() + }; + + let should_show_gui = Arc::new(AtomicBool::new(!start_closed)); + let should = should_show_gui.clone(); + spawn(move || { + // Loop is blocked here until a single byte is read + loop { + let mut buf = [0u8; 4]; + if get_ipc_file().unwrap().read(&mut buf).is_ok() && buf[0] == SHOW_GUI { + should_show_gui.store(true, Ordering::SeqCst); + // Give the starting app a change to read or we'll race it + std::thread::sleep(Duration::from_millis(10)); + } + } + }); + + eframe::run_native( + "ROG Control Center", + native_options, + Box::new(move |cc| Box::new(RogApp::new(start_closed, config, should, states, cc))), + ); +} diff --git a/rog-control-center/src/notify.rs b/rog-control-center/src/notify.rs new file mode 100644 index 00000000..a73a6727 --- /dev/null +++ b/rog-control-center/src/notify.rs @@ -0,0 +1,222 @@ +//TODO: a lot of app state refresh depends on this so there needs +// to be an extra AtomicBool for checking if notifications are enabled + +use notify_rust::{Hint, Notification, NotificationHandle}; +use rog_aura::AuraEffect; +use rog_dbus::{ + zbus_anime::AnimeProxy, zbus_charge::ChargeProxy, zbus_led::LedProxy, + zbus_profile::ProfileProxy, zbus_rogbios::RogBiosProxy, +}; +use rog_profiles::Profile; +use smol::{future, Executor}; +use std::{ + error::Error, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, Mutex, + }, + thread::spawn, +}; +use zbus::export::futures_util::StreamExt; + +const NOTIF_HEADER: &str = "ROG Control"; + +macro_rules! notify { + ($notifier:ident, $last_notif:ident, $data:expr) => { + if let Some(notif) = $last_notif.take() { + notif.close(); + } + if let Ok(x) = $notifier($data) { + $last_notif.replace(x); + } + }; +} + +macro_rules! base_notification { + ($body:expr) => { + Notification::new() + .summary(NOTIF_HEADER) + .body($body) + .timeout(2000) + .show() + }; +} + +type SharedHandle = Arc>>; + +pub fn start_notifications( + charge_notified: Arc, + bios_notified: Arc, + aura_notified: Arc, + anime_notified: Arc, + profiles_notified: Arc, + _fans_notified: Arc, +) -> Result<(), Box> { + let last_notification: SharedHandle = Arc::new(Mutex::new(None)); + + let executor = Executor::new(); + // BIOS notif + let x = last_notification.clone(); + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = RogBiosProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_notify_post_boot_sound().await { + p.for_each(|e| { + if let Ok(out) = e.args() { + if let Ok(ref mut lock) = x.try_lock() { + notify!(do_post_sound_notif, lock, &out.sound()); + } + bios_notified.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + // Charge notif + let x = last_notification.clone(); + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = ChargeProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_notify_charge().await { + p.for_each(|e| { + if let Ok(out) = e.args() { + if let Ok(ref mut lock) = x.try_lock() { + notify!(do_charge_notif, lock, &out.limit); + } + charge_notified.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + // Profile notif + let x = last_notification.clone(); + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = ProfileProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_notify_profile().await { + p.for_each(|e| { + if let Ok(out) = e.args() { + if let Ok(ref mut lock) = x.try_lock() { + notify!(do_thermal_notif, lock, &out.profile); + } + profiles_notified.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + // LED notif + let x = last_notification.clone(); + let a = aura_notified.clone(); + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = LedProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_notify_led().await { + p.for_each(|e| { + if let Ok(out) = e.args() { + if let Ok(ref mut lock) = x.try_lock() { + notify!(do_led_notif, lock, &out.data); + } + a.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = LedProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_notify_power_states().await { + p.for_each(|e| { + if let Ok(_out) = e.args() { + // if let Ok(ref mut lock) = last_notification.try_lock() { + // notify!(do_led_notif, lock, &out.data); + // } + aura_notified.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + executor + .spawn(async move { + let conn = zbus::Connection::system().await.unwrap(); + let proxy = AnimeProxy::new(&conn).await.unwrap(); + if let Ok(p) = proxy.receive_power_states().await { + p.for_each(|e| { + if let Ok(_out) = e.args() { + // if let Ok(ref mut lock) = last_notification.try_lock() { + // notify!(do_led_notif, lock, &out.data); + // } + anime_notified.store(true, Ordering::SeqCst); + } + future::ready(()) + }) + .await; + }; + }) + .detach(); + + spawn(move || loop { + smol::block_on(executor.tick()); + }); + Ok(()) +} + +fn do_thermal_notif(profile: &Profile) -> Result> { + let icon = match profile { + Profile::Balanced => "asus_notif_yellow", + Profile::Performance => "asus_notif_red", + Profile::Quiet => "asus_notif_green", + }; + let profile: &str = (*profile).into(); + let x = Notification::new() + .summary("ASUS ROG") + .body(&format!( + "Thermal profile changed to {}", + profile.to_uppercase(), + )) + .hint(Hint::Resident(true)) + .timeout(2000) + .hint(Hint::Category("device".into())) + //.hint(Hint::Transient(true)) + .icon(icon) + .show()?; + Ok(x) +} + +fn do_led_notif(ledmode: &AuraEffect) -> Result { + base_notification!(&format!( + "Keyboard LED mode changed to {}", + ledmode.mode_name() + )) +} + +fn do_charge_notif(limit: &u8) -> Result { + base_notification!(&format!("Battery charge limit changed to {}", limit)) +} + +fn do_post_sound_notif(on: &bool) -> Result { + base_notification!(&format!("BIOS Post sound {}", on)) +} diff --git a/rog-control-center/src/page_states.rs b/rog-control-center/src/page_states.rs new file mode 100644 index 00000000..4c7e5015 --- /dev/null +++ b/rog-control-center/src/page_states.rs @@ -0,0 +1,294 @@ +use std::{ + collections::{BTreeMap, HashMap, HashSet}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, +}; + +use egui::Vec2; +use rog_aura::{usb::AuraPowerDev, AuraEffect, AuraModeNum}; +use rog_dbus::RogDbusClientBlocking; +use rog_profiles::{fan_curve_set::FanCurveSet, FanCurvePU, Profile}; +use rog_supported::SupportedFunctions; + +#[derive(Clone, Debug)] +pub struct BiosState { + /// To be shared to a thread that checks notifications. + /// It's a bit general in that it won't provide *what* was + /// updated, so the full state needs refresh + pub was_notified: Arc, + pub post_sound: bool, + pub dedicated_gfx: bool, + pub panel_overdrive: bool, + pub dgpu_disable: bool, + pub egpu_enable: bool, +} + +impl BiosState { + pub fn new( + was_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + Self { + was_notified, + post_sound: if supported.rog_bios_ctrl.post_sound { + dbus.proxies().rog_bios().post_boot_sound().unwrap() != 0 + } else { + false + }, + dedicated_gfx: if supported.rog_bios_ctrl.dedicated_gfx { + dbus.proxies().rog_bios().dedicated_graphic_mode().unwrap() != 0 + } else { + false + }, + panel_overdrive: if supported.rog_bios_ctrl.panel_overdrive { + dbus.proxies().rog_bios().panel_overdrive().unwrap() != 0 + } else { + false + }, + // TODO: needs supergfx + dgpu_disable: supported.rog_bios_ctrl.dgpu_disable, + egpu_enable: supported.rog_bios_ctrl.egpu_enable, + } + } +} + +#[derive(Clone, Debug)] +pub struct ProfilesState { + pub was_notified: Arc, + pub list: Vec, + pub current: Profile, +} + +impl ProfilesState { + pub fn new( + was_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + Self { + was_notified, + list: if supported.platform_profile.platform_profile { + dbus.proxies().profile().profiles().unwrap() + } else { + vec![] + }, + current: if supported.platform_profile.platform_profile { + dbus.proxies().profile().active_profile().unwrap() + } else { + Profile::Balanced + }, + } + } +} + +#[derive(Clone, Debug)] +pub struct FanCurvesState { + pub was_notified: Arc, + pub show_curve: Profile, + pub show_graph: FanCurvePU, + pub enabled: HashSet, + pub curves: HashMap, + pub drag_delta: Vec2, +} + +impl FanCurvesState { + pub fn new( + was_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + let profiles = if supported.platform_profile.platform_profile { + dbus.proxies().profile().profiles().unwrap() + } else { + vec![Profile::Balanced, Profile::Quiet, Profile::Performance] + }; + let enabled = if supported.platform_profile.fan_curves { + HashSet::from_iter( + dbus.proxies() + .profile() + .enabled_fan_profiles() + .unwrap() + .iter() + .cloned(), + ) + } else { + HashSet::from([Profile::Balanced, Profile::Quiet, Profile::Performance]) + }; + + let mut curves: HashMap = HashMap::new(); + profiles.iter().for_each(|p| { + if supported.platform_profile.fan_curves { + let curve = dbus.proxies().profile().fan_curve_data(*p).unwrap(); + curves.insert(*p, curve); + } else { + let mut curve = FanCurveSet::default(); + curve.cpu.pwm = [30, 40, 60, 100, 140, 180, 200, 250]; + curve.cpu.temp = [20, 30, 40, 50, 70, 80, 90, 100]; + curve.gpu.pwm = [40, 80, 100, 140, 170, 200, 230, 250]; + curve.gpu.temp = [20, 30, 40, 50, 70, 80, 90, 100]; + curves.insert(*p, curve); + } + }); + + let show_curve = if supported.platform_profile.fan_curves { + dbus.proxies().profile().active_profile().unwrap() + } else { + Profile::Balanced + }; + + Self { + was_notified, + show_curve, + show_graph: FanCurvePU::CPU, + enabled, + curves, + drag_delta: Vec2::default(), + } + } +} + +#[derive(Clone, Debug)] +pub struct AuraState { + pub was_notified: Arc, + pub current_mode: AuraModeNum, + pub modes: BTreeMap, + pub enabled: AuraPowerDev, +} + +impl AuraState { + pub fn new( + was_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + Self { + was_notified, + current_mode: if !supported.keyboard_led.stock_led_modes.is_empty() { + dbus.proxies().led().led_mode().unwrap() + } else { + AuraModeNum::Static + }, + + modes: if !supported.keyboard_led.stock_led_modes.is_empty() { + dbus.proxies().led().led_modes().unwrap() + } else { + BTreeMap::new() + }, + enabled: dbus.proxies().led().leds_enabled().unwrap(), + } + } +} + +#[derive(Clone, Debug)] +pub struct AnimeState { + pub was_notified: Arc, + pub bright: u8, + pub boot: bool, + pub awake: bool, + pub sleep: bool, +} + +impl AnimeState { + pub fn new( + was_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + Self { + was_notified, + boot: if supported.anime_ctrl.0 { + dbus.proxies().anime().boot_enabled().unwrap() + } else { + false + }, + awake: if supported.anime_ctrl.0 { + dbus.proxies().anime().awake_enabled().unwrap() + } else { + false + }, + // TODO: + sleep: false, + bright: 200, + } + } +} + +#[derive(Debug)] +pub struct PageDataStates { + pub was_notified: Arc, + /// Because much of the app state here is the same as `RogBiosSupportedFunctions` + /// we can re-use that structure. + pub bios: BiosState, + pub aura: AuraState, + pub anime: AnimeState, + pub profiles: ProfilesState, + pub fan_curves: FanCurvesState, + pub charge_limit: i16, + pub error: Option, +} + +impl PageDataStates { + pub fn new( + charge_notified: Arc, + bios_notified: Arc, + aura_notified: Arc, + anime_notified: Arc, + profiles_notified: Arc, + fans_notified: Arc, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> Self { + Self { + was_notified: charge_notified, + charge_limit: dbus.proxies().charge().limit().unwrap(), + bios: BiosState::new(bios_notified, supported, dbus), + aura: AuraState::new(aura_notified, supported, dbus), + anime: AnimeState::new(anime_notified, supported, dbus), + profiles: ProfilesState::new(profiles_notified, supported, dbus), + fan_curves: FanCurvesState::new(fans_notified, supported, dbus), + error: None, + } + } + + pub fn refresh_if_notfied( + &mut self, + supported: &SupportedFunctions, + dbus: &RogDbusClientBlocking, + ) -> bool { + let mut notified = false; + if self.was_notified.load(Ordering::SeqCst) { + self.charge_limit = dbus.proxies().charge().limit().unwrap(); + self.was_notified.store(false, Ordering::SeqCst); + notified = true; + } + + if self.aura.was_notified.load(Ordering::SeqCst) { + self.aura = AuraState::new(self.aura.was_notified.clone(), supported, dbus); + self.aura.was_notified.store(false, Ordering::SeqCst); + notified = true; + } + + if self.bios.was_notified.load(Ordering::SeqCst) { + self.bios = BiosState::new(self.bios.was_notified.clone(), supported, dbus); + self.bios.was_notified.store(false, Ordering::SeqCst); + notified = true; + } + + if self.profiles.was_notified.load(Ordering::SeqCst) { + self.profiles = ProfilesState::new(self.profiles.was_notified.clone(), supported, dbus); + self.profiles.was_notified.store(false, Ordering::SeqCst); + notified = true; + } + + if self.fan_curves.was_notified.load(Ordering::SeqCst) { + self.fan_curves = + FanCurvesState::new(self.fan_curves.was_notified.clone(), supported, dbus); + self.fan_curves.was_notified.store(false, Ordering::SeqCst); + notified = true; + } + notified + } +} diff --git a/rog-control-center/src/widgets/anime_page.rs b/rog-control-center/src/widgets/anime_page.rs new file mode 100644 index 00000000..9ae20ab8 --- /dev/null +++ b/rog-control-center/src/widgets/anime_page.rs @@ -0,0 +1,77 @@ +use egui::RichText; + +use crate::RogApp; + +impl<'a> RogApp<'a> { + pub fn anime_page(&mut self, ctx: &egui::Context) { + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading("AniMe Matrix Settings"); + ui.label("Options are incomplete. Awake + Boot should work"); + + let Self { + states, + asus_dbus: dbus, + .. + } = self; + + let mut changed = false; + + ui.horizontal_wrapped(|ui| { + ui.vertical(|ui| { + let h = 16.0; + ui.set_row_height(22.0); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Brightness").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Boot").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Awake").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Sleep").size(h)); + }); + }); + ui.vertical(|ui| { + ui.set_row_height(22.0); + ui.horizontal_wrapped(|ui| { + if ui + .add(egui::Slider::new(&mut states.anime.bright, 0..=254)) + .changed() + { + changed = true; + } + }); + ui.horizontal_wrapped(|ui| { + if ui.checkbox(&mut states.anime.boot, "Enable").changed() { + dbus.proxies() + .anime() + .set_boot_on_off(states.anime.boot) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + }); + ui.horizontal_wrapped(|ui| { + if ui.checkbox(&mut states.anime.awake, "Enable").changed() { + dbus.proxies() + .anime() + .set_on_off(states.anime.awake) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + }); + ui.horizontal_wrapped(|ui| { + if ui.checkbox(&mut states.anime.sleep, "Enable").changed() { + changed = true; + } + }); + }); + }); + }); + } +} diff --git a/rog-control-center/src/widgets/aura_page.rs b/rog-control-center/src/widgets/aura_page.rs new file mode 100644 index 00000000..90e85fc0 --- /dev/null +++ b/rog-control-center/src/widgets/aura_page.rs @@ -0,0 +1,455 @@ +use egui::{RichText, Ui}; +use rog_aura::{ + usb::{AuraDev1866, AuraDev19b6, AuraDevice, AuraPowerDev}, + AuraModeNum, AuraZone, Colour, Speed, +}; +use rog_dbus::RogDbusClientBlocking; +use rog_supported::SupportedFunctions; + +use crate::{ + page_states::{AuraState, PageDataStates}, + RogApp, +}; + +impl<'a> RogApp<'a> { + pub fn aura_page(&mut self, ctx: &egui::Context) { + let Self { + supported, + states, + asus_dbus: dbus, + .. + } = self; + + egui::CentralPanel::default().show(ctx, |ui| { + Self::aura_power(supported, states, dbus, ui); + ui.separator(); + Self::aura_modes(supported, states, dbus, ui); + }); + } + + fn aura_power( + supported: &SupportedFunctions, + states: &mut PageDataStates, + dbus: &mut RogDbusClientBlocking, + ui: &mut Ui, + ) { + match supported.keyboard_led.prod_id { + AuraDevice::X1854 | AuraDevice::X1869 | AuraDevice::X1866 => { + Self::aura_power1(supported, states, dbus, ui) + } + AuraDevice::X19B6 => Self::aura_power2(supported, states, dbus, ui), + AuraDevice::Unknown => {} + } + } + + fn aura_power1( + supported: &SupportedFunctions, + states: &mut PageDataStates, + dbus: &mut RogDbusClientBlocking, + ui: &mut Ui, + ) { + let enabled_states = &mut states.aura.enabled; + + ui.heading("Aura go brrrrr! (incomplete)"); + ui.separator(); + + let boot = &mut enabled_states.x1866.contains(&AuraDev1866::Boot); + let sleep = &mut enabled_states.x1866.contains(&AuraDev1866::Sleep); + let keyboard = &mut enabled_states.x1866.contains(&AuraDev1866::Keyboard); + let lightbar = &mut enabled_states.x1866.contains(&AuraDev1866::Lightbar); + let mut changed = false; + + ui.horizontal_wrapped(|ui| { + ui.vertical(|ui| { + let h = 16.0; + ui.set_row_height(22.0); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Boot").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Awake").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Sleep").size(h)); + }); + }); + ui.vertical(|ui| { + ui.set_row_height(22.0); + ui.horizontal_wrapped(|ui| { + if ui.checkbox(boot, "Enable").changed() { + changed = true; + } + }); + ui.horizontal_wrapped(|ui| { + if ui.toggle_value(keyboard, "Keyboard").changed() { + changed = true; + } + if !supported.keyboard_led.multizone_led_mode.is_empty() { + if ui.toggle_value(lightbar, "Lightbar").changed() { + changed = true; + } + } + }); + ui.horizontal_wrapped(|ui| { + if ui.checkbox(sleep, "Enable").changed() { + changed = true; + } + }); + }); + }); + + if changed { + let mut enabled = Vec::new(); + let mut disabled = Vec::new(); + + let mut modify = |b: bool, a: AuraDev1866| { + if b { + enabled.push(a); + if !enabled_states.x1866.contains(&a) { + enabled_states.x1866.push(a); + } + } else { + disabled.push(a); + // This would be so much better as a hashset + if enabled_states.x1866.contains(&a) { + let mut idx = 0; + for (i, n) in enabled_states.x1866.iter().enumerate() { + if *n == a { + idx = i; + break; + } + } + enabled_states.x1866.remove(idx); + } + } + }; + modify(*boot, AuraDev1866::Boot); + modify(*sleep, AuraDev1866::Sleep); + modify(*keyboard, AuraDev1866::Keyboard); + if !supported.keyboard_led.multizone_led_mode.is_empty() { + modify(*lightbar, AuraDev1866::Lightbar); + } + + let mut send = |enable: bool, data: Vec| { + let options = AuraPowerDev { + x1866: data, + x19b6: vec![], + }; + // build data to send + dbus.proxies() + .led() + .set_leds_power(options, enable) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + }; + send(true, enabled); + send(false, disabled); + } + } + + fn aura_power2( + supported: &SupportedFunctions, + states: &mut PageDataStates, + dbus: &mut RogDbusClientBlocking, + ui: &mut Ui, + ) { + let enabled_states = &mut states.aura.enabled; + + ui.heading("Lights go brrrrr! (incomplete)"); + ui.separator(); + + let has_logo = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Logo); + let has_lightbar = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarLeft) + || supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarRight); + + let boot_bar = &mut enabled_states.x19b6.contains(&AuraDev19b6::BootBar); + let boot_logo = &mut enabled_states.x19b6.contains(&AuraDev19b6::BootLogo); + let boot_keyb = &mut enabled_states.x19b6.contains(&AuraDev19b6::BootKeyb); + + let awake_bar = &mut enabled_states.x19b6.contains(&AuraDev19b6::AwakeBar); + let awake_logo = &mut enabled_states.x19b6.contains(&AuraDev19b6::AwakeLogo); + let awake_keyb = &mut enabled_states.x19b6.contains(&AuraDev19b6::AwakeKeyb); + + let sleep_bar = &mut enabled_states.x19b6.contains(&AuraDev19b6::SleepBar); + let sleep_logo = &mut enabled_states.x19b6.contains(&AuraDev19b6::SleepLogo); + let sleep_keyb = &mut enabled_states.x19b6.contains(&AuraDev19b6::SleepKeyb); + + let mut changed = false; + + let mut item = |keyboard: &mut bool, logo: &mut bool, lightbar: &mut bool, ui: &mut Ui| { + ui.horizontal_wrapped(|ui| { + if ui.checkbox(keyboard, "Keyboard").changed() { + changed = true; + } + if has_logo && ui.checkbox(logo, "Logo").changed() { + changed = true; + } + if has_lightbar && ui.checkbox(lightbar, "Lightbar").changed() { + changed = true; + } + }); + }; + + ui.horizontal_wrapped(|ui| { + ui.vertical(|ui| { + let h = 16.0; + ui.set_row_height(22.0); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Boot").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Awake").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Sleep").size(h)); + }); + }); + ui.vertical(|ui| { + ui.set_row_height(22.0); + item(boot_keyb, boot_logo, boot_bar, ui); + item(awake_keyb, awake_logo, awake_bar, ui); + item(sleep_keyb, sleep_logo, sleep_bar, ui); + }); + }); + + if changed { + let mut enabled = Vec::new(); + let mut disabled = Vec::new(); + + let mut modify = |b: bool, a: AuraDev19b6| { + if b { + enabled.push(a); + if !enabled_states.x19b6.contains(&a) { + enabled_states.x19b6.push(a); + } + } else { + disabled.push(a); + // This would be so much better as a hashset + if enabled_states.x19b6.contains(&a) { + let mut idx = 0; + for (i, n) in enabled_states.x19b6.iter().enumerate() { + if *n == a { + idx = i; + break; + } + } + enabled_states.x1866.remove(idx); + } + } + }; + modify(*boot_keyb, AuraDev19b6::BootKeyb); + modify(*sleep_keyb, AuraDev19b6::SleepKeyb); + modify(*awake_keyb, AuraDev19b6::AwakeKeyb); + if supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Logo) + { + modify(*boot_logo, AuraDev19b6::BootLogo); + modify(*sleep_logo, AuraDev19b6::SleepLogo); + modify(*awake_logo, AuraDev19b6::AwakeLogo); + } + if supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarLeft) + { + modify(*boot_bar, AuraDev19b6::BootBar); + modify(*sleep_bar, AuraDev19b6::SleepBar); + modify(*awake_bar, AuraDev19b6::AwakeBar); + } + + let mut send = |enable: bool, data: Vec| { + let options = AuraPowerDev { + x1866: vec![], + x19b6: data, + }; + // build data to send + dbus.proxies() + .led() + .set_leds_power(options, enable) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + }; + send(true, enabled); + send(false, disabled); + } + } + + fn aura_modes( + supported: &SupportedFunctions, + states: &mut PageDataStates, + dbus: &mut RogDbusClientBlocking, + ui: &mut Ui, + ) { + let mut changed = false; + let mut selected = states.aura.current_mode; + + let has_keyzones = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Key2); + let has_logo = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Logo); + let has_lightbar = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarLeft) + || supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarRight); + + ui.heading("Aura modes"); + let mut item = |a: AuraModeNum, ui: &mut Ui| { + if ui + .selectable_value(&mut selected, a, format!("{:?}", a)) + .clicked() + { + changed = true; + } + }; + + ui.horizontal_wrapped(|ui| { + for a in states.aura.modes.keys() { + item(*a, ui); + } + }); + + // TODO: Need some sort of mapping to enable options only if + // they actually work. + if let Some(effect) = states.aura.modes.get_mut(&selected) { + let mut zone_button = |a: AuraZone, ui: &mut Ui| { + ui.selectable_value(&mut effect.zone, a, format!("{:?}", a)); + }; + let mut speed_button = |a: Speed, ui: &mut Ui| { + ui.selectable_value(&mut effect.speed, a, format!("{:?}", a)); + }; + let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| { + ui.selectable_value(&mut effect.direction, a, format!("{:?}", a)); + }; + + let mut c1: [f32; 3] = effect.colour1.into(); + let mut c2: [f32; 3] = effect.colour2.into(); + + ui.separator(); + ui.horizontal_wrapped(|ui| { + ui.vertical(|ui| { + let h = 16.0; + ui.set_row_height(22.0); + if has_keyzones || has_lightbar || has_logo { + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Zone").size(h)); + }); + } + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Colour 1").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Colour 2").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Speed").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.label(RichText::new("Direction").size(h)); + }); + }); + ui.vertical(|ui| { + ui.set_row_height(22.0); + if has_keyzones || has_lightbar || has_logo { + ui.horizontal_wrapped(|ui| { + zone_button(AuraZone::None, ui); + if has_keyzones { + zone_button(AuraZone::Key1, ui); + zone_button(AuraZone::Key2, ui); + zone_button(AuraZone::Key3, ui); + zone_button(AuraZone::Key4, ui); + } + if has_logo { + zone_button(AuraZone::Logo, ui); + } + if has_lightbar { + zone_button(AuraZone::BarLeft, ui); + zone_button(AuraZone::BarRight, ui); + } + }); + } + + egui::color_picker::color_edit_button_rgb(ui, &mut c1); + egui::color_picker::color_edit_button_rgb(ui, &mut c2); + + ui.horizontal_wrapped(|ui| { + speed_button(Speed::Low, ui); + speed_button(Speed::Med, ui); + speed_button(Speed::High, ui); + }); + + ui.horizontal_wrapped(|ui| { + dir_button(rog_aura::Direction::Left, ui); + dir_button(rog_aura::Direction::Down, ui); + dir_button(rog_aura::Direction::Right, ui); + dir_button(rog_aura::Direction::Up, ui); + }); + }); + }); + + effect.colour1 = Colour::from(&c1); + effect.colour2 = Colour::from(&c2); + } + + ui.separator(); + ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + if ui.add(egui::Button::new("Cancel")).clicked() { + let notif = states.aura.was_notified.clone(); + states.aura.modes = AuraState::new(notif, supported, dbus).modes; + } + + if ui.add(egui::Button::new("Apply")).clicked() { + changed = true; + } + }); + + // egui::TopBottomPanel::bottom("error_bar") + // .default_height(26.0) + // .show(ctx, |ui| { + // ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + // if ui.add(egui::Button::new("Cancel")).clicked() { + // let notif = states.aura.was_notified.clone(); + // states.aura.modes = AuraState::new(notif, supported, dbus).modes; + // } + + // if ui.add(egui::Button::new("Apply")).clicked() { + // changed = true; + // } + // }); + // }); + + if changed { + states.aura.current_mode = selected; + + dbus.proxies() + .led() + .set_led_mode(states.aura.modes.get(&selected).unwrap()) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + } +} diff --git a/rog-control-center/src/widgets/fan_curve_page.rs b/rog-control-center/src/widgets/fan_curve_page.rs new file mode 100644 index 00000000..79060725 --- /dev/null +++ b/rog-control-center/src/widgets/fan_curve_page.rs @@ -0,0 +1,199 @@ +use crate::{ + page_states::{FanCurvesState, ProfilesState}, + RogApp, +}; +use egui::{plot::Points, Ui}; +use rog_dbus::RogDbusClientBlocking; +use rog_profiles::{FanCurvePU, Profile}; +use rog_supported::SupportedFunctions; + +impl<'a> RogApp<'a> { + pub fn fan_curve_page(&mut self, ctx: &egui::Context) { + let Self { + supported, + states, + asus_dbus: dbus, + .. + } = self; + + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading("Custom fan curves"); + ui.label("A fan curve is only active when the related profile is active and the curve is enabled"); + Self::fan_curve( + supported, + &mut states.profiles, + &mut states.fan_curves, + dbus, &mut states.error, + ui, + ); + + Self::fan_graphs(&mut states.profiles, &mut states.fan_curves, dbus, &mut states.error, ui); + }); + } + + fn fan_curve( + supported: &SupportedFunctions, + profiles: &mut ProfilesState, + curves: &mut FanCurvesState, + dbus: &RogDbusClientBlocking, + do_error: &mut Option, + ui: &mut Ui, + ) { + ui.separator(); + ui.label("Enabled fan-curves"); + + let mut changed = false; + ui.horizontal(|ui| { + let mut item = |p: Profile, _curves: &mut FanCurvesState, mut checked: bool| { + if ui + .add(egui::Checkbox::new(&mut checked, format!("{:?}", p))) + .changed() + { + dbus.proxies() + .profile() + .set_fan_curve_enabled(p, checked) + .map_err(|err| { + *do_error = Some(err.to_string()); + }) + .ok(); + + #[cfg(feature = "mocking")] + if !checked { + _curves.enabled.remove(&p); + } else { + _curves.enabled.insert(p); + } + changed = true; + } + }; + + for f in profiles.list.iter() { + item(*f, curves, curves.enabled.contains(f)); + } + }); + + if changed { + // Need to update app data if change made + #[cfg(not(feature = "mocking"))] + { + let notif = curves.was_notified.clone(); + *curves = FanCurvesState::new(notif, supported, dbus); + } + } + } + + fn fan_graphs( + profiles: &mut ProfilesState, + curves: &mut FanCurvesState, + dbus: &RogDbusClientBlocking, + do_error: &mut Option, + ui: &mut Ui, + ) { + ui.separator(); + + let mut item = |p: Profile, ui: &mut Ui| { + ui.selectable_value(&mut curves.show_curve, p, format!("{p:?}")); + }; + + ui.horizontal_wrapped(|ui| { + for a in curves.curves.iter() { + item(*a.0, ui); + } + + ui.selectable_value( + &mut curves.show_graph, + FanCurvePU::CPU, + format!("{:?}", FanCurvePU::CPU), + ); + ui.selectable_value( + &mut curves.show_graph, + FanCurvePU::GPU, + format!("{:?}", FanCurvePU::GPU), + ); + }); + + let curve = curves.curves.get_mut(&curves.show_curve).unwrap(); + + use egui::plot::{Line, Plot, PlotPoints}; + + let data = if curves.show_graph == FanCurvePU::CPU { + &mut curve.cpu + } else { + &mut curve.gpu + }; + + let points = data.temp.iter().enumerate().map(|(idx, x)| { + let x = *x as f64; + let y = ((data.pwm[idx] as u32) * 100 / 255) as f64; + [x, y] + }); + + let line = Line::new(PlotPoints::from_iter(points.clone())).width(2.0); + let points = Points::new(PlotPoints::from_iter(points)).radius(3.0); + + Plot::new("my_plot") + .view_aspect(2.0) + // .center_x_axis(true) + // .center_y_axis(true) + .include_x(0.0) + .include_x(110.0) + .include_y(0.0) + .include_y(110.0) + .allow_scroll(false) + .allow_drag(false) + .allow_boxed_zoom(false) + .x_axis_formatter(|d, _r| format!("{}", d)) + .y_axis_formatter(|d, _r| format!("{:.*}%", 1, d)) + .label_formatter(|name, value| { + if !name.is_empty() { + format!("{}: {:.*}%", name, 1, value.y) + } else { + format!("Temp {}c\nFan {:.*}%", value.x as u8, 1, value.y) + } + }) + .show(ui, |plot_ui| { + if plot_ui.plot_hovered() { + let mut idx = 0; + + if let Some(point) = plot_ui.pointer_coordinate() { + let mut x: i32 = 255; + for (i, n) in data.temp.iter().enumerate() { + let tmp = x.min((point.x as i32 - *n as i32).abs()); + if tmp < x { + x = tmp; + idx = i; + } + } + + if plot_ui.plot_clicked() { + data.temp[idx] = point.x as u8; + data.pwm[idx] = (point.y * 255.0 / 100.0) as u8; + } else { + let drag = plot_ui.pointer_coordinate_drag_delta(); + if drag.length_sq() != 0.0 { + data.temp[idx] = (point.x as f32 + drag.x) as u8; + data.pwm[idx] = ((point.y as f32 + drag.y) * 255.0 / 100.0) as u8; + } + } + } + } + plot_ui.line(line); + plot_ui.points(points) + }); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + if ui.add(egui::Button::new("Apply Fan-curve")).clicked() { + #[cfg(not(feature = "mocking"))] + dbus.proxies() + .profile() + .set_fan_curve(profiles.current, data.clone()) + .map_err(|err| { + *do_error = Some(err.to_string()); + }) + .ok(); + #[cfg(feature = "mocking")] + dbg!("Applied"); + } + }); + } +} diff --git a/rog-control-center/src/widgets/mod.rs b/rog-control-center/src/widgets/mod.rs new file mode 100644 index 00000000..403e5a33 --- /dev/null +++ b/rog-control-center/src/widgets/mod.rs @@ -0,0 +1,13 @@ +mod anime_page; +mod aura_page; +mod fan_curve_page; +mod side_panel; +mod system_page; +mod top_bar; + +pub use anime_page::*; +pub use aura_page::*; +pub use fan_curve_page::*; +pub use side_panel::*; +pub use system_page::*; +pub use top_bar::*; diff --git a/rog-control-center/src/widgets/side_panel.rs b/rog-control-center/src/widgets/side_panel.rs new file mode 100644 index 00000000..cfaf8a89 --- /dev/null +++ b/rog-control-center/src/widgets/side_panel.rs @@ -0,0 +1,62 @@ +use crate::{Page, RogApp}; + +impl<'a> RogApp<'a> { + pub fn side_panel(&mut self, ctx: &egui::Context) { + egui::SidePanel::left("side_panel") + .resizable(false) + .default_width(60.0) // TODO: set size to match icon buttons when done + .show(ctx, |ui| { + let Self { page, .. } = self; + + ui.heading("Functions"); + + ui.separator(); + if ui + .selectable_value(page, Page::System, "System Settings") + .clicked() + { + *page = Page::System; + } + + if self.supported.platform_profile.fan_curves || cfg!(feature = "mocking") { + ui.separator(); + if ui + .selectable_value(page, Page::FanCurves, "Fan Curves") + .clicked() + { + *page = Page::FanCurves; + } + } + + if !self.supported.keyboard_led.stock_led_modes.is_empty() + || cfg!(feature = "mocking") + { + ui.separator(); + if ui + .selectable_value(page, Page::AuraEffects, "Keyboard Aura") + .clicked() + { + *page = Page::AuraEffects; + } + } + + if self.supported.anime_ctrl.0 || cfg!(feature = "mocking") { + ui.separator(); + if ui + .selectable_value(page, Page::AnimeMatrix, "AniMe Matrix") + .clicked() + { + *page = Page::AnimeMatrix; + } + } + + ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 0.0; + ui.label("Source code "); + ui.hyperlink_to("rog-gui.", "https://gitlab.com/asus-linux/rog-gui"); + }); + }); + }); + } +} diff --git a/rog-control-center/src/widgets/system_page.rs b/rog-control-center/src/widgets/system_page.rs new file mode 100644 index 00000000..29c645fd --- /dev/null +++ b/rog-control-center/src/widgets/system_page.rs @@ -0,0 +1,117 @@ +use crate::{page_states::PageDataStates, RogApp}; +use egui::Ui; +use rog_dbus::RogDbusClientBlocking; +use rog_profiles::Profile; + +impl<'a> RogApp<'a> { + pub fn system_page(&mut self, ctx: &egui::Context) { + let Self { + supported, + states, + asus_dbus: dbus, + .. + } = self; + + egui::CentralPanel::default().show(ctx, |ui| { + // The central panel the region left after adding TopPanel's and SidePanel's + + ui.heading("Experimental application for asusd"); + ui.horizontal(|ui| { + egui::global_dark_light_mode_buttons(ui); + egui::warn_if_debug_build(ui); + }); + + ui.separator(); + + egui::ScrollArea::vertical().show(ui, |ui| { + ui.heading("Charge control"); + let slider = egui::Slider::new(&mut states.charge_limit, 20..=100) + .text("Limit") + .step_by(1.0); + if ui.add(slider).drag_released() { + dbus.proxies() + .charge() + .set_limit(states.charge_limit as u8) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + + ui.separator(); + ui.heading("Bios options"); + + if supported.rog_bios_ctrl.post_sound { + if ui + .add(egui::Checkbox::new( + &mut states.bios.post_sound, + "POST sound", + )) + .changed() + { + dbus.proxies() + .rog_bios() + .set_post_boot_sound(states.bios.post_sound) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + } + + if supported.rog_bios_ctrl.dedicated_gfx { + if ui + .add(egui::Checkbox::new( + &mut states.bios.dedicated_gfx, + "G-Sync Dedicated GPU mode", + )) + .changed() + { + dbus.proxies() + .rog_bios() + .set_dedicated_graphic_mode(states.bios.dedicated_gfx) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + } + + if supported.platform_profile.platform_profile { + Self::platform_profile(states, dbus, ui); + } + }); + }); + } + + fn platform_profile(states: &mut PageDataStates, dbus: &RogDbusClientBlocking, ui: &mut Ui) { + ui.separator(); + ui.heading("Platform profile"); + + let mut changed = false; + let mut item = |p: Profile, ui: &mut Ui| { + if ui + .selectable_value(&mut states.profiles.current, p, format!("{p:?}")) + .clicked() + { + changed = true; + } + }; + + ui.horizontal_wrapped(|ui| { + for a in states.profiles.list.iter() { + item(*a, ui); + } + }); + + if changed { + dbus.proxies() + .profile() + .set_active_profile(states.profiles.current) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + }; + } +} diff --git a/rog-control-center/src/widgets/top_bar.rs b/rog-control-center/src/widgets/top_bar.rs new file mode 100644 index 00000000..723c434d --- /dev/null +++ b/rog-control-center/src/widgets/top_bar.rs @@ -0,0 +1,53 @@ +use crate::RogApp; + +impl<'a> RogApp<'a> { + pub fn top_bar(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { + let Self { states, config, .. } = self; + + egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { + // The top panel is often a good place for a menu bar: + egui::menu::bar(ui, |ui| { + ui.menu_button("File", |ui| { + if ui.button("Quit").clicked() { + frame.quit(); + } + }); + ui.menu_button("Settings", |ui| { + let (mut in_bg, mut hidden) = + { (config.run_in_background, config.startup_in_background) }; + if ui.checkbox(&mut in_bg, "Run in Background").clicked() { + config.run_in_background = in_bg; + config + .save() + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + if ui.checkbox(&mut hidden, "Startup Hidden").clicked() { + config.startup_in_background = in_bg; + config + .save() + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + if ui + .checkbox(&mut config.enable_notifications, "Enable Notifications") + .clicked() + { + config.enable_notifications = in_bg; + // TODO: set an atomicbool used in the notif thread + config + .save() + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } + }); + }); + }); + } +}