From 52d97c68569ce04120ef434ec53439265e1174e1 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Mon, 19 Aug 2024 08:40:49 -0600 Subject: [PATCH 1/9] Added xcap and basic ScreenManager struct --- Cargo.lock | 633 ++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 +- src/lib.rs | 1 + src/screencap.rs | 44 ++++ 4 files changed, 670 insertions(+), 11 deletions(-) create mode 100644 src/screencap.rs diff --git a/Cargo.lock b/Cargo.lock index fc352aa..23f07fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -137,6 +137,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.18" @@ -240,6 +246,12 @@ 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 = "arboard" version = "3.4.0" @@ -261,6 +273,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[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.71", +] + [[package]] name = "arrayref" version = "0.3.7" @@ -523,6 +546,29 @@ 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 0.4.2", + "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 = "backtrace" version = "0.3.73" @@ -559,6 +605,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[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" @@ -574,6 +626,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcde5f311c85b8ca30c2e4198d4326bc342c76541590106f5fa4a50946ea499" + [[package]] name = "block" version = "0.1.6" @@ -649,6 +707,12 @@ dependencies = [ "piper", ] +[[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" @@ -767,6 +831,16 @@ 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" @@ -964,6 +1038,12 @@ 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 = "crypto-common" version = "0.1.6" @@ -980,6 +1060,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi 0.3.9", +] + [[package]] name = "deflate" version = "0.8.6" @@ -1372,6 +1463,22 @@ dependencies = [ "pin-project-lite", ] +[[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 = "failure" version = "0.1.8" @@ -1428,6 +1535,15 @@ dependencies = [ "miniz_oxide 0.7.4", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1607,6 +1723,16 @@ dependencies = [ "weezl", ] +[[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 = "gimli" version = "0.29.0" @@ -1753,6 +1879,16 @@ dependencies = [ "bitflags 2.6.0", ] +[[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" @@ -1778,6 +1914,12 @@ dependencies = [ "winapi 0.3.9", ] +[[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.3.9" @@ -1828,7 +1970,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1870,14 +2012,14 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", - "gif", - "jpeg-decoder", + "gif 0.11.4", + "jpeg-decoder 0.1.22", "num-iter", - "num-rational", + "num-rational 0.3.2", "num-traits", "png 0.16.8", "scoped_threadpool", - "tiff", + "tiff 0.6.1", ] [[package]] @@ -1888,10 +2030,37 @@ checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif 0.13.1", + "image-webp", "num-traits", "png 0.17.13", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff 0.9.1", + "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.2.6" @@ -1911,6 +2080,17 @@ 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.71", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -1928,6 +2108,15 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -1974,6 +2163,12 @@ dependencies = [ "rayon", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.69" @@ -2000,12 +2195,39 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] + +[[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" @@ -2128,6 +2350,15 @@ dependencies = [ "winapi 0.3.9", ] +[[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" @@ -2152,6 +2383,16 @@ dependencies = [ "log4rs", "serde", "serde_json", + "xcap", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", ] [[package]] @@ -2218,6 +2459,12 @@ dependencies = [ "unicase", ] +[[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.3.7" @@ -2299,6 +2546,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.26.4" @@ -2317,6 +2570,52 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[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 = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi 0.3.9", +] + +[[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.71", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -2348,6 +2647,17 @@ 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" @@ -2757,6 +3067,43 @@ 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.71", +] + +[[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 = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", +] [[package]] name = "quick-xml" @@ -2806,6 +3153,55 @@ 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.5.2" @@ -2911,6 +3307,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rgb" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" +dependencies = [ + "bytemuck", +] + [[package]] name = "ron" version = "0.8.1" @@ -3061,6 +3466,15 @@ dependencies = [ "syn 2.0.71", ] +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -3100,6 +3514,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "slab" version = "0.4.9" @@ -3204,6 +3627,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -3259,6 +3691,40 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows 0.52.0", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.10.1" @@ -3316,11 +3782,22 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" dependencies = [ - "jpeg-decoder", + "jpeg-decoder 0.1.22", "miniz_oxide 0.4.4", "weezl", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder 0.3.1", + "weezl", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -3361,11 +3838,26 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.16", +] + [[package]] name = "toml_datetime" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3375,7 +3867,7 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -3386,7 +3878,20 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.18", ] [[package]] @@ -3541,6 +4046,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[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.4" @@ -3753,7 +4275,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7b56f89937f1cf2ee1f1259cf2936a17a1f45d8f0aa1019fae6d470d304cfa6" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.34.0", "quote", ] @@ -3977,7 +4499,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", "windows-targets 0.52.6", ] @@ -3990,6 +4522,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-implement" version = "0.48.0" @@ -4012,6 +4554,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -4275,6 +4826,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +dependencies = [ + "memchr", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -4307,6 +4867,35 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +[[package]] +name = "xcap" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa35001e43f706819833cca4094d274c26a58f10239e3f962e7547b0e60ca3f" +dependencies = [ + "core-foundation", + "core-graphics", + "dbus", + "image 0.25.2", + "log", + "percent-encoding", + "sysinfo", + "thiserror", + "windows 0.54.0", + "xcb", +] + +[[package]] +name = "xcb" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e75181b5a62b6eeaa72f303d3cef7dbb841e22885bf6d3e66fe23e88c55dc6" +dependencies = [ + "bitflags 1.3.2", + "libc", + "quick-xml 0.30.0", +] + [[package]] name = "xcursor" version = "0.3.6" @@ -4434,6 +5023,30 @@ dependencies = [ "syn 2.0.71", ] +[[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", +] + [[package]] name = "zvariant" version = "3.15.2" diff --git a/Cargo.toml b/Cargo.toml index b96306d..fb4bad4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,4 +27,5 @@ serde = { version = "1.0.208", features = ["derive"] } serde_json = "1.0.125" log = "0.4.22" log4rs = "1.3.0" -image = "0.23.14" \ No newline at end of file +image = "0.23.14" +xcap = "0.0.11" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index d02c630..cf4b045 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ pub mod helpers; pub mod manager; pub mod products; pub mod refreshable_data; +pub mod screencap; pub mod widgets; pub use color::{contrast_color, HSBK32, RGB}; diff --git a/src/screencap.rs b/src/screencap.rs new file mode 100644 index 0000000..a8483a5 --- /dev/null +++ b/src/screencap.rs @@ -0,0 +1,44 @@ +use xcap::{image::Rgba, Monitor, Window, XCapError}; + +pub struct ScreencapManager { + monitors: Vec, + windows: Vec, +} + +impl ScreencapManager { + pub fn new() -> Result { + let monitors = Monitor::all()?; + let windows = Window::all()?; + Ok(Self { monitors, windows }) + } + + pub fn refresh(&mut self) -> Result<(), XCapError> { + self.monitors = Monitor::all()?; + self.windows = Window::all()?; + Ok(()) + } + + pub fn monitor_names(&self) -> Vec { + self.monitors.iter().map(|m| m.name().to_string()).collect() + } + + pub fn window_titles(&self) -> Vec { + self.windows.iter().map(|w| w.title().to_string()).collect() + } + + pub fn get_monitor(&self, name: &str) -> Option<&Monitor> { + self.monitors.iter().find(|m| m.name() == name) + } + + pub fn get_window(&self, title: &str) -> Option<&Window> { + self.windows.iter().find(|w| w.title() == title) + } + + pub fn from_click(x: i32, y: i32) -> Rgba { + let monitor = Monitor::from_point(x, y).unwrap(); + *monitor + .capture_image() + .unwrap() + .get_pixel(x as u32, y as u32) + } +} From 8f15d6142085b0b92eceb17b9779706120574ad0 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Mon, 19 Aug 2024 13:59:35 -0600 Subject: [PATCH 2/9] Added converters and convenience functions --- src/lib.rs | 1 + src/screencap.rs | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cf4b045..ddabaeb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,4 +13,5 @@ pub use helpers::{capitalize_first_letter, AngleIter}; pub use manager::Manager; pub use products::{get_products, Product}; pub use refreshable_data::RefreshableData; +pub use screencap::ScreencapManager; pub use widgets::{color_slider, display_color_circle, toggle_button}; diff --git a/src/screencap.rs b/src/screencap.rs index a8483a5..c03eda8 100644 --- a/src/screencap.rs +++ b/src/screencap.rs @@ -1,8 +1,11 @@ -use xcap::{image::Rgba, Monitor, Window, XCapError}; +use lifx_core::HSBK; +use xcap::{Monitor, Window, XCapError}; + +use crate::RGB; pub struct ScreencapManager { - monitors: Vec, - windows: Vec, + pub monitors: Vec, + pub windows: Vec, } impl ScreencapManager { @@ -34,11 +37,35 @@ impl ScreencapManager { self.windows.iter().find(|w| w.title() == title) } - pub fn from_click(x: i32, y: i32) -> Rgba { + pub fn from_click(&self, x: i32, y: i32) -> HSBK { let monitor = Monitor::from_point(x, y).unwrap(); - *monitor + let rgba = *monitor .capture_image() .unwrap() - .get_pixel(x as u32, y as u32) + .get_pixel(x as u32, y as u32); + RGB { + red: rgba[0], + green: rgba[1], + blue: rgba[2], + temperature: None, + } + .into() + } + + pub fn bounding_box(&self) -> eframe::egui::Rect { + let mut x_min = i32::MAX; + let mut y_min = i32::MAX; + let mut x_max = i32::MIN; + let mut y_max = i32::MIN; + for monitor in &self.monitors { + x_min = x_min.min(monitor.x()); + y_min = y_min.min(monitor.y()); + x_max = x_max.max(monitor.x() + monitor.width() as i32); + y_max = y_max.max(monitor.y() + monitor.height() as i32); + } + eframe::egui::Rect::from_min_max( + eframe::egui::Pos2::new(x_min as f32, y_min as f32), + eframe::egui::Pos2::new(x_max as f32, y_max as f32), + ) } } From 3e10558136dc5d0eb43d24a69e93dd27bd30580d Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Wed, 21 Aug 2024 07:31:08 -0600 Subject: [PATCH 3/9] eyedropper toggle and inside window works --- src/main.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3b0ec16..3e98b3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,8 @@ use log4rs::{ filter::threshold::ThresholdFilter, }; use mantle::color::{kelvin_to_rgb, HSBK32}; -use mantle::color_slider; use mantle::products::TemperatureRange; +use mantle::{color_slider, ScreencapManager}; use serde::{Deserialize, Serialize}; use std::ops::RangeInclusive; use std::{ @@ -99,6 +99,7 @@ struct MantleApp { #[serde(skip)] mgr: Manager, show_about: bool, + show_eyedropper: bool, } impl Default for MantleApp { @@ -107,6 +108,7 @@ impl Default for MantleApp { Self { mgr, show_about: false, + show_eyedropper: false, } } } @@ -152,7 +154,7 @@ impl MantleApp { } fn display_device( - &self, + &mut self, ui: &mut Ui, device: &DeviceInfo, bulbs: &MutexGuard>, @@ -192,8 +194,9 @@ impl MantleApp { toggle_button(ui, &self.mgr, device, Vec2::new(1.0, 1.0), bulbs); }); if let Some(before_color) = color { - let after_color = + let mut after_color = self.display_color_controls(ui, device, color.unwrap_or(default_hsbk())); + after_color = handle_eyedropper(self, ui).unwrap_or(after_color); if before_color != after_color { match device { DeviceInfo::Bulb(bulb) => { @@ -347,6 +350,24 @@ impl MantleApp { } } +fn handle_eyedropper(app: &mut MantleApp, ui: &mut Ui) -> Option { + let mut color: Option = None; + if ui.add(egui::Button::new("Eyedropper")).clicked() { + app.show_eyedropper = !app.show_eyedropper; + } + if app.show_eyedropper { + let screencap = ScreencapManager::new().unwrap(); + // todo: capture entire screen, not just app window + if ui.ctx().input(|i| i.pointer.any_down()) { + if let Some(mpos) = ui.ctx().pointer_interact_pos() { + color = Some(screencap.from_click(mpos.x as i32, mpos.y as i32)); + app.show_eyedropper = false; + } + } + } + color +} + impl eframe::App for MantleApp { fn save(&mut self, storage: &mut dyn eframe::Storage) { eframe::set_value(storage, eframe::APP_KEY, self); @@ -365,7 +386,8 @@ impl eframe::App for MantleApp { }); egui::CentralPanel::default().show(_ctx, |ui| { egui::ScrollArea::vertical().show(ui, |ui| { - let bulbs = self.mgr.bulbs.lock(); + let bulbs = self.mgr.bulbs.clone(); + let bulbs = bulbs.lock(); let mut seen_groups = HashSet::::new(); ui.vertical(|ui| { if let Ok(bulbs) = bulbs { From 7989165b39dcc07093a9c4ee4a1cc58acb8963f0 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Wed, 21 Aug 2024 08:47:47 -0600 Subject: [PATCH 4/9] Add cursor icon --- src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.rs b/src/main.rs index 3e98b3e..e6d6a28 100644 --- a/src/main.rs +++ b/src/main.rs @@ -357,6 +357,9 @@ fn handle_eyedropper(app: &mut MantleApp, ui: &mut Ui) -> Option { } if app.show_eyedropper { let screencap = ScreencapManager::new().unwrap(); + ui.ctx().output_mut(|out| { + out.cursor_icon = egui::CursorIcon::Crosshair; + }); // todo: capture entire screen, not just app window if ui.ctx().input(|i| i.pointer.any_down()) { if let Some(mpos) = ui.ctx().pointer_interact_pos() { From 947f3db0bc1549a379a44f580915dad61b8c6bd8 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Fri, 23 Aug 2024 08:45:20 -0600 Subject: [PATCH 5/9] Eyedropper works offscreen --- Cargo.lock | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 ++- src/main.rs | 16 +++++++------- src/screencap.rs | 4 +++- 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23f07fb..954a3fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1098,6 +1098,21 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" +[[package]] +name = "device_query" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafa241a89a5edccff5057d0b85fbc083a781bd03d766c11a688331604980985" +dependencies = [ + "lazy_static", + "macos-accessibility-client", + "pkg-config", + "readkey", + "readmouse", + "windows 0.48.0", + "x11", +] + [[package]] name = "digest" version = "0.10.7" @@ -2195,6 +2210,12 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[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" @@ -2359,6 +2380,16 @@ dependencies = [ "imgref", ] +[[package]] +name = "macos-accessibility-client" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf7710fbff50c24124331760978fb9086d6de6288dcdb38b25a97f8b1bdebbb" +dependencies = [ + "core-foundation", + "core-foundation-sys", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2372,6 +2403,7 @@ dependencies = [ name = "mantle" version = "0.0.1" dependencies = [ + "device_query", "eframe", "egui_extras", "env_logger", @@ -3234,6 +3266,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "readkey" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7677f98ca49bc9bb26e04c8abf80ba579e2cb98e8a384a0ff8128ad70670d249" + +[[package]] +name = "readmouse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be105c72a1e6a5a1198acee3d5b506a15676b74a02ecd78060042a447f408d94" + [[package]] name = "redox_syscall" version = "0.3.5" @@ -4835,6 +4879,16 @@ 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" diff --git a/Cargo.toml b/Cargo.toml index fb4bad4..6156137 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,4 +28,5 @@ serde_json = "1.0.125" log = "0.4.22" log4rs = "1.3.0" image = "0.23.14" -xcap = "0.0.11" \ No newline at end of file +xcap = "0.0.11" +device_query = "2.1.0" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e6d6a28..8363afa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ #![cfg_attr( all(target_os = "windows", not(debug_assertions),), windows_subsystem = "windows" -)] // Hide console window on Release +)] +// Hide console window on Release +use device_query::{DeviceQuery, DeviceState}; use eframe::egui::{self, Color32, Modifiers, RichText, Ui, Vec2}; use image::GenericImageView; use lifx_core::HSBK; @@ -360,12 +362,12 @@ fn handle_eyedropper(app: &mut MantleApp, ui: &mut Ui) -> Option { ui.ctx().output_mut(|out| { out.cursor_icon = egui::CursorIcon::Crosshair; }); - // todo: capture entire screen, not just app window - if ui.ctx().input(|i| i.pointer.any_down()) { - if let Some(mpos) = ui.ctx().pointer_interact_pos() { - color = Some(screencap.from_click(mpos.x as i32, mpos.y as i32)); - app.show_eyedropper = false; - } + let device_state = DeviceState::new(); + let mouse = device_state.get_mouse(); + if mouse.button_pressed[1] { + let position = mouse.coords; + color = Some(screencap.from_click(position.0, position.1)); + app.show_eyedropper = false; } } color diff --git a/src/screencap.rs b/src/screencap.rs index c03eda8..72bf388 100644 --- a/src/screencap.rs +++ b/src/screencap.rs @@ -39,10 +39,12 @@ impl ScreencapManager { pub fn from_click(&self, x: i32, y: i32) -> HSBK { let monitor = Monitor::from_point(x, y).unwrap(); + let new_x = x - monitor.x(); + let new_y = y - monitor.y(); let rgba = *monitor .capture_image() .unwrap() - .get_pixel(x as u32, y as u32); + .get_pixel(new_x as u32, new_y as u32); RGB { red: rgba[0], green: rgba[1], From 3c855480cbaee0000087a4d5f4699790cb5d811d Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Fri, 23 Aug 2024 08:46:58 -0600 Subject: [PATCH 6/9] update xcap --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 954a3fb..dd10c19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4923,9 +4923,9 @@ checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcap" -version = "0.0.11" +version = "0.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa35001e43f706819833cca4094d274c26a58f10239e3f962e7547b0e60ca3f" +checksum = "ef63013185432ec4957e2ef8f5d075ea26eebda6374883b2669896195634f235" dependencies = [ "core-foundation", "core-graphics", diff --git a/Cargo.toml b/Cargo.toml index 6156137..e2f67d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,5 +28,5 @@ serde_json = "1.0.125" log = "0.4.22" log4rs = "1.3.0" image = "0.23.14" -xcap = "0.0.11" +xcap = "0.0.12" device_query = "2.1.0" \ No newline at end of file From 690882493d9eb6837756d42cb9b2f9b4893d6458 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Sat, 24 Aug 2024 09:27:38 -0600 Subject: [PATCH 7/9] Added eyedropper icon --- res/icons/color-picker.png | Bin 0 -> 238 bytes src/main.rs | 14 +++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 res/icons/color-picker.png diff --git a/res/icons/color-picker.png b/res/icons/color-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..5fac488902c2ec1ac2fcd3ecd3730733ecb06dc3 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{i3-AeX{r~?zkQsXDavhLjDhcun{?G7qyMY&w$64SJS8DhXUtCD zz+uVNw?eSh@($Fnh_h#p( b&>it|`xws&uQb>Sw2r~k)z4*}Q$iB}-V0G_ literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 8363afa..67698c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,6 +40,7 @@ const KELVIN_RANGE: TemperatureRange = TemperatureRange { }; const REFRESH_RATE: Duration = Duration::from_secs(10); const ICON: &[u8; 1751] = include_bytes!("../res/logo32.png"); +const EYEDROPPER_ICON: &[u8; 238] = include_bytes!("../res/icons/color-picker.png"); fn main() -> eframe::Result { let logfile = FileAppender::builder() @@ -354,7 +355,18 @@ impl MantleApp { fn handle_eyedropper(app: &mut MantleApp, ui: &mut Ui) -> Option { let mut color: Option = None; - if ui.add(egui::Button::new("Eyedropper")).clicked() { + // if ui.add(egui::Button::new("Eyedropper")).clicked() { + // app.show_eyedropper = !app.show_eyedropper; + // } + if ui + .add( + egui::Button::image( + egui::Image::from_bytes("", EYEDROPPER_ICON).fit_to_exact_size(Vec2::new(15., 15.)), + ) + .sense(egui::Sense::click()), + ) + .clicked() + { app.show_eyedropper = !app.show_eyedropper; } if app.show_eyedropper { From 82d6a155be66f982d5071a6bfacd3c1e1754687c Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Sat, 24 Aug 2024 09:28:18 -0600 Subject: [PATCH 8/9] update cargo versions and mantle version --- Cargo.lock | 14 +++++++------- Cargo.toml | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd10c19..5025ee5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2401,7 +2401,7 @@ dependencies = [ [[package]] name = "mantle" -version = "0.0.1" +version = "0.0.2" dependencies = [ "device_query", "eframe", @@ -3459,9 +3459,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] @@ -3478,9 +3478,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", @@ -3489,9 +3489,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", diff --git a/Cargo.toml b/Cargo.toml index e2f67d9..da415d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "mantle" authors = ["Sawyer McLane"] description = "A simple LIFX control application" -version = "0.0.1" +version = "0.0.2" repository = "https://github.com/samclane/mantle" readme = "README.md" keywords = ["lifx", "home", "automation", "lighting"] @@ -23,8 +23,8 @@ failure = "0.1.8" eframe = { version = "0.28.1", features = ["persistence"] } egui_extras = { version = "0.28.1", features = ["default", "image"] } env_logger = { version = "0.11.5", features = ["auto-color", "humantime"] } -serde = { version = "1.0.208", features = ["derive"] } -serde_json = "1.0.125" +serde = { version = "1.0.209", features = ["derive"] } +serde_json = "1.0.127" log = "0.4.22" log4rs = "1.3.0" image = "0.23.14" From 32c1a4217a49ef7ee270e2f3f90611989acbe2e0 Mon Sep 17 00:00:00 2001 From: Sawyer McLane Date: Sat, 24 Aug 2024 09:29:34 -0600 Subject: [PATCH 9/9] updated screenshot --- res/screenshot.png | Bin 38876 -> 33506 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/screenshot.png b/res/screenshot.png index 3e1652535f5da11d2a9009f41c4a1f08dcfbd87c..2230737dee456eac87f68e63399bb7e5516f537e 100644 GIT binary patch literal 33506 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 JGF|7;{{xb-dF=oI literal 38876 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