diff --git a/Cargo.lock b/Cargo.lock index f26c18f..145df7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,41 +2,12 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ab_glyph" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" - [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.4", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aligned" version = "0.4.3" @@ -55,40 +26,6 @@ dependencies = [ "equator", ] -[[package]] -name = "android-activity" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" -dependencies = [ - "android-properties", - "bitflags 2.11.1", - "cc", - "jni", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys 0.6.0+11769913", - "num_enum", - "thiserror 2.0.18", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.102" @@ -101,27 +38,6 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -[[package]] -name = "arboard" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" -dependencies = [ - "clipboard-win", - "image", - "log", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.2", - "parking_lot", - "percent-encoding", - "windows-sys 0.60.2", - "wl-clipboard-rs", - "x11rb", -] - [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -130,7 +46,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -154,21 +70,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.5.0" @@ -190,7 +91,7 @@ dependencies = [ "num-traits", "pastey", "rayon", - "thiserror 2.0.18", + "thiserror", "v_frame", "y4m", ] @@ -218,21 +119,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "bit-set" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" - [[package]] name = "bit_field" version = "0.10.3" @@ -260,21 +146,6 @@ dependencies = [ "no_std_io2", ] -[[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 0.5.2", -] - [[package]] name = "built" version = "0.8.0" @@ -292,20 +163,6 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] [[package]] name = "byteorder-lite" @@ -313,63 +170,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.11.1", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" -dependencies = [ - "bitflags 2.11.1", - "polling", - "rustix 1.1.4", - "slab", - "tracing", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop 0.13.0", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" -dependencies = [ - "calloop 0.14.4", - "rustix 1.1.4", - "wayland-backend", - "wayland-client", -] - [[package]] name = "cc" version = "1.2.61" @@ -388,156 +188,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "clipboard-win" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -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.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - [[package]] name = "crc32fast" version = "1.5.0" @@ -578,278 +234,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -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 = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.11.1", - "objc2 0.6.4", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dlib" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" -dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "drm" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" -dependencies = [ - "bitflags 2.11.1", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "libc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690" -dependencies = [ - "drm-sys", - "rustix 1.1.4", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8" -dependencies = [ - "libc", - "linux-raw-sys 0.9.4", -] - -[[package]] -name = "ecolor" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b" -dependencies = [ - "bytemuck", - "emath", -] - -[[package]] -name = "eframe" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ac2645a9bf4826eb4e91488b1f17b8eaddeef09396706b2f14066461338e24f" -dependencies = [ - "ahash", - "bytemuck", - "document-features", - "egui", - "egui-wgpu", - "egui-winit", - "egui_glow", - "image", - "js-sys", - "log", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "parking_lot", - "percent-encoding", - "pollster", - "raw-window-handle", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "web-time", - "wgpu", - "winapi", - "windows-sys 0.52.0", - "winit", -] - -[[package]] -name = "egui" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974" -dependencies = [ - "ahash", - "emath", - "epaint", - "log", - "nohash-hasher", -] - -[[package]] -name = "egui-wgpu" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00fd5d06d8405397e64a928fa0ef3934b3c30273ea7603e3dc4627b1f7a1a82" -dependencies = [ - "ahash", - "bytemuck", - "document-features", - "egui", - "epaint", - "log", - "thiserror 1.0.69", - "type-map", - "web-time", - "wgpu", - "winit", -] - -[[package]] -name = "egui-winit" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6" -dependencies = [ - "ahash", - "arboard", - "egui", - "log", - "raw-window-handle", - "smithay-clipboard", - "web-time", - "webbrowser", - "winit", -] - -[[package]] -name = "egui_glow" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e39bccc683cd43adab530d8f21a13eb91e80de10bcc38c3f1c16601b6f62b26" -dependencies = [ - "ahash", - "bytemuck", - "egui", - "glow 0.14.2", - "log", - "memoffset", - "wasm-bindgen", - "web-sys", - "winit", -] - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "emath" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "epaint" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f" -dependencies = [ - "ab_glyph", - "ahash", - "bytemuck", - "ecolor", - "emath", - "epaint_default_fonts", - "log", - "nohash-hasher", - "parking_lot", -] - -[[package]] -name = "epaint_default_fonts" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea" - [[package]] name = "equator" version = "0.4.2" @@ -867,7 +257,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -876,22 +266,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "error-code" -version = "3.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" - [[package]] name = "exr" version = "1.74.0" @@ -928,12 +302,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "flate2" version = "1.1.9" @@ -944,117 +312,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[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.117", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "slab", -] - -[[package]] -name = "gbm" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a" -dependencies = [ - "bitflags 2.11.1", - "drm", - "drm-fourcc", - "gbm-sys", - "libc", - "wayland-backend", - "wayland-server", -] - -[[package]] -name = "gbm-sys" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f" -dependencies = [ - "libc", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "getrandom" version = "0.3.4" @@ -1077,111 +334,6 @@ dependencies = [ "weezl", ] -[[package]] -name = "gl" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glow" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.11.1", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.11.1", -] - -[[package]] -name = "gpu-allocator" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "winapi", - "windows", -] - -[[package]] -name = "gpu-descriptor" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" -dependencies = [ - "bitflags 2.11.1", - "gpu-descriptor-types", - "hashbrown 0.15.5", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags 2.11.1", -] - [[package]] name = "half" version = "2.7.1" @@ -1193,175 +345,12 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - [[package]] name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" -[[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" -dependencies = [ - "bitflags 2.11.1", - "com", - "libc", - "libloading", - "thiserror 1.0.69", - "widestring", - "winapi", -] - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "image" version = "0.25.10" @@ -1409,7 +398,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown", ] [[package]] @@ -1420,7 +409,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1432,103 +421,16 @@ dependencies = [ "either", ] -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys 0.4.1", - "log", - "simd_cesu8", - "thiserror 2.0.18", - "walkdir", - "windows-link", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.117", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.117", -] - [[package]] name = "jobserver" version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.4", + "getrandom", "libc", ] -[[package]] -name = "js-sys" -version = "0.3.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" -dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", - "pkg-config", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - [[package]] name = "lebe" version = "0.5.3" @@ -1551,88 +453,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "libredox" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" -dependencies = [ - "bitflags 2.11.1", - "libc", - "plain", - "redox_syscall 0.7.4", -] - -[[package]] -name = "libwayshot" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90b306f57277d75087b3efcc727163ad291552fab45de5ac3def7677ea8937c" -dependencies = [ - "drm", - "gbm", - "gl", - "image", - "memmap2", - "r-egl-wayland", - "rustix 1.1.4", - "thiserror 2.0.18", - "tracing", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.29" @@ -1648,15 +468,6 @@ 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" @@ -1673,39 +484,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memmap2" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.11.1", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", - "paste", -] - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1726,66 +504,6 @@ dependencies = [ "pxfm", ] -[[package]] -name = "naga" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.11.1", - "cfg_aliases 0.1.1", - "codespan-reporting", - "hexf-parse", - "indexmap", - "log", - "rustc-hash 1.1.0", - "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.11.1", - "jni-sys 0.3.1", - "log", - "ndk-sys 0.6.0+11769913", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[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.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -1801,12 +519,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - [[package]] name = "nom" version = "8.0.0" @@ -1840,7 +552,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1872,371 +584,12 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[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" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "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.11.1", - "block2", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.11.1", - "objc2 0.6.4", - "objc2-core-graphics", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.11.1", - "dispatch2", - "objc2 0.6.4", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.11.1", - "dispatch2", - "objc2 0.6.4", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.11.1", - "block2", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.11.1", - "objc2 0.6.4", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.11.1", - "objc2 0.6.4", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "orbclient" -version = "0.3.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a570f6bca41d29acb2139229a7c873ec99bc9a313bd10804081d89bfac8ff329" -dependencies = [ - "libc", - "libredox", -] - -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link", -] - [[package]] name = "paste" version = "1.0.15" @@ -2249,61 +602,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" -dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", - "indexmap", -] - -[[package]] -name = "pin-project" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "png" version = "0.17.16" @@ -2330,35 +628,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -2368,21 +637,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "presser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -2408,7 +662,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2432,15 +686,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.45" @@ -2456,28 +701,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "r-egl" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c68c047fb54b1eb9a0e751d9b238ff41195a4fcdae90ddc6b43b5903e2b09b" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "r-egl-wayland" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b502a04cf38d8ab73fded506bb3a84999fc6cfea9801d1b459402a79f963d4" -dependencies = [ - "r-egl", - "wayland-backend", - "wayland-client", - "wayland-protocols", -] - [[package]] name = "rand" version = "0.9.4" @@ -2504,7 +727,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom 0.3.4", + "getrandom", ] [[package]] @@ -2537,7 +760,7 @@ dependencies = [ "rand", "rand_chacha", "simd_helpers", - "thiserror 2.0.18", + "thiserror", "v_frame", "wasm-bindgen", ] @@ -2557,12 +780,6 @@ dependencies = [ "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.12.0" @@ -2583,50 +800,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.11.1", -] - -[[package]] -name = "redox_syscall" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" -dependencies = [ - "bitflags 2.11.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "renderdoc-sys" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" - [[package]] name = "rgb" version = "0.8.53" @@ -2638,98 +811,18 @@ name = "rs-pictures" version = "0.1.0" dependencies = [ "anyhow", - "arboard", - "chrono", - "directories", - "eframe", - "egui", "image", - "libwayshot", "serde", "tiny-skia", "toml", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.11.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.11.1", - "errno", - "libc", - "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", -] - [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[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.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - [[package]] name = "serde" version = "1.0.228" @@ -2757,7 +850,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2781,16 +874,6 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" -[[package]] -name = "simd_cesu8" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" -dependencies = [ - "rustc_version", - "simdutf8", -] - [[package]] name = "simd_helpers" version = "0.1.0" @@ -2800,143 +883,24 @@ dependencies = [ "quote", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "version_check", -] - [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.11.1", - "calloop 0.13.0", - "calloop-wayland-source 0.3.0", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror 1.0.69", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" -dependencies = [ - "bitflags 2.11.1", - "calloop 0.14.4", - "calloop-wayland-source 0.4.1", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 1.1.4", - "thiserror 2.0.18", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-experimental", - "wayland-protocols-misc", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-clipboard" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" -dependencies = [ - "libc", - "smithay-client-toolkit 0.20.0", - "wayland-backend", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.11.1", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strict-num" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.117" @@ -2948,53 +912,13 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "thiserror-impl", ] [[package]] @@ -3005,7 +929,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3048,16 +972,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "toml" version = "0.8.23" @@ -3066,8 +980,8 @@ checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "toml_datetime", + "toml_edit", ] [[package]] @@ -3079,15 +993,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - [[package]] name = "toml_edit" version = "0.22.27" @@ -3097,30 +1002,9 @@ dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime 0.6.11", + "toml_datetime", "toml_write", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.11+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" -dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.2", -] - -[[package]] -name = "toml_parser" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" -dependencies = [ - "winnow 1.0.2", + "winnow", ] [[package]] @@ -3129,106 +1013,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tree_magic_mini" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6" -dependencies = [ - "memchr", - "nom", - "petgraph", -] - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "type-map" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" -dependencies = [ - "rustc-hash 2.1.2", -] - [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-segmentation" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "v_frame" version = "0.3.9" @@ -3240,28 +1030,6 @@ dependencies = [ "wasm-bindgen", ] -[[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.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -3284,16 +1052,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.120" @@ -3313,7 +1071,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wasm-bindgen-shared", ] @@ -3326,694 +1084,12 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wayland-backend" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.1.4", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" -dependencies = [ - "bitflags 2.11.1", - "rustix 1.1.4", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.11.1", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" -dependencies = [ - "rustix 1.1.4", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" -dependencies = [ - "bitflags 2.11.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-experimental" -version = "20250721.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" -dependencies = [ - "bitflags 2.11.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-misc" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" -dependencies = [ - "bitflags 2.11.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" -dependencies = [ - "bitflags 2.11.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" -dependencies = [ - "bitflags 2.11.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-server" -version = "0.31.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1846eb04c49182e04f4a099e2a830a2b745610bbc1d61246e206f29c7000a0" -dependencies = [ - "bitflags 2.11.1", - "downcast-rs", - "rustix 1.1.4", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-sys" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" -dependencies = [ - "dlib", - "libc", - "log", - "memoffset", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webbrowser" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" -dependencies = [ - "core-foundation 0.10.1", - "jni", - "log", - "ndk-context", - "objc2 0.6.4", - "objc2-foundation 0.3.2", - "url", - "web-sys", -] - [[package]] name = "weezl" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" -[[package]] -name = "wgpu" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" -dependencies = [ - "arrayvec", - "cfg_aliases 0.1.1", - "document-features", - "js-sys", - "log", - "naga", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.11.1", - "cfg_aliases 0.1.1", - "document-features", - "indexmap", - "log", - "naga", - "once_cell", - "parking_lot", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-hal" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bitflags 2.11.1", - "block", - "cfg_aliases 0.1.1", - "core-graphics-types", - "glow 0.13.1", - "glutin_wgl_sys", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "hassle-rs", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "metal", - "naga", - "ndk-sys 0.5.0+25.2.9519653", - "objc", - "once_cell", - "parking_lot", - "profiling", - "raw-window-handle", - "renderdoc-sys", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wasm-bindgen", - "web-sys", - "wgpu-types", - "winapi", -] - -[[package]] -name = "wgpu-types" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" -dependencies = [ - "bitflags 2.11.1", - "js-sys", - "web-sys", -] - -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[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.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -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-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winit" -version = "0.30.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" -dependencies = [ - "ahash", - "android-activity", - "atomic-waker", - "bitflags 2.11.1", - "block2", - "calloop 0.13.0", - "cfg_aliases 0.2.1", - "concurrent-queue", - "core-foundation 0.9.4", - "core-graphics", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "pin-project", - "raw-window-handle", - "redox_syscall 0.4.1", - "rustix 0.38.44", - "smithay-client-toolkit 0.19.2", - "smol_str", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "xkbcommon-dl", -] - [[package]] name = "winnow" version = "0.7.15" @@ -4023,122 +1099,18 @@ dependencies = [ "memchr", ] -[[package]] -name = "winnow" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" -dependencies = [ - "memchr", -] - [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "wl-clipboard-rs" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3" -dependencies = [ - "libc", - "log", - "os_pipe", - "rustix 1.1.4", - "thiserror 2.0.18", - "tree_magic_mini", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", -] - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "gethostname", - "rustix 1.1.4", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.11.1", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml-rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" - [[package]] name = "y4m" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" -[[package]] -name = "yoke" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.8.48" @@ -4156,61 +1128,7 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerofrom" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 19f3e13..d4d0cf5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,35 +8,19 @@ name = "rs-pictures" path = "src/main.rs" [dependencies] -# Wayland-native screen capture -libwayshot = "0.7" - -# GUI framework (Wayland only) -eframe = { version = "0.29", default-features = false, features = ["wayland", "wgpu"] } -egui = "0.29" - -# Image handling +# Image loading and encoding image = { version = "0.25", features = ["png", "jpeg"] } # 2D rendering for effects (rounded corners, drop shadow) tiny-skia = "0.11" -# Clipboard (Wayland) -arboard = { version = "3.6", features = ["wayland-data-control"] } - # Config serialization serde = { version = "1", features = ["derive"] } toml = "0.8" -# Platform config/data directories -directories = "5" - # Error handling anyhow = "1" -# Timestamp-based filenames -chrono = { version = "0.4", features = ["clock"] } - # ── Build profiles ──────────────────────────────────────────────────────────── [profile.release] diff --git a/src/capture.rs b/src/capture.rs deleted file mode 100644 index 1c6d351..0000000 --- a/src/capture.rs +++ /dev/null @@ -1,53 +0,0 @@ -use anyhow::{Context, Result}; -use image::RgbaImage; -use libwayshot::WayshotConnection; - -/// A rectangular region on screen in physical pixels. -#[derive(Debug, Clone, Copy)] -pub struct Region { - pub x: i32, - pub y: i32, - pub width: u32, - pub height: u32, -} - -/// Captures the specified region in physical pixels. -pub fn capture_region(region: Region) -> Result { - let full = capture_all_outputs()?; - - let px = (region.x.max(0) as u32).min(full.width().saturating_sub(1)); - let py = (region.y.max(0) as u32).min(full.height().saturating_sub(1)); - let pw = region.width.min(full.width() - px); - let ph = region.height.min(full.height() - py); - - eprintln!( - "[capture] crop ({px},{py}) {pw}x{ph} from {}x{}", - full.width(), full.height(), - ); - - Ok(image::imageops::crop_imm(&full, px, py, pw, ph).to_image()) -} - -/// Captures all connected outputs stitched together into one image. -pub fn capture_all_outputs() -> Result { - let conn = WayshotConnection::new() - .context("Failed to connect to Wayland display")?; - - let all = conn.get_all_outputs(); - eprintln!("[capture] outputs: {:?}", all.iter().map(|o| &o.name).collect::>()); - - let active_name = crate::hyprland::active_monitor_name(); - let target_output = if let Some(ref name) = active_name { - all.iter().find(|o| &o.name == name).unwrap_or(&all[0]) - } else { - &all[0] - }; - - let rgba = conn - .screenshot_single_output(target_output, false) - .context("libwayshot failed to capture output")? - .into_rgba8(); - - eprintln!("[capture] capture_all_outputs → {}x{}", rgba.width(), rgba.height()); - Ok(rgba) -} diff --git a/src/config.rs b/src/config.rs index b57dfeb..1244593 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result}; -use directories::ProjectDirs; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -7,50 +6,19 @@ use std::path::PathBuf; /// Serialized to/from ~/.config/rs-pictures/config.toml #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Config { - /// Directory where screenshots are saved. - pub save_directory: PathBuf, - - /// File format for saved screenshots: "png" or "jpeg". - pub save_format: String, - - /// Filename template. Supports strftime-style tokens via chrono. - /// Example: "screenshot_%Y-%m-%d_%H-%M-%S" - pub filename_template: String, - - /// When true, automatically save to disk after capture without opening - /// the review window. - #[serde(default)] - pub auto_save: bool, - - /// When true, automatically copy to the clipboard after capture without - /// opening the review window. - #[serde(default)] - pub auto_copy: bool, - - /// Milliseconds to wait after launch before capturing the desktop snapshot. - /// Increase this if the overlay background still shows the terminal/launcher - /// that started rs-pictures. Default: 200. - #[serde(default = "default_capture_delay_ms")] - pub capture_delay_ms: u64, - - /// If true, the selection overlay will be transparent (live preview) instead of - /// a frozen screenshot. The final capture happens after selection. - #[serde(default)] - pub live_mode: bool, - - /// Visual effects applied after capture. + /// Visual effects applied to images. pub effects: EffectsConfig, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct EffectsConfig { - /// Apply rounded corners to the screenshot. + /// Apply rounded corners to the image. pub rounded_corners: bool, /// Radius in pixels for rounded corners. pub corner_radius: f32, - /// Apply a drop shadow beneath the screenshot. + /// Apply a drop shadow beneath the image. pub drop_shadow: bool, /// Blur radius for the drop shadow (higher = softer shadow). @@ -82,28 +50,25 @@ impl Default for EffectsConfig { impl Default for Config { fn default() -> Self { - let save_directory = dirs_default_pictures().unwrap_or_else(|| PathBuf::from(".")); Self { - save_directory, - save_format: "png".into(), - filename_template: "screenshot_%Y-%m-%d_%H-%M-%S".into(), - auto_save: false, - auto_copy: false, - capture_delay_ms: default_capture_delay_ms(), - live_mode: false, effects: EffectsConfig::default(), } } } impl Config { - /// Returns the path to the config file, creating parent directories if needed. + /// Returns the path to the config file: ~/.config/rs-pictures/config.toml pub fn config_path() -> Option { - ProjectDirs::from("", "", "rs-pictures") - .map(|pd| pd.config_dir().join("config.toml")) + let home = std::env::var("HOME").ok()?; + Some( + PathBuf::from(home) + .join(".config") + .join("rs-pictures") + .join("config.toml"), + ) } - /// Load config from disk, or return the default config if the file doesn't exist. + /// Load config from disk, or write and return the default config if the file doesn't exist. pub fn load() -> Result { let path = match Self::config_path() { Some(p) => p, @@ -125,39 +90,19 @@ impl Config { /// Persist the current config to disk. pub fn save(&self) -> Result<()> { - let path = Self::config_path() - .context("Could not determine config directory")?; + let path = + Self::config_path().context("Could not determine config directory (HOME not set)")?; if let Some(parent) = path.parent() { std::fs::create_dir_all(parent) .with_context(|| format!("Failed to create config dir {}", parent.display()))?; } - let serialized = toml::to_string_pretty(self) - .context("Failed to serialize config")?; + let serialized = toml::to_string_pretty(self).context("Failed to serialize config")?; std::fs::write(&path, serialized) .with_context(|| format!("Failed to write config to {}", path.display()))?; Ok(()) } - - /// Build the full output path for a new screenshot using chrono formatting. - pub fn output_path(&self) -> PathBuf { - let now = chrono::Local::now(); - let filename = now.format(&self.filename_template).to_string(); - let ext = &self.save_format; - self.save_directory.join(format!("{filename}.{ext}")) - } -} - -fn default_capture_delay_ms() -> u64 { 200 } - -fn dirs_default_pictures() -> Option { - // Use XDG_PICTURES_DIR if available, otherwise ~/Pictures - if let Ok(val) = std::env::var("XDG_PICTURES_DIR") { - return Some(PathBuf::from(val)); - } - directories::UserDirs::new() - .and_then(|ud| ud.picture_dir().map(|p| p.to_path_buf())) } diff --git a/src/effects.rs b/src/effects.rs index b8b38bc..bae227f 100644 --- a/src/effects.rs +++ b/src/effects.rs @@ -49,7 +49,13 @@ pub fn apply_rounded_corners(img: RgbaImage, radius: f32) -> RgbaImage { let mut paint = Paint::default(); paint.set_color(Color::WHITE); paint.anti_alias = true; - mask.fill_path(&path, &paint, FillRule::Winding, Transform::identity(), None); + mask.fill_path( + &path, + &paint, + FillRule::Winding, + Transform::identity(), + None, + ); let mut pixmap = rgba_image_to_pixmap(&img); let mut dst_paint = PixmapPaint::default(); @@ -70,9 +76,9 @@ pub fn apply_drop_shadow( let (iw, ih) = img.dimensions(); let br = blur_radius.ceil() as u32; - let extra_left = br.saturating_sub((-offset_x).max(0.0) as u32); - let extra_top = br.saturating_sub((-offset_y).max(0.0) as u32); - let extra_right = br + offset_x.max(0.0) as u32; + let extra_left = br.saturating_sub((-offset_x).max(0.0) as u32); + let extra_top = br.saturating_sub((-offset_y).max(0.0) as u32); + let extra_right = br + offset_x.max(0.0) as u32; let extra_bottom = br + offset_y.max(0.0) as u32; let canvas_w = iw + extra_left + extra_right; @@ -82,11 +88,18 @@ pub fn apply_drop_shadow( let mut shadow_pixmap = Pixmap::new(canvas_w, canvas_h).expect("shadow pixmap"); let img_pixmap = rgba_image_to_pixmap(&img); let shadow_x = (extra_left as f32 + offset_x) as i32; - let shadow_y = (extra_top as f32 + offset_y) as i32; + let shadow_y = (extra_top as f32 + offset_y) as i32; let mut sp = PixmapPaint::default(); sp.blend_mode = BlendMode::Source; - shadow_pixmap.draw_pixmap(shadow_x, shadow_y, img_pixmap.as_ref(), &sp, Transform::identity(), None); + shadow_pixmap.draw_pixmap( + shadow_x, + shadow_y, + img_pixmap.as_ref(), + &sp, + Transform::identity(), + None, + ); // 2. Tint the silhouette with the shadow colour. tint_pixmap_as_shadow(&mut shadow_pixmap, shadow_color); @@ -100,11 +113,25 @@ pub fn apply_drop_shadow( let mut canvas = Pixmap::new(canvas_w, canvas_h).expect("canvas pixmap"); let mut p = PixmapPaint::default(); p.blend_mode = BlendMode::Source; - canvas.draw_pixmap(0, 0, blurred_pixmap.as_ref(), &p, Transform::identity(), None); + canvas.draw_pixmap( + 0, + 0, + blurred_pixmap.as_ref(), + &p, + Transform::identity(), + None, + ); let mut p2 = PixmapPaint::default(); p2.blend_mode = BlendMode::SourceOver; - canvas.draw_pixmap(extra_left as i32, extra_top as i32, img_pixmap.as_ref(), &p2, Transform::identity(), None); + canvas.draw_pixmap( + extra_left as i32, + extra_top as i32, + img_pixmap.as_ref(), + &p2, + Transform::identity(), + None, + ); pixmap_to_rgba_image(canvas) } @@ -157,9 +184,9 @@ fn pixmap_to_rgba_image(pixmap: Pixmap) -> RgbaImage { } else { let af = a as f32 / 255.0; ( - (px.red() as f32 / af).round().min(255.0) as u8, + (px.red() as f32 / af).round().min(255.0) as u8, (px.green() as f32 / af).round().min(255.0) as u8, - (px.blue() as f32 / af).round().min(255.0) as u8, + (px.blue() as f32 / af).round().min(255.0) as u8, ) }; out.put_pixel(x, y, image::Rgba([r, g, b, a])); @@ -228,18 +255,22 @@ fn sliding_horizontal(img: &RgbaImage, radius: u32) -> RgbaImage { } for x in 0..w { - out.put_pixel(x, y, image::Rgba([ - (sr / diam) as u8, - (sg / diam) as u8, - (sb / diam) as u8, - (sa / diam) as u8, - ])); + out.put_pixel( + x, + y, + image::Rgba([ + (sr / diam) as u8, + (sg / diam) as u8, + (sb / diam) as u8, + (sa / diam) as u8, + ]), + ); // Slide: remove left edge, add right edge. let remove_x = (x as i32 - r).clamp(0, w as i32 - 1) as u32; - let add_x = (x as i32 + r + 1).clamp(0, w as i32 - 1) as u32; + let add_x = (x as i32 + r + 1).clamp(0, w as i32 - 1) as u32; let rp = img.get_pixel(remove_x, y).0; - let ap = img.get_pixel(add_x, y).0; + let ap = img.get_pixel(add_x, y).0; sr = sr.saturating_sub(rp[0] as u32) + ap[0] as u32; sg = sg.saturating_sub(rp[1] as u32) + ap[1] as u32; sb = sb.saturating_sub(rp[2] as u32) + ap[2] as u32; @@ -272,17 +303,21 @@ fn sliding_vertical(img: &RgbaImage, radius: u32) -> RgbaImage { } for y in 0..h { - out.put_pixel(x, y, image::Rgba([ - (sr / diam) as u8, - (sg / diam) as u8, - (sb / diam) as u8, - (sa / diam) as u8, - ])); + out.put_pixel( + x, + y, + image::Rgba([ + (sr / diam) as u8, + (sg / diam) as u8, + (sb / diam) as u8, + (sa / diam) as u8, + ]), + ); let remove_y = (y as i32 - r).clamp(0, h as i32 - 1) as u32; - let add_y = (y as i32 + r + 1).clamp(0, h as i32 - 1) as u32; + let add_y = (y as i32 + r + 1).clamp(0, h as i32 - 1) as u32; let rp = img.get_pixel(x, remove_y).0; - let ap = img.get_pixel(x, add_y ).0; + let ap = img.get_pixel(x, add_y).0; sr = sr.saturating_sub(rp[0] as u32) + ap[0] as u32; sg = sg.saturating_sub(rp[1] as u32) + ap[1] as u32; sb = sb.saturating_sub(rp[2] as u32) + ap[2] as u32; diff --git a/src/hyprland.rs b/src/hyprland.rs deleted file mode 100644 index 349d425..0000000 --- a/src/hyprland.rs +++ /dev/null @@ -1,270 +0,0 @@ -//! Hyprland window geometry queries. -//! -//! Uses `hyprctl clients -j` and `hyprctl activeworkspace -j` to enumerate -//! windows on the active workspace. Returns logical pixel coordinates that -//! match the coordinate space used by libwayshot LogicalRegion. -//! -//! If `hyprctl` is not available (non-Hyprland compositor) the functions -//! return an empty list so the overlay degrades gracefully to manual -//! selection only. - -/// A window's position and size in Wayland logical pixels. -#[derive(Debug, Clone)] -pub struct WindowRect { - pub x: i32, - pub y: i32, - pub width: i32, - pub height: i32, - pub title: String, -} - -/// Returns the logical size (width, height) of the primary/active monitor. -/// Falls back to None if hyprctl is unavailable. -pub fn active_monitor_logical_size() -> Option<(u32, u32)> { - let info = active_monitor_info()?; - Some((info.0, info.1)) -} - -/// Returns the scale factor of the active monitor (e.g. 1.33 on HiDPI). -/// Falls back to 1.0 if hyprctl is unavailable. -pub fn active_monitor_scale() -> f32 { - active_monitor_info().map(|i| i.2).unwrap_or(1.0) -} - -/// Returns the name of the active/focused monitor (e.g. "DP-1"). -pub fn active_monitor_name() -> Option { - let output = std::process::Command::new("hyprctl") - .args(["monitors", "-j"]) - .output() - .ok()?; - if !output.status.success() { return None; } - let text = std::str::from_utf8(&output.stdout).ok()?; - for obj in split_objects(text) { - if json_bool(obj, "focused") == Some(true) { - return json_string(obj, "name"); - } - } - None -} - -/// Returns (logical_width, logical_height, scale) for the focused monitor. -fn active_monitor_info() -> Option<(u32, u32, f32)> { - let output = std::process::Command::new("hyprctl") - .args(["monitors", "-j"]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - let text = std::str::from_utf8(&output.stdout).ok()?; - - // Find the focused monitor (focused: true) or fall back to the first. - for obj in split_objects(text) { - let focused = json_bool(obj, "focused"); - if focused != Some(true) { - continue; - } - let w = json_i64(obj, "width")? as f32; - let h = json_i64(obj, "height")? as f32; - let scale = json_f32(obj, "scale").unwrap_or(1.0); - return Some(((w / scale).round() as u32, (h / scale).round() as u32, scale)); - } - - // No focused monitor found — take the first one. - let obj = split_objects(text).into_iter().next()?; - let w = json_i64(obj, "width")? as f32; - let h = json_i64(obj, "height")? as f32; - let scale = json_f32(obj, "scale").unwrap_or(1.0); - Some(((w / scale).round() as u32, (h / scale).round() as u32, scale)) -} - -/// Returns an empty Vec if hyprctl is unavailable or returns bad data. -pub fn active_workspace_windows() -> Vec { - let workspace_id = match active_workspace_id() { - Some(id) => id, - None => return vec![], - }; - - let output = match std::process::Command::new("hyprctl") - .args(["clients", "-j"]) - .output() - { - Ok(o) if o.status.success() => o.stdout, - _ => return vec![], - }; - - parse_clients(&output, workspace_id) -} - -// ─── Private helpers ────────────────────────────────────────────────────────── - -fn active_workspace_id() -> Option { - let output = std::process::Command::new("hyprctl") - .args(["activeworkspace", "-j"]) - .output() - .ok()?; - - if !output.status.success() { - return None; - } - - // Extract "id": with a tiny hand-rolled parse — no serde dep. - let text = std::str::from_utf8(&output.stdout).ok()?; - json_i64(text, "id") -} - -/// Parse the `hyprctl clients -j` JSON output without pulling in serde_json. -/// -/// We only need four fields per client: `at`, `size`, `workspace.id`, `title`, -/// `mapped`, `hidden`. A minimal hand-rolled extractor is sufficient. -fn parse_clients(data: &[u8], workspace_id: i64) -> Vec { - let text = match std::str::from_utf8(data) { - Ok(s) => s, - Err(_) => return vec![], - }; - - let mut result = Vec::new(); - - // Split on top-level `{` … `}` objects. - // The JSON is a flat array of objects with no nested arrays of objects, - // so a simple brace-depth scan is safe here. - for obj in split_objects(text) { - // Skip unmapped or hidden windows. - if json_bool(obj, "mapped") != Some(true) { continue; } - if json_bool(obj, "hidden") == Some(true) { continue; } - - // Only windows on the active workspace. - if json_i64_nested(obj, "workspace", "id") != Some(workspace_id) { continue; } - - let at = json_pair_i64(obj, "at"); - let size = json_pair_i64(obj, "size"); - - let (Some((x, y)), Some((w, h))) = (at, size) else { continue }; - if w <= 0 || h <= 0 { continue; } - - let title = json_string(obj, "title").unwrap_or_default(); - - result.push(WindowRect { x, y, width: w, height: h, title }); - } - - result -} - -// ─── Tiny JSON field extractors ─────────────────────────────────────────────── - -/// Split a JSON array text into individual object strings. -fn split_objects(text: &str) -> Vec<&str> { - let mut objects = Vec::new(); - let bytes = text.as_bytes(); - let mut depth = 0i32; - let mut start = None; - let mut in_string = false; - let mut escape = false; - - for (i, &b) in bytes.iter().enumerate() { - if escape { escape = false; continue; } - if b == b'\\' && in_string { escape = true; continue; } - if b == b'"' { in_string = !in_string; continue; } - if in_string { continue; } - - match b { - b'{' => { - if depth == 0 { start = Some(i); } - depth += 1; - } - b'}' => { - depth -= 1; - if depth == 0 { - if let Some(s) = start { - objects.push(&text[s..=i]); - } - start = None; - } - } - _ => {} - } - } - objects -} - -/// Extract `"key": ` from a JSON object string. -fn json_i64(text: &str, key: &str) -> Option { - let needle = format!("\"{}\"", key); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - let end = after.find(|c: char| !c.is_ascii_digit() && c != '-').unwrap_or(after.len()); - after[..end].parse().ok() -} - -/// Extract `"key": ` from a JSON object string. -fn json_bool(text: &str, key: &str) -> Option { - let needle = format!("\"{}\"", key); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - if after.starts_with("true") { return Some(true); } - if after.starts_with("false") { return Some(false); } - None -} - -/// Extract `"key": "string value"` from a JSON object string. -fn json_string<'a>(text: &'a str, key: &str) -> Option { - let needle = format!("\"{}\"", key); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - let after = after.strip_prefix('"')?; - // Collect until unescaped closing quote. - let mut out = String::new(); - let mut chars = after.chars(); - loop { - match chars.next()? { - '\\' => { chars.next(); } // skip escaped char - '"' => break, - c => out.push(c), - } - } - Some(out) -} - -/// Extract `"key": [a, b]` → (a, b) as i64 pair. -fn json_pair_i64(text: &str, key: &str) -> Option<(i32, i32)> { - let needle = format!("\"{}\"", key); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - let after = after.strip_prefix('[')?; - let end = after.find(']')?; - let inner = &after[..end]; - let mut parts = inner.split(','); - let a: i32 = parts.next()?.trim().parse().ok()?; - let b: i32 = parts.next()?.trim().parse().ok()?; - Some((a, b)) -} - -/// Extract `"outer": { "inner_key": }` — one level of nesting. -fn json_i64_nested(text: &str, outer: &str, inner_key: &str) -> Option { - let needle = format!("\"{}\"", outer); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - let brace_start = after.find('{')?; - let brace_end = after.find('}')?; - let nested = &after[brace_start..=brace_end]; - json_i64(nested, inner_key) -} - -/// Extract `"key": ` from a JSON object string. -fn json_f32(text: &str, key: &str) -> Option { - let needle = format!("\"{}\"", key); - let pos = text.find(&needle)?; - let after = text[pos + needle.len()..].trim_start(); - let after = after.strip_prefix(':')?.trim_start(); - let end = after - .find(|c: char| !c.is_ascii_digit() && c != '.' && c != '-') - .unwrap_or(after.len()); - after[..end].parse().ok() -} diff --git a/src/main.rs b/src/main.rs index 4bbeeb3..71e0321 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,192 +1,74 @@ -//! rs-pictures — Wayland screenshot tool -//! -//! Flow: -//! 1. Load config from ~/.config/rs-pictures/config.toml -//! 2. Sleep briefly so the user can switch away from the terminal that -//! launched us, and the compositor has time to repaint. -//! 3. Capture all outputs → frozen desktop snapshot for overlay background. -//! 4. Open fullscreen selection overlay (drag / two-click rubber-band). -//! 5. Sleep 120 ms so compositor repaints after overlay closes. -//! 6. Capture the selected region with libwayshot. -//! 7a. auto_save/auto_copy set → apply effects, act silently, exit. -//! 7b. Otherwise → open review window (effects applied interactively there). - -mod capture; mod config; mod effects; -mod hyprland; -mod overlay; -mod review; use anyhow::{Context, Result}; -use arboard::{Clipboard, ImageData}; -use eframe::egui; -use overlay::{SelectionOverlay, SelectionResult}; -use review::ReviewWindow; +use std::io::Write as _; +use std::process::{Command, Stdio}; fn main() -> Result<()> { - // ── 1. Load config & arguments ──────────────────────────────────────────── - let config = config::Config::load().context("Failed to load config")?; - let is_live_mode = config.live_mode || std::env::args().any(|a| a == "--live" || a == "-l"); + // ── 1. Collect image paths from CLI arguments ───────────────────────────── + let paths: Vec = std::env::args().skip(1).collect(); - // ── 2. Query Hyprland metadata (no window open yet) ─────────────────────── - // Scale is only needed for window-rect conversion in the overlay. - let scale = hyprland::active_monitor_scale(); - let (lw, lh) = hyprland::active_monitor_logical_size().unwrap_or((1920, 1080)); - - // ── 3. Pre-capture delay ────────────────────────────────────────────────── - // Give the compositor time to unmap the terminal/launcher that started us - // and repaint the desktop before we freeze it. - // Configurable via capture_delay_ms in config.toml (default 800ms). - std::thread::sleep(std::time::Duration::from_millis(config.capture_delay_ms)); - - // ── 4. Capture full desktop BEFORE opening any window ──────────────────── - // In freeze mode (default), we snapshot before the overlay. - // In live mode, we skip this and capture later. - let background_snapshot = if is_live_mode { - None - } else { - Some(capture::capture_all_outputs().context("Failed to capture desktop snapshot")?) - }; - - // ── 5. Run the selection overlay ───────────────────────────────────────── - let selection_result = { - use std::sync::{Arc, Mutex}; - let shared: Arc>> = Arc::new(Mutex::new(None)); - let shared_clone = Arc::clone(&shared); - - let native_options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default() - .with_app_id("rs-pictures-overlay") - .with_inner_size([lw as f32, lh as f32]) - .with_position([0.0, 0.0]) - .with_fullscreen(true) - .with_maximized(true) - .with_decorations(false) - .with_transparent(true) - .with_always_on_top() - .with_resizable(false), - ..Default::default() - }; - - let bg_clone = background_snapshot.clone(); - eframe::run_native( - "rs-pictures — Select Region", - native_options, - Box::new(move |cc| { - let app = SelectionOverlay::new(cc, bg_clone, scale); - Ok(Box::new(OverlayWrapper { - inner: app, - result_sink: shared_clone, - }) as Box) - }), - ) - .map_err(|e| anyhow::anyhow!("Overlay window error: {e}"))?; - - Arc::try_unwrap(shared) - .ok() - .and_then(|m| m.into_inner().ok()) - .flatten() - }; - - // ── 6. Act on the selection ─────────────────────────────────────────────── - let region = match selection_result { - Some(SelectionResult::Selected(r)) => r, - Some(SelectionResult::Cancelled) | None => { - eprintln!("Selection cancelled."); - return Ok(()); - } - }; - - // ── 7. Get the raw region image ─────────────────────────────────────────── - let raw_image = if let Some(bg) = background_snapshot { - // Freeze mode: Crop directly from the pre-captured snapshot. - let px = (region.x.max(0) as u32).min(bg.width().saturating_sub(1)); - let py = (region.y.max(0) as u32).min(bg.height().saturating_sub(1)); - let pw = region.width.min(bg.width() - px); - let ph = region.height.min(bg.height() - py); - image::imageops::crop_imm(&bg, px, py, pw, ph).to_image() - } else { - // Live mode: Wait for the compositor to clear the overlay, then capture just the region. - std::thread::sleep(std::time::Duration::from_millis(config.capture_delay_ms.max(200))); - capture::capture_region(region).context("Failed to capture region")? - }; - - // ── 8a. Auto-mode — no review window ───────────────────────────────────── - if config.auto_save || config.auto_copy { - let final_image = effects::apply_effects(raw_image, &config.effects); - if config.auto_save { - let path = config.output_path(); - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent) - .with_context(|| format!("Cannot create dir {}", parent.display()))?; - } - final_image.save(&path) - .with_context(|| format!("Failed to save to {}", path.display()))?; - eprintln!("Saved to {}", path.display()); - } - if config.auto_copy { - clipboard_copy(&final_image)?; - eprintln!("Copied to clipboard."); - } - return Ok(()); + if paths.is_empty() { + eprintln!("Usage: rs-pictures [image2 ...]"); + eprintln!("No image paths provided."); + std::process::exit(1); } - // ── 8b. Review window ───────────────────────────────────────────────────── - // The review window applies effects internally on a background thread, so - // we hand it the raw (un-effected) image. - let native_options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default() - .with_title("rs-pictures — Review") - .with_inner_size([900.0, 700.0]) - .with_min_inner_size([400.0, 300.0]), - ..Default::default() - }; + // ── 2. Load config (generates default if missing) ───────────────────────── + let config = config::Config::load().context("Failed to load config")?; - eframe::run_native( - "rs-pictures — Review", - native_options, - Box::new(move |cc| { - Ok(Box::new(ReviewWindow::new(cc, raw_image, config)) as Box) - }), - ) - .map_err(|e| anyhow::anyhow!("Review window error: {e}"))?; + // ── 3. Process each image ───────────────────────────────────────────────── + for path in &paths { + if let Err(e) = process_image(path, &config) { + eprintln!("Error processing '{}': {e:#}", path); + } + } Ok(()) } -// ─── Clipboard helper (shared with review.rs logic) ─────────────────────────── +fn process_image(path: &str, config: &config::Config) -> Result<()> { + // ── a. Load image ───────────────────────────────────────────────────────── + let img = image::open(path) + .with_context(|| format!("Failed to open image '{path}'"))? + .into_rgba8(); -pub fn clipboard_copy(img: &image::RgbaImage) -> Result<()> { - let (w, h) = img.dimensions(); - let bytes = img.as_raw().clone(); - let mut cb = Clipboard::new().context("Could not open clipboard")?; - cb.set_image(ImageData { - width: w as usize, - height: h as usize, - bytes: bytes.into(), - }) - .context("Failed to write image to clipboard") -} + // ── b. Apply effects (rounded corners + drop shadow) ───────────────────── + let processed = effects::apply_effects(img, &config.effects); -// ─── Overlay wrapper ────────────────────────────────────────────────────────── + // ── c. Encode as PNG into memory ────────────────────────────────────────── + let mut png_bytes: Vec = Vec::new(); + image::DynamicImage::ImageRgba8(processed) + .write_to( + &mut std::io::Cursor::new(&mut png_bytes), + image::ImageFormat::Png, + ) + .context("Failed to encode processed image as PNG")?; + // Re-unwrap into RgbaImage — not needed further, png_bytes is ready -use std::sync::{Arc, Mutex}; + // ── d. Pipe PNG bytes to `swappy -f -` ──────────────────────────────────── + let mut child = Command::new("swappy") + .args(["-f", "-"]) + .stdin(Stdio::piped()) + .spawn() + .context("Failed to spawn swappy. Is it installed and in PATH?")?; -struct OverlayWrapper { - inner: SelectionOverlay, - result_sink: Arc>>, -} + child + .stdin + .take() + .context("Failed to get swappy stdin")? + .write_all(&png_bytes) + .context("Failed to write image data to swappy")?; -impl eframe::App for OverlayWrapper { - fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { - self.inner.update(ctx, frame); - if let Some(result) = self.inner.take_result() { - *self.result_sink.lock().unwrap() = Some(result); - } + let status = child.wait().context("Failed to wait for swappy")?; + + if !status.success() { + eprintln!( + "swappy exited with non-zero status for '{}': {}", + path, status + ); } - fn clear_color(&self, visuals: &egui::Visuals) -> [f32; 4] { - self.inner.clear_color(visuals) - } + Ok(()) } diff --git a/src/overlay.rs b/src/overlay.rs deleted file mode 100644 index e6b2a14..0000000 --- a/src/overlay.rs +++ /dev/null @@ -1,359 +0,0 @@ -//! Region selection overlay. -//! -//! Input modes (all available simultaneously): -//! - Window pick: hover over a window → it highlights; single click captures it. -//! - Drag: press and drag → rubber-band selection (overrides window pick). -//! - Two-click: click once (anchor), move, click again → selection. -//! -//! Coordinate system: -//! egui screen_rect == physical pixels of the monitor. -//! capture::Region also uses physical pixels. -//! Window rects from hyprctl are logical pixels — multiplied by scale to get physical. -//! No scale division anywhere: Region handed to capture.rs is in physical pixels, -//! and capture.rs crops from the physical full-screen capture directly. - -use eframe::egui::{self, Color32, CursorIcon, Pos2, Rect, Rounding, Stroke, Vec2}; -use image::RgbaImage; - -use crate::capture::Region; -use crate::hyprland::WindowRect; - -/// Result returned when the user completes or cancels the selection. -#[derive(Debug)] -pub enum SelectionResult { - Selected(Region), - Cancelled, -} - -/// Input state machine. -#[derive(Default)] -enum SelectionState { - #[default] - Idle, - Dragging { start: Pos2 }, - AwaitingSecondClick { start: Pos2 }, - Done { start: Pos2, end: Pos2 }, - Cancelled, -} - -const MAX_TEX: u32 = 8192; - -pub struct SelectionOverlay { - background: Option, - /// Hyprland monitor scale (logical→physical). Used only for window rect conversion. - scale: f32, - state: SelectionState, - result: Option, - windows: Vec, - hovered_window: Option, - diag_printed: bool, -} - -impl SelectionOverlay { - pub fn new(cc: &eframe::CreationContext<'_>, background_snapshot: Option, scale: f32) -> Self { - let texture = background_snapshot.map(|img| { - let tex_image = fit_to_max_texture(img); - let (tw, th) = tex_image.dimensions(); - let color_image = egui::ColorImage::from_rgba_unmultiplied( - [tw as usize, th as usize], - tex_image.as_raw(), - ); - cc.egui_ctx - .load_texture("background", color_image, egui::TextureOptions::LINEAR) - }); - - let windows = crate::hyprland::active_workspace_windows(); - - Self { - background: texture, - scale, - state: SelectionState::default(), - result: None, - windows, - hovered_window: None, - diag_printed: false, - } - } - - pub fn take_result(&mut self) -> Option { - self.result.take() - } - - /// Convert a hyprctl WindowRect (logical px) to an egui Rect (logical points). - fn window_to_egui_rect(win: &WindowRect, _scale: f32) -> Rect { - Rect::from_min_size( - Pos2::new(win.x as f32, win.y as f32), - Vec2::new(win.width as f32, win.height as f32), - ) - } -} - -impl eframe::App for SelectionOverlay { - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - ctx.set_cursor_icon(CursorIcon::Crosshair); - - if ctx.input(|i| i.key_pressed(egui::Key::Escape)) { - self.state = SelectionState::Cancelled; - } - - let screen_rect = ctx.screen_rect(); - - if !self.diag_printed { - self.diag_printed = true; - eprintln!( - "[overlay diag] screen_rect={screen_rect:?} ppp={} scale={}", - ctx.pixels_per_point(), - self.scale, - ); - } - - let dim = Color32::from_black_alpha(140); - - const DRAG_THRESHOLD: f32 = 4.0; - - let (hover_pos, press_origin, primary_down, primary_released) = - ctx.input(|i| { - ( - i.pointer.hover_pos(), - i.pointer.press_origin(), - i.pointer.primary_down(), - i.pointer.primary_released(), - ) - }); - - let travel: f32 = match (press_origin, hover_pos) { - (Some(o), Some(p)) => o.distance(p), - _ => 0.0, - }; - let is_click = primary_released && travel <= DRAG_THRESHOLD; - let is_drag = primary_down && travel > DRAG_THRESHOLD; - - // ── Window hover detection ──────────────────────────────────────────── - self.hovered_window = None; - if matches!(self.state, SelectionState::Idle) { - if let Some(pos) = hover_pos { - for (i, win) in self.windows.iter().enumerate().rev() { - if Self::window_to_egui_rect(win, self.scale).contains(pos) { - self.hovered_window = Some(i); - break; - } - } - } - } - - // ── State transitions ───────────────────────────────────────────────── - match &self.state { - SelectionState::Idle => { - if is_drag { - self.hovered_window = None; - self.state = SelectionState::Dragging { - start: press_origin.unwrap_or_default(), - }; - } else if is_click { - if let Some(idx) = self.hovered_window { - let win = &self.windows[idx]; - let rect = Self::window_to_egui_rect(win, self.scale).intersect(screen_rect); - self.state = SelectionState::Done { - start: rect.min, - end: rect.max, - }; - } else { - self.state = SelectionState::AwaitingSecondClick { - start: press_origin.unwrap_or_default(), - }; - } - } - } - SelectionState::Dragging { start } => { - let start = *start; - if primary_released { - if let Some(end) = hover_pos { - self.state = SelectionState::Done { start, end }; - } else { - self.state = SelectionState::Idle; - } - } - if !primary_down && !primary_released { - self.state = SelectionState::AwaitingSecondClick { start }; - } - } - SelectionState::AwaitingSecondClick { start } => { - let start = *start; - if is_click { - if let Some(end) = hover_pos { - self.state = SelectionState::Done { start, end }; - } - } - } - SelectionState::Done { .. } | SelectionState::Cancelled => {} - } - - // ── Current live rect ───────────────────────────────────────────────── - let current_rect: Option = match &self.state { - SelectionState::Dragging { start } => hover_pos.map(|p| Rect::from_two_pos(*start, p)), - SelectionState::AwaitingSecondClick { start } => hover_pos.map(|p| Rect::from_two_pos(*start, p)), - SelectionState::Done { start, end } => Some(Rect::from_two_pos(*start, *end)), - _ => None, - }; - - // ── Draw ────────────────────────────────────────────────────────────── - egui::CentralPanel::default() - .frame(egui::Frame::none()) - .show(ctx, |ui| { - let painter = ui.painter(); - - // 1. Background screenshot (if in freeze mode). - if let Some(bg) = &self.background { - painter.image( - bg.id(), - screen_rect, - Rect::from_min_max(Pos2::ZERO, Pos2::new(1.0, 1.0)), - Color32::WHITE, - ); - } - - // 2. Dim overlay. - let active_rect = current_rect.or_else(|| { - self.hovered_window - .map(|i| Self::window_to_egui_rect(&self.windows[i], self.scale).intersect(screen_rect)) - }); - - if let Some(sel) = active_rect { - let s = sel.intersect(screen_rect); - painter.rect_filled( - Rect::from_min_max(screen_rect.min, Pos2::new(screen_rect.max.x, s.min.y)), - Rounding::ZERO, dim, - ); - painter.rect_filled( - Rect::from_min_max(Pos2::new(screen_rect.min.x, s.max.y), screen_rect.max), - Rounding::ZERO, dim, - ); - painter.rect_filled( - Rect::from_min_max( - Pos2::new(screen_rect.min.x, s.min.y), - Pos2::new(s.min.x, s.max.y), - ), - Rounding::ZERO, dim, - ); - painter.rect_filled( - Rect::from_min_max( - Pos2::new(s.max.x, s.min.y), - Pos2::new(screen_rect.max.x, s.max.y), - ), - Rounding::ZERO, dim, - ); - - // Only draw a stroke if we are actively dragging a selection. - if current_rect.is_some() { - painter.rect_stroke(s, Rounding::ZERO, Stroke::new(1.5, Color32::from_rgb(100, 180, 255))); - } - - // Size label in physical pixels. - let label = format!("{} × {}", s.width().round() as u32, s.height().round() as u32); - let lp = Pos2::new(s.min.x + 4.0, s.min.y - 18.0) - .clamp(Pos2::ZERO, screen_rect.max); - painter.text(lp, egui::Align2::LEFT_TOP, label, - egui::FontId::monospace(13.0), Color32::WHITE); - - if let Some(idx) = self.hovered_window { - if current_rect.is_none() { - let title = &self.windows[idx].title; - if !title.is_empty() { - painter.text( - Pos2::new(s.min.x + 4.0, s.min.y + 4.0), - egui::Align2::LEFT_TOP, - title, - egui::FontId::proportional(12.0), - Color32::from_rgba_unmultiplied(255, 190, 50, 220), - ); - } - } - } - } else { - painter.rect_filled(screen_rect, Rounding::ZERO, dim); - } - - // 3. Crosshair. - if let Some(pos) = hover_pos { - let s = Stroke::new(1.0, Color32::from_white_alpha(180)); - painter.line_segment( - [Pos2::new(screen_rect.min.x, pos.y), Pos2::new(screen_rect.max.x, pos.y)], s); - painter.line_segment( - [Pos2::new(pos.x, screen_rect.min.y), Pos2::new(pos.x, screen_rect.max.y)], s); - } - - // 4. Hint text. - let hint = match &self.state { - SelectionState::Idle if self.hovered_window.is_some() => - "Click to capture window | Drag for custom selection | Esc to cancel", - SelectionState::Idle => - "Click or drag to select | Esc to cancel", - SelectionState::Dragging { .. } => "Release to capture", - SelectionState::AwaitingSecondClick { .. } => - "Click to set the second corner | Esc to cancel", - _ => "", - }; - if !hint.is_empty() { - painter.text( - Pos2::new(screen_rect.center().x, screen_rect.max.y - 28.0), - egui::Align2::CENTER_BOTTOM, - hint, - egui::FontId::proportional(14.0), - Color32::from_white_alpha(200), - ); - } - }); - - // ── Resolve ─────────────────────────────────────────────────────────── - match &self.state { - SelectionState::Done { start, end } => { - let rect = Rect::from_two_pos(*start, *end).intersect(screen_rect); - if rect.width() > 2.0 && rect.height() > 2.0 { - let ppp = ctx.pixels_per_point(); - // egui coords are logical points — scale to physical pixels. - let x = ((rect.min.x - screen_rect.min.x) * ppp).round() as i32; - let y = ((rect.min.y - screen_rect.min.y) * ppp).round() as i32; - let width = (rect.width() * ppp).round() as u32; - let height = (rect.height() * ppp).round() as u32; - - eprintln!("[overlay] physical x={x} y={y} w={width} h={height}"); - - self.result = Some(SelectionResult::Selected(Region { - x: x.max(0), - y: y.max(0), - width, - height, - })); - ctx.send_viewport_cmd(egui::ViewportCommand::Close); - } else { - self.state = SelectionState::Idle; - } - } - SelectionState::Cancelled => { - self.result = Some(SelectionResult::Cancelled); - ctx.send_viewport_cmd(egui::ViewportCommand::Close); - } - _ => {} - } - - ctx.request_repaint_after(std::time::Duration::from_millis(16)); - } - - fn clear_color(&self, _visuals: &egui::Visuals) -> [f32; 4] { - [0.0, 0.0, 0.0, 0.0] - } -} - -fn fit_to_max_texture(img: RgbaImage) -> RgbaImage { - let (w, h) = img.dimensions(); - if w <= MAX_TEX && h <= MAX_TEX { - return img; - } - let scale = (MAX_TEX as f32 / w as f32).min(MAX_TEX as f32 / h as f32); - image::imageops::resize( - &img, - (w as f32 * scale) as u32, - (h as f32 * scale) as u32, - image::imageops::FilterType::Triangle, - ) -} diff --git a/src/review.rs b/src/review.rs deleted file mode 100644 index d67e68b..0000000 --- a/src/review.rs +++ /dev/null @@ -1,345 +0,0 @@ -//! After-capture review window. -//! -//! Performance design: -//! - Effects (rounded corners, drop shadow) run on a background thread so the -//! UI never blocks. A `Receiver` is polled each frame; when the result -//! arrives the texture is swapped out. -//! - A debounce timer (`dirty_since`) ensures we only spawn a new worker 150 ms -//! after the last slider change, not on every incremental drag tick. -//! - The raw image is wrapped in Arc so it is shared with worker threads -//! without cloning the pixel data. -//! - Texture uploads are guarded by MAX_TEX so we never panic on large images. - -use std::path::PathBuf; -use std::sync::{Arc, mpsc}; -use std::time::{Duration, Instant}; - -use arboard::{Clipboard, ImageData}; -use eframe::egui::{self, Color32, ColorImage, Rounding, ScrollArea, Stroke, TextureHandle, TextureOptions, Vec2}; -use image::RgbaImage; - -use crate::{config::Config, effects::apply_effects}; - -const MAX_TEX: u32 = 8192; -/// How long to wait after the last setting change before spawning the worker. -const DEBOUNCE: Duration = Duration::from_millis(150); - -#[derive(Debug)] -pub enum ReviewAction { - #[allow(dead_code)] // path stored for future use (e.g. desktop notification) - Saved(PathBuf), - Copied, - Discarded, -} - -/// Channel message from the background effects worker. -struct EffectsResult(RgbaImage); - -pub struct ReviewWindow { - /// Full-resolution raw capture — shared with worker threads via Arc. - raw_image: Arc, - /// Last fully-processed preview (what gets saved/copied). - preview_image: Arc, - /// GPU texture (may be downscaled for display). - preview_texture: TextureHandle, - pub config: Config, - save_as_path: String, - status_message: Option, - pub action: Option, - settings_open: bool, - - /// Set when settings change; cleared when a worker is spawned. - dirty_since: Option, - /// Receives the processed image from the background worker. - worker_rx: Option>, - /// True while a worker is running. - worker_running: bool, -} - -impl ReviewWindow { - pub fn new(cc: &eframe::CreationContext<'_>, raw_image: RgbaImage, config: Config) -> Self { - let raw = Arc::new(raw_image); - let preview = Arc::new(apply_effects((*raw).clone(), &config.effects)); - let texture = upload_texture(&cc.egui_ctx, &preview); - let save_as_path = config.output_path().display().to_string(); - Self { - raw_image: raw, - preview_image: preview, - preview_texture: texture, - config, - save_as_path, - status_message: None, - action: None, - settings_open: false, - dirty_since: None, - worker_rx: None, - worker_running: false, - } - } - - /// Mark settings as changed. A worker will be spawned after the debounce. - fn mark_dirty(&mut self) { - // Only reset the timer if we're not already waiting (avoids pushing - // the debounce out indefinitely on fast slider drag). - if self.dirty_since.is_none() { - self.dirty_since = Some(Instant::now()); - } - } - - /// Poll for a finished worker result and/or spawn a new one if due. - fn tick_effects(&mut self, ctx: &egui::Context) { - // 1. Check if the running worker is done. - if let Some(rx) = &self.worker_rx { - if let Ok(EffectsResult(img)) = rx.try_recv() { - let img = Arc::new(img); - self.preview_texture = upload_texture(ctx, &img); - self.preview_image = img; - self.worker_rx = None; - self.worker_running = false; - } - } - - // 2. Spawn a new worker if debounce has elapsed and none is running. - if let Some(since) = self.dirty_since { - if !self.worker_running && since.elapsed() >= DEBOUNCE { - self.dirty_since = None; - self.worker_running = true; - - let raw = Arc::clone(&self.raw_image); - let effects_cfg = self.config.effects.clone(); - let (tx, rx) = mpsc::channel(); - let ctx_clone = ctx.clone(); - - std::thread::spawn(move || { - let result = apply_effects((*raw).clone(), &effects_cfg); - let _ = tx.send(EffectsResult(result)); - // Wake the egui event loop so the new texture is picked up. - ctx_clone.request_repaint(); - }); - - self.worker_rx = Some(rx); - } - - // Keep repainting while waiting for the debounce to fire. - if self.worker_running || self.dirty_since.is_some() { - ctx.request_repaint_after(Duration::from_millis(50)); - } - } - } - - fn copy_to_clipboard(&mut self) { - match Clipboard::new() { - Ok(mut cb) => { - let (w, h) = self.preview_image.dimensions(); - let bytes = self.preview_image.as_raw().clone(); - match cb.set_image(ImageData { width: w as usize, height: h as usize, bytes: bytes.into() }) { - Ok(_) => { - self.status_message = Some("Copied to clipboard.".into()); - self.action = Some(ReviewAction::Copied); - } - Err(e) => self.status_message = Some(format!("Clipboard error: {e}")), - } - } - Err(e) => self.status_message = Some(format!("Could not open clipboard: {e}")), - } - } - - fn save_to_path(&mut self, path: PathBuf) { - if let Some(parent) = path.parent() { - if let Err(e) = std::fs::create_dir_all(parent) { - self.status_message = Some(format!("Could not create directory: {e}")); - return; - } - } - match self.preview_image.save(&path) { - Ok(_) => { - self.status_message = Some(format!("Saved to {}", path.display())); - self.action = Some(ReviewAction::Saved(path)); - } - Err(e) => self.status_message = Some(format!("Save error: {e}")), - } - } -} - -impl eframe::App for ReviewWindow { - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - self.tick_effects(ctx); - - // ── Global keybinds ─────────────────────────────────────────────────── - // Ctrl+C — copy to clipboard immediately. - // Checked before any panel so it works regardless of widget focus. - if ctx.input_mut(|i| i.consume_key(egui::Modifiers::CTRL, egui::Key::C)) { - self.copy_to_clipboard(); - } - - // ── Top bar ─────────────────────────────────────────────────────────── - egui::TopBottomPanel::top("actions").show(ctx, |ui| { - ui.add_space(6.0); - ui.horizontal(|ui| { - if ui.button("📋 Copy").clicked() { - self.copy_to_clipboard(); - } - if ui.button("💾 Save").clicked() { - let path = self.config.output_path(); - self.save_to_path(path); - } - ui.separator(); - ui.label("Save As:"); - ui.add( - egui::TextEdit::singleline(&mut self.save_as_path) - .desired_width(300.0) - .hint_text("/home/user/Pictures/shot.png"), - ); - if ui.button("Save").clicked() { - let path = PathBuf::from(&self.save_as_path); - self.save_to_path(path); - } - ui.separator(); - let label = if self.settings_open { "▲ Effects" } else { "▼ Effects" }; - if ui.button(label).clicked() { - self.settings_open = !self.settings_open; - } - // Spinner while worker is active. - if self.worker_running { - ui.spinner(); - } - ui.separator(); - if ui.button("✖ Discard").clicked() { - self.action = Some(ReviewAction::Discarded); - ctx.send_viewport_cmd(egui::ViewportCommand::Close); - } - }); - ui.add_space(4.0); - }); - - // ── Effects panel ───────────────────────────────────────────────────── - if self.settings_open { - egui::TopBottomPanel::top("settings").show(ctx, |ui| { - ui.add_space(6.0); - ui.heading("Effects"); - ui.separator(); - - let e = &mut self.config.effects; - let mut changed = false; - - ui.horizontal(|ui| { - changed |= ui.checkbox(&mut e.rounded_corners, "Rounded corners").changed(); - if e.rounded_corners { - ui.label("Radius:"); - changed |= ui - .add(egui::Slider::new(&mut e.corner_radius, 1.0..=64.0).suffix(" px")) - .changed(); - } - }); - - ui.horizontal(|ui| { - changed |= ui.checkbox(&mut e.drop_shadow, "Drop shadow").changed(); - if e.drop_shadow { - ui.label("Blur:"); - changed |= ui - .add(egui::Slider::new(&mut e.shadow_blur_radius, 0.0..=60.0).suffix(" px")) - .changed(); - ui.label("X:"); - changed |= ui - .add(egui::Slider::new(&mut e.shadow_offset_x, -40.0..=40.0).suffix(" px")) - .changed(); - ui.label("Y:"); - changed |= ui - .add(egui::Slider::new(&mut e.shadow_offset_y, -40.0..=40.0).suffix(" px")) - .changed(); - } - }); - - if changed { - self.mark_dirty(); - let _ = self.config.save(); - } - ui.add_space(4.0); - }); - } - - // ── Status bar ──────────────────────────────────────────────────────── - if let Some(msg) = self.status_message.clone() { - egui::TopBottomPanel::bottom("status").show(ctx, |ui| { - ui.add_space(4.0); - ui.horizontal(|ui| { - ui.label(egui::RichText::new(&msg).color(Color32::LIGHT_GREEN)); - if ui.small_button("✖").clicked() { - self.status_message = None; - } - }); - ui.add_space(4.0); - }); - } - - // ── Preview ─────────────────────────────────────────────────────────── - egui::CentralPanel::default().show(ctx, |ui| { - ScrollArea::both().show(ui, |ui| { - let tex_size = self.preview_texture.size_vec2(); - let available = ui.available_size(); - let scale = (available.x / tex_size.x) - .min(available.y / tex_size.y) - .min(1.0); - let display_size = tex_size * scale; - let img_rect = ui.allocate_space(display_size).1; - - draw_checkerboard(ui.painter(), img_rect); - ui.painter().image( - self.preview_texture.id(), - img_rect, - egui::Rect::from_min_max(egui::Pos2::ZERO, egui::Pos2::new(1.0, 1.0)), - Color32::WHITE, - ); - ui.painter().rect_stroke( - img_rect, - Rounding::ZERO, - Stroke::new(1.0, Color32::from_gray(80)), - ); - }); - }); - - // Close after save/copy — give one extra frame so the status message - // is visible for a moment. - if let Some(ReviewAction::Saved(_) | ReviewAction::Copied) = &self.action { - ctx.send_viewport_cmd(egui::ViewportCommand::Close); - } - } -} - -// ─── Helpers ───────────────────────────────────────────────────────────────── - -fn upload_texture(ctx: &egui::Context, img: &RgbaImage) -> TextureHandle { - let (w, h) = img.dimensions(); - let scaled; - let src: &RgbaImage = if w > MAX_TEX || h > MAX_TEX { - let s = (MAX_TEX as f32 / w as f32).min(MAX_TEX as f32 / h as f32); - scaled = image::imageops::resize( - img, - (w as f32 * s) as u32, - (h as f32 * s) as u32, - image::imageops::FilterType::Triangle, - ); - &scaled - } else { - img - }; - let (uw, uh) = src.dimensions(); - let ci = ColorImage::from_rgba_unmultiplied([uw as usize, uh as usize], src.as_raw()); - ctx.load_texture("preview", ci, TextureOptions::LINEAR) -} - -fn draw_checkerboard(painter: &egui::Painter, rect: egui::Rect) { - let tile = 8.0_f32; - let c0 = Color32::from_gray(200); - let c1 = Color32::from_gray(160); - let cols = (rect.width() / tile).ceil() as u32; - let rows = (rect.height() / tile).ceil() as u32; - for row in 0..rows { - for col in 0..cols { - let color = if (row + col) % 2 == 0 { c0 } else { c1 }; - let min = rect.min + Vec2::new(col as f32 * tile, row as f32 * tile); - let max = (min + Vec2::splat(tile)).min(rect.max); - painter.rect_filled(egui::Rect::from_min_max(min, max), Rounding::ZERO, color); - } - } -} diff --git a/test b/test deleted file mode 100755 index a659000..0000000 Binary files a/test and /dev/null differ diff --git a/test.rs b/test.rs deleted file mode 100644 index 1d2da3e..0000000 --- a/test.rs +++ /dev/null @@ -1 +0,0 @@ -fn main() { println!("test"); } diff --git a/test_viewport.rs b/test_viewport.rs deleted file mode 100644 index 785dce5..0000000 --- a/test_viewport.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - let _ = eframe::egui::ViewportBuilder::default().with_active(false); -}