From 75b70514e12e8fedca20e2d09b410e9161fc99ac Mon Sep 17 00:00:00 2001 From: xzeldon Date: Wed, 4 Sep 2024 01:46:04 +0300 Subject: [PATCH] feature: tray applet --- Cargo.lock | 2420 ++++++++++++++++++++++++++++++++++++++- Cargo.toml | 9 +- README.md | 15 +- assets/mouse.psd | Bin 0 -> 92484 bytes assets/mouse_red.png | Bin 0 -> 16979 bytes assets/mouse_white.png | Bin 0 -> 15646 bytes assets/mouse_yellow.png | Bin 0 -> 16960 bytes img/demo.png | Bin 0 -> 63136 bytes src/controller.rs | 5 +- src/main.rs | 8 +- src/manager.rs | 1 + src/tray.rs | 239 ++++ src/watchman.rs | 144 --- 13 files changed, 2681 insertions(+), 160 deletions(-) create mode 100644 assets/mouse.psd create mode 100644 assets/mouse_red.png create mode 100644 assets/mouse_white.png create mode 100644 assets/mouse_yellow.png create mode 100644 img/demo.png create mode 100644 src/tray.rs delete mode 100644 src/watchman.rs diff --git a/Cargo.lock b/Cargo.lock index 09ae9ec..fe6b651 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,18 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aho-corasick" version = "1.1.3" @@ -11,21 +23,426 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "atk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitstream-io" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.6.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "cc" version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.6.0", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-foundation", + "core-graphics-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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "env_logger" version = "0.10.2" @@ -39,6 +456,441 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide 0.7.4", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.4.0" @@ -64,6 +916,85 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "is-terminal" version = "0.4.13" @@ -75,30 +1006,600 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + [[package]] name = "libc" version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "libxdo" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" +dependencies = [ + "libxdo-sys", +] + +[[package]] +name = "libxdo-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" +dependencies = [ + "libc", + "x11", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +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.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "muda" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1" +dependencies = [ + "cocoa", + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "libxdo", + "objc", + "once_cell", + "png", + "thiserror", + "windows-sys 0.59.0", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 2.0.2", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[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-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.7.4", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "pretty_env_logger" version = "0.5.0" @@ -109,13 +1610,237 @@ dependencies = [ "log", ] +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.77", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "razer-battery-report" -version = "0.1.0" +version = "0.2.0" dependencies = [ "hidapi", + "image", "log", "pretty_env_logger", + "tao", + "tray-icon", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", ] [[package]] @@ -147,12 +1872,209 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[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 = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a93f2c6b8fdaeb7f417bda89b5bc767999745c3052969664ae1fa65892deb7e" +dependencies = [ + "bitflags 2.6.0", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "termcolor" version = "1.4.1" @@ -162,13 +2084,357 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tray-icon" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" +dependencies = [ + "core-graphics", + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "thiserror", + "windows-sys 0.59.0", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "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.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[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.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", +] + +[[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.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -189,6 +2455,30 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -220,6 +2510,21 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-version" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -232,6 +2537,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -244,6 +2555,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -262,6 +2579,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -274,6 +2597,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -286,6 +2615,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -298,6 +2633,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -309,3 +2650,78 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 25725c4..f59627c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "razer-battery-report" -version = "0.1.0" +version = "0.2.0" authors = ["xzeldon "] edition = "2021" description = "Razer Battery Level Tray Indicator" @@ -18,3 +18,10 @@ hidapi = "2.6.3" # Logging log = "0.4.22" pretty_env_logger = "0.5.0" + +# Event Loop and Tray Icon +tao = "0.30.0" +tray-icon = "0.17.0" + +# Image manipulation +image = "0.25.2" diff --git a/README.md b/README.md index 3ce76a9..2818f3b 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@

razer-battery-report

- Razer Battery Level Tray¹ Indicator + Razer Battery Level Tray Indicator

-![stdout](/img/log.jpg) +

+ +

-Show your wireless Razer devices battery levels in your system tray¹. +Show your wireless Razer devices battery levels in your system tray. > This is a work in progress and currently support only **Razer DeathAdder V3 Pro**. > This works pretty well on **Windows**, should work on **Linux** if you *add udev rule to get access to usb devices* (see [here](https://github.com/libusb/hidapi/blob/master/udev/69-hid.rules)). But I haven't tested yet. -> ¹ — Tray feature coming soon - ## Usage ### Downloading a Prebuilt Binary @@ -36,7 +36,10 @@ To build, you must have [Rust](https://www.rust-lang.org/) and > You can grab `pid` and other data from the [openrazer](https://github.com/openrazer/openrazer/blob/352d13c416f42e572016c02fd10a52fc9848644a/driver/razermouse_driver.h#L9) ## Todo -- [ ] Tray Applet +- [x] Tray Applet + - [ ] Force update devices button in tray menu + - [ ] Colored tray icons for different battery levels + - [ ] Show log window button in tray menu - [ ] Prebuilt Binary - [ ] Command Line Arguments for update frequency - [ ] Support for other Razer Devices (I only have DeathAdder V3 Pro, so I won't be able to test it with other devices) diff --git a/assets/mouse.psd b/assets/mouse.psd new file mode 100644 index 0000000000000000000000000000000000000000..7c9cdb37f0b71a19cf54e2080143362a3bc4233e GIT binary patch literal 92484 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

N+NTd<#DKk5WNmP1!3O2`WXBU|JsNz5*70V zWn7B>vH9>j!gSP`uyY_{&D8WGr}lYd8i;4PbL2w2oAn$TC~6OP#^f)tw$$_l>p9Ef zC<}mjEk@7U11FLeejq7cXVEfzsQiS7`@f{{?it$&QbL4Y~OZ5!Ep6e1( zj5DEZSGQ9*&G?!J+1PglLwEpod%x5YoP_6QQ_|+ZLv>lu?Yv?3As8?|?pY~L?gB5E z`C-s`i{mqJ#EfeXV$5P`RT(T95j;u5^h)8jRsRSETNn>&2hr{C-B=DwQ9Sc>#!N$D zKjX?nm?**!+35gIBwbKb1!xCxbd(KdtZCv6?}i63(S#}So&7isd&C+lK`m+epPV&R zqN4NEr29A%vuEwYN&I0dxYI!wCwypg0kyexzf-9=i>o~M;tH7av6j~%oN6^Bb;txS+2>*S{x3(?&DQ(JF><`8#A@m;8NUJtE<^l~lx*enY) z012i(e{Zfky%&{`ZBcnDyqwj*?ypBMbC?d zW_d|k;*uOFTNL37K z@<(%j#|@(QrIuD11&PqdCp+2c?z8($CpvT)>isN=Hj0cnzOcuLS0h^t^1Rd)?Vapk zZTXNrWIC;_-LMV!&*M&HeB`kOw<*UH1{nbZQW3JKb2>|B7Hvjs%Q8jaM)qJLZe)Tx z1{md8scUVhj9EP>lVvhXr!S7@)-{{LVJ{R3!yxq=c2UP2CV3k2wrh&hgBJG6VL6ap z{*lkkXO&H-aX*cINAtn7D2ELal5VYw+h`?RzSInC{W@x{j zove8)a4nV5d32{ZDA>FEz$rH`? zZ8Os>S2vrsN?+J=LSHxA*iEpBm;0osiJDeH_ez=g z>{jhTNdDGL>0Wl_bhCtMowhzP9EMD9QF3ljDcvlBjq*}WfIJN6t@QcDbniK{(3a;l zn~upN(B$$>9g667A!r`kwPnZTQTTY_L~rq&?iMhuO)tO3M@cguoXb+M`tib>^=>vSEK-7IjMg zA+?k>@9A<#GLvb2zX@v&lc7@FTsJCpjvKIwj|w>H>ECZ$BcKK#dUh*GShV&=&|;6?j4yVb>%VMvxhid zAriwZh3mK_zEN-rNs*QY9$8%*_f zb+!8H%JQ<3{M2iq+g8pR?tGA*-N9_zI=PMZShRADmygfx{Re_W?M{UTAK16c$H!~U T%0(Wd-|pUaCyC;Uefjra^BEAL literal 0 HcmV?d00001 diff --git a/assets/mouse_red.png b/assets/mouse_red.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1c20406263ae5829cee5128d168ff0c3023628 GIT binary patch literal 16979 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 literal 0 HcmV?d00001 diff --git a/img/demo.png b/img/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..2a59b9e09af91bd5645d0088cd778c12ca140257 GIT binary patch literal 63136 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 RRo%f~>dM+mRf-?N{}-H(Y(4-0 literal 0 HcmV?d00001 diff --git a/src/controller.rs b/src/controller.rs index d714f33..41ae5cb 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -92,6 +92,7 @@ impl RazerReport { } } +#[derive(Debug)] pub struct DeviceController { pub handle: HidDevice, pub name: String, @@ -104,9 +105,7 @@ impl DeviceController { pub fn new(name: String, pid: u16, path: String) -> Result> { let api = HidApi::new()?; - // Convert the path String to a CString let c_path = CString::new(path)?; - let handle = api.open_path(c_path.as_ref())?; let transaction_id = RAZER_DEVICE_LIST @@ -127,7 +126,6 @@ impl DeviceController { let request = self.create_command(0x07, 0x80, 0x02); let response = self.send_payload(request)?; let battery_level = (response.arguments[1] as f32 / 255.0) * 100.0; - // println!("{}\t battery level: {:.2}%", self.name, battery_level); Ok(battery_level.round() as i32) } @@ -135,7 +133,6 @@ impl DeviceController { let request = self.create_command(0x07, 0x84, 0x02); let response = self.send_payload(request)?; let charging_status = response.arguments[1] != 0; - // println!("{}\t charging status: {}", self.name, charging_status); Ok(charging_status) } diff --git a/src/main.rs b/src/main.rs index 8c4cce6..afd9959 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,15 @@ -use watchman::Watchman; +#![windows_subsystem = "windows"] + +use tray::TrayApp; mod controller; mod devices; mod manager; -mod watchman; +mod tray; fn main() { std::env::set_var("RUST_LOG", "trace"); pretty_env_logger::init(); - let checker = Watchman::new(); + let checker = TrayApp::new(); checker.run(); } diff --git a/src/manager.rs b/src/manager.rs index 7835818..c64fa74 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -7,6 +7,7 @@ use std::vec::Vec; use crate::controller::DeviceController; use crate::devices::RAZER_DEVICE_LIST; +#[derive(Debug)] pub struct DeviceManager { pub device_controllers: Arc>>, } diff --git a/src/tray.rs b/src/tray.rs new file mode 100644 index 0000000..ecdc075 --- /dev/null +++ b/src/tray.rs @@ -0,0 +1,239 @@ +use std::{ + collections::HashMap, + rc::Rc, + sync::{mpsc, Arc, Mutex}, + thread, +}; + +use crate::manager::DeviceManager; +use log::{error, info}; +use tao::event_loop::EventLoopBuilder; +use tray_icon::{ + menu::{Menu, MenuEvent, MenuItem}, + TrayIcon, TrayIconBuilder, +}; + +const BATTERY_UPDATE_INTERVAL: std::time::Duration = std::time::Duration::from_secs(60); +const DEVICE_FETCH_INTERVAL: std::time::Duration = std::time::Duration::from_secs(5); + +#[derive(Debug)] +pub struct MemoryDevice { + pub name: String, + #[allow(unused)] + pub pid: u32, + pub battery_level: i32, + pub old_battery_level: i32, + pub is_charging: bool, +} + +impl MemoryDevice { + fn new(name: String, pid: u32) -> Self { + Self { + name, + pid, + battery_level: -1, + old_battery_level: 50, + is_charging: false, + } + } +} + +pub struct TrayApp { + device_manager: Arc>, + devices: Arc>>, + tray_icon: Rc>>, +} + +impl TrayApp { + pub fn new() -> Self { + Self { + device_manager: Arc::new(Mutex::new(DeviceManager::new())), + devices: Arc::new(Mutex::new(HashMap::new())), + tray_icon: Rc::new(Mutex::new(None)), + } + } + + pub fn run(&self) { + let icon = Self::create_icon(); + let event_loop = EventLoopBuilder::new().build(); + let tray_menu = Self::create_menu(); + + let (sender, receiver) = mpsc::channel(); + + self.spawn_device_fetch_thread(sender.clone()); + self.spawn_battery_check_thread(sender); + + self.run_event_loop(event_loop, icon, tray_menu, receiver); + } + + fn create_icon() -> tray_icon::Icon { + let icon = include_bytes!("../assets/mouse_white.png"); + let image = image::load_from_memory(icon) + .expect("Failed to open icon") + .into_rgba8(); + let (width, height) = image.dimensions(); + let rgba = image.into_raw(); + + tray_icon::Icon::from_rgba(rgba, width, height).expect("Failed to create icon") + } + + fn create_menu() -> Menu { + let tray_menu = Menu::new(); + let quit_item = MenuItem::new("Exit", true, None); + tray_menu.append_items(&[&quit_item]).unwrap(); + tray_menu + } + + fn spawn_device_fetch_thread(&self, tx: mpsc::Sender>) { + let devices = Arc::clone(&self.devices); + let device_manager = Arc::clone(&self.device_manager); + + thread::spawn(move || loop { + let (removed_devices, connected_devices) = { + let mut manager = device_manager.lock().unwrap(); + manager.fetch_devices() + }; + + { + let mut devices = devices.lock().unwrap(); + for id in removed_devices { + if let Some(device) = devices.remove(&id) { + info!("Device removed: {}", device.name); + } + } + + for &id in &connected_devices { + if let std::collections::hash_map::Entry::Vacant(e) = devices.entry(id) { + if let Some(name) = device_manager.lock().unwrap().get_device_name(id) { + e.insert(MemoryDevice::new(name.clone(), id)); + info!("New device: {}", name); + } else { + error!("Failed to get device name for id: {}", id); + } + } + } + } + + if !connected_devices.is_empty() { + tx.send(connected_devices).unwrap(); + } + + thread::sleep(DEVICE_FETCH_INTERVAL); + }); + } + + fn spawn_battery_check_thread(&self, tx: mpsc::Sender>) { + let devices = Arc::clone(&self.devices); + + thread::spawn(move || loop { + let device_ids: Vec = devices.lock().unwrap().keys().cloned().collect(); + tx.send(device_ids).unwrap(); + thread::sleep(BATTERY_UPDATE_INTERVAL); + }); + } + + fn run_event_loop( + &self, + event_loop: tao::event_loop::EventLoop<()>, + icon: tray_icon::Icon, + tray_menu: Menu, + rx: mpsc::Receiver>, + ) { + let tray_icon = Rc::clone(&self.tray_icon); + let devices = Arc::clone(&self.devices); + let device_manager = Arc::clone(&self.device_manager); + + let menu_channel = MenuEvent::receiver(); + + event_loop.run(move |event, _, control_flow| { + *control_flow = tao::event_loop::ControlFlow::WaitUntil( + std::time::Instant::now() + std::time::Duration::from_millis(100), + ); + + if let Ok(device_ids) = rx.try_recv() { + Self::update(&devices, &device_manager, &device_ids, &tray_icon); + } + + if let tao::event::Event::NewEvents(tao::event::StartCause::Init) = event { + Self::create_tray_icon(&tray_icon, &tray_menu, icon.clone()); + } + + if let Ok(event) = menu_channel.try_recv() { + if event.id == tray_menu.items()[0].id() { + *control_flow = tao::event_loop::ControlFlow::Exit; + } + } + }); + } + + fn create_tray_icon( + tray_icon: &Rc>>, + tray_menu: &Menu, + icon: tray_icon::Icon, + ) { + let tray_builder = TrayIconBuilder::new() + .with_menu(Box::new(tray_menu.clone())) + .with_tooltip("Service is running") + .with_icon(icon) + .build(); + + match tray_builder { + Ok(tray) => *tray_icon.lock().unwrap() = Some(tray), + Err(err) => error!("Failed to create tray icon: {}", err), + } + } + + fn update( + devices: &Arc>>, + manager: &Arc>, + device_ids: &[u32], + tray_icon: &Rc>>, + ) { + let mut devices = devices.lock().unwrap(); + let manager = manager.lock().unwrap(); + + for &id in device_ids { + if let Some(device) = devices.get_mut(&id) { + if let (Some(battery_level), Some(is_charging)) = ( + manager.get_device_battery_level(id), + manager.is_device_charging(id), + ) { + info!("{} battery level: {}%", device.name, battery_level); + info!("{} charging status: {}", device.name, is_charging); + + device.old_battery_level = device.battery_level; + device.battery_level = battery_level; + device.is_charging = is_charging; + + Self::check_notify(device); + + if let Some(tray_icon) = tray_icon.lock().unwrap().as_mut() { + let _ = tray_icon + .set_tooltip(Some(format!("{}: {}%", device.name, battery_level))); + } + } + } + } + } + + fn check_notify(device: &MemoryDevice) { + if device.battery_level == -1 { + return; + } + + if !device.is_charging + && (device.battery_level <= 5 + || (device.old_battery_level > 15 && device.battery_level <= 15)) + { + info!("{}: Battery low ({}%)", device.name, device.battery_level); + } else if device.old_battery_level <= 99 + && device.battery_level == 100 + && device.is_charging + { + info!( + "{}: Battery fully charged ({}%)", + device.name, device.battery_level + ); + } + } +} diff --git a/src/watchman.rs b/src/watchman.rs deleted file mode 100644 index 6680ab3..0000000 --- a/src/watchman.rs +++ /dev/null @@ -1,144 +0,0 @@ -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, - thread, - time::Duration, -}; - -use crate::manager::DeviceManager; -use log::{error, info}; - -const BATTERY_UPDATE_INTERVAL: u64 = 60; // seconds -const DEVICE_FETCH_INTERVAL: u64 = 5; // seconds - -#[derive(Clone)] -pub struct MemoryDevice { - pub name: String, - #[allow(unused)] - pub id: u32, - pub battery_level: i32, - pub old_battery_level: i32, - pub is_charging: bool, -} - -impl MemoryDevice { - fn new(name: String, id: u32) -> Self { - MemoryDevice { - name, - id, - battery_level: -1, - old_battery_level: 50, - is_charging: false, - } - } -} - -pub struct Watchman { - device_manager: Arc>, - devices: Arc>>, -} - -impl Watchman { - pub fn new() -> Self { - Watchman { - device_manager: Arc::new(Mutex::new(DeviceManager::new())), - devices: Arc::new(Mutex::new(HashMap::new())), - } - } - - pub fn run(&self) { - let devices = Arc::clone(&self.devices); - let device_manager = Arc::clone(&self.device_manager); - - // Device fetching thread - thread::spawn(move || loop { - let (removed_devices, connected_devices) = { - let mut manager = device_manager.lock().unwrap(); - manager.fetch_devices() - }; - - { - let mut devices = devices.lock().unwrap(); - for id in removed_devices { - if let Some(device) = devices.remove(&id) { - info!("Device removed: {}", device.name); - } - } - - for id in &connected_devices { - if !devices.contains_key(id) { - if let Some(name) = device_manager.lock().unwrap().get_device_name(*id) { - devices.insert(*id, MemoryDevice::new(name.clone(), *id)); - info!("New device: {}", name); - } else { - error!("Failed to get device name for id: {}", id); - } - } - } - } - - if !connected_devices.is_empty() { - Self::update(&devices, &device_manager, &connected_devices); - } - - thread::sleep(Duration::from_secs(DEVICE_FETCH_INTERVAL)); - }); - - // Battery check thread - loop { - let device_ids: Vec = { - let devices = self.devices.lock().unwrap(); - devices.keys().cloned().collect() - }; - Self::update(&self.devices, &self.device_manager, &device_ids); - thread::sleep(Duration::from_secs(BATTERY_UPDATE_INTERVAL)); - } - } - - fn update( - devices: &Arc>>, - manager: &Arc>, - device_ids: &[u32], - ) { - let mut devices = devices.lock().unwrap(); - let manager = manager.lock().unwrap(); - - for &id in device_ids { - if let Some(device) = devices.get_mut(&id) { - if let Some(battery_level) = manager.get_device_battery_level(id) { - if let Some(is_charging) = manager.is_device_charging(id) { - info!("{} battery level: {}%", device.name, battery_level); - info!("{} charging status: {}", device.name, is_charging); - - device.old_battery_level = device.battery_level; - device.battery_level = battery_level; - device.is_charging = is_charging; - - Self::check_notify(device); - } - } - } - } - } - - fn check_notify(device: &MemoryDevice) { - if device.battery_level == -1 { - return; - } - - if !device.is_charging - && (device.battery_level <= 5 - || (device.old_battery_level > 15 && device.battery_level <= 15)) - { - info!("{}: Battery low ({}%)", device.name, device.battery_level); - } else if device.old_battery_level <= 99 - && device.battery_level == 100 - && device.is_charging - { - info!( - "{}: Battery fully charged ({}%)", - device.name, device.battery_level - ); - } - } -}