From 360973175c46793f1c427e8c6d2d0932f29b0cc7 Mon Sep 17 00:00:00 2001 From: Ashley Wulber <48420062+wash2@users.noreply.github.com> Date: Fri, 13 Mar 2026 16:04:17 -0400 Subject: [PATCH] feat: rebase libcosmic onto iced 0.14 --- Cargo.lock | 2301 ++++++++++++++++++++----------------------- Cargo.toml | 6 +- src/app.rs | 532 +++++----- src/dialog.rs | 120 +-- src/key_bind.rs | 5 +- src/lib.rs | 1 + src/load_image.rs | 219 ++++ src/menu.rs | 8 +- src/mounter/gvfs.rs | 76 +- src/mouse_area.rs | 85 +- src/tab.rs | 803 +++++++-------- 11 files changed, 2142 insertions(+), 2014 deletions(-) create mode 100644 src/load_image.rs diff --git a/Cargo.lock b/Cargo.lock index 7275e8c..49a309c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,75 +20,78 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" -version = "0.16.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.22.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +dependencies = [ + "uuid", +] [[package]] name = "accesskit_atspi_common" -version = "0.9.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.15.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", "atspi-common", "serde", - "thiserror 1.0.69", - "zvariant 3.15.2", + "zvariant 5.10.0", ] [[package]] name = "accesskit_consumer" -version = "0.24.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.32.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", - "immutable-chunkmap", + "hashbrown 0.16.1", ] [[package]] name = "accesskit_macos" -version = "0.17.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.23.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", + "hashbrown 0.16.1", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", - "once_cell", ] [[package]] name = "accesskit_unix" -version = "0.12.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.18.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_atspi_common", "atspi", - "futures-lite 1.13.0", + "futures-lite", "serde", "tokio", "tokio-stream", - "zbus 3.15.2", + "zbus 5.14.0", ] [[package]] name = "accesskit_windows" -version = "0.22.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.30.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", - "paste", + "hashbrown 0.16.1", "static_assertions", - "windows 0.54.0", + "windows 0.61.3", + "windows-core 0.61.2", ] [[package]] name = "accesskit_winit" -version = "0.22.0" -source = "git+https://github.com/wash2/accesskit?tag=iced-xdg-surface-0.13-rc#c46afc041b1968a5af0186fa6aba3ea9cf24c8c3" +version = "0.30.0" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_macos", @@ -198,7 +201,7 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "thiserror 1.0.69", ] @@ -312,7 +315,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -389,23 +392,13 @@ dependencies = [ "zbus 5.14.0", ] -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener 2.5.3", - "futures-core", -] - [[package]] name = "async-broadcast" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -431,8 +424,8 @@ checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.3.0", - "futures-lite 2.6.1", + "fastrand", + "futures-lite", "pin-project-lite", "slab", ] @@ -443,29 +436,9 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ - "async-lock 3.4.2", + "async-lock", "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.28", - "slab", - "socket2 0.4.10", - "waker-fn", + "futures-lite", ] [[package]] @@ -478,51 +451,25 @@ dependencies = [ "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.6.1", + "futures-lite", "parking", - "polling 3.11.0", + "polling", "rustix 1.1.4", "slab", "windows-sys 0.61.2", ] -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - [[package]] name = "async-lock" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "pin-project-lite", ] -[[package]] -name = "async-process" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" -dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", - "async-signal", - "blocking", - "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.44", - "windows-sys 0.48.0", -] - [[package]] name = "async-process" version = "2.5.0" @@ -530,14 +477,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", - "async-io 2.6.0", - "async-lock 3.4.2", + "async-io", + "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", + "event-listener", + "futures-lite", "rustix 1.1.4", ] @@ -549,7 +496,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -558,8 +505,8 @@ version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ - "async-io 2.6.0", - "async-lock 3.4.2", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", @@ -584,7 +531,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -605,62 +552,51 @@ dependencies = [ [[package]] name = "atspi" -version = "0.19.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" dependencies = [ "atspi-common", - "atspi-connection", "atspi-proxies", ] [[package]] name = "atspi-common" -version = "0.3.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" dependencies = [ "enumflags2", "serde", "static_assertions", - "zbus 3.15.2", - "zbus_names 2.6.1", - "zvariant 3.15.2", -] - -[[package]] -name = "atspi-connection" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" -dependencies = [ - "atspi-common", - "atspi-proxies", - "futures-lite 1.13.0", - "zbus 3.15.2", + "zbus 5.14.0", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names 4.3.1", + "zvariant 5.10.0", ] [[package]] name = "atspi-proxies" -version = "0.3.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" dependencies = [ "atspi-common", "serde", - "zbus 3.15.2", + "zbus 5.14.0", ] [[package]] name = "auto_enums" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781" +checksum = "65398a2893f41bce5c9259f6e1a4f03fbae40637c1bdc755b4f387f48c613b03" dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -729,18 +665,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bit_field" @@ -802,7 +738,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.3", + "objc2 0.6.4", ] [[package]] @@ -814,10 +750,19 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.6.1", + "futures-lite", "piper", ] +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "cfg_aliases", +] + [[package]] name = "brotli-decompressor" version = "5.0.0" @@ -883,7 +828,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -923,20 +868,6 @@ dependencies = [ "displaydoc", ] -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.11.0", - "log", - "polling 3.11.0", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - [[package]] name = "calloop" version = "0.14.4" @@ -944,31 +875,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ "bitflags 2.11.0", - "polling 3.11.0", + "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", + "calloop", "rustix 1.1.4", "wayland-backend", "wayland-client", @@ -1005,9 +924,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.6" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cef5b5a1a6827c7322ae2a636368a573006b27cfa76c7ebd53e834daeaab6a" +checksum = "3c6b04e07d8080154ed4ac03546d9a2b303cc2fe1901ba0b35b301516e289368" dependencies = [ "smallvec", "target-lexicon", @@ -1019,12 +938,6 @@ 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" @@ -1068,7 +981,7 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "objc", "objc-foundation", @@ -1078,7 +991,7 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "dnd", "mime 0.1.0", @@ -1088,7 +1001,7 @@ dependencies = [ [[package]] name = "clipboard_x11" version = "0.4.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "thiserror 1.0.69", "x11rb", @@ -1103,7 +1016,7 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation", + "core-foundation 0.9.4", "core-graphics", "foreign-types", "libc", @@ -1118,18 +1031,19 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "libc", "objc", ] [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", "unicode-width", ] @@ -1146,37 +1060,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[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" @@ -1215,12 +1098,12 @@ dependencies = [ [[package]] name = "compio-driver" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f5f90a253c667513b9db8138d7db2a034437094fde76e4f57542661a7f9cfda" +checksum = "ec8557d3804525f0e97594681f675929931782c9f8783a51c9f86da86b819150" dependencies = [ "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "compio-buf", "compio-log", "crossbeam-queue", @@ -1232,10 +1115,10 @@ dependencies = [ "once_cell", "paste", "pin-project-lite", - "polling 3.11.0", + "polling", "slab", "smallvec", - "socket2 0.6.2", + "socket2", "synchrony", "thin-cell", "windows-sys 0.61.2", @@ -1248,7 +1131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65ee36e1acf2cec4835efe9a986c012b2462c5ef53580e4ee84ae6d5a3d8e3b3" dependencies = [ "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "compio-buf", "compio-driver", "compio-io", @@ -1287,10 +1170,10 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f05ed201484967dc70de77a8f7a02b29aaa8e6c81cbea2e75492ee0c8d97766b" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1311,7 +1194,7 @@ dependencies = [ "pin-project-lite", "scoped-tls", "slab", - "socket2 0.6.2", + "socket2", "windows-sys 0.61.2", ] @@ -1346,6 +1229,16 @@ dependencies = [ "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" @@ -1359,8 +1252,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "foreign-types", "libc", ] @@ -1372,7 +1265,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", "libc", ] @@ -1411,9 +1315,22 @@ version = "0.1.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=d0e95be#d0e95be25e423cfe523b11111a3666ed7aaf0dc4" dependencies = [ "bitflags 2.11.0", - "cosmic-protocols", + "cosmic-protocols 0.1.0", "libc", - "smithay-client-toolkit 0.20.0", + "smithay-client-toolkit", + "wayland-client", + "wayland-protocols", +] + +[[package]] +name = "cosmic-client-toolkit" +version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" +dependencies = [ + "bitflags 2.11.0", + "cosmic-protocols 0.2.0", + "libc", + "smithay-client-toolkit", "wayland-client", "wayland-protocols", ] @@ -1421,7 +1338,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1442,10 +1359,10 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1456,11 +1373,11 @@ dependencies = [ "bzip2", "chrono", "compio", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.1.0", "cosmic-mime-apps", "dirs 6.0.0", "env_logger", - "fastrand 2.3.0", + "fastrand", "filetime", "flate2", "fork", @@ -1558,10 +1475,24 @@ dependencies = [ "wayland-server", ] +[[package]] +name = "cosmic-protocols" +version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "wayland-server", +] + [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#defa9f790432c70054ca1f39737d879ada5d0252" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#e37160f14d1e7ee428f973cd2848b4e95f83dfe1" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1582,10 +1513,10 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.18.2" -source = "git+https://github.com/pop-os/cosmic-text.git#f31b9d86959676d97fde54ff5907a58ab4308897" +source = "git+https://github.com/pop-os/cosmic-text.git#ddad5fb7410e374612925415a13843ed38f14245" dependencies = [ "bitflags 2.11.0", - "fontdb 0.23.0", + "fontdb", "harfrust", "linebender_resource_handle", "log", @@ -1593,7 +1524,7 @@ dependencies = [ "rustc-hash 2.1.1", "self_cell", "skrifa 0.40.0", - "smol_str 0.3.5", + "smol_str", "swash", "sys-locale", "unicode-bidi", @@ -1605,7 +1536,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "almost", "configparser", @@ -1692,6 +1623,18 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "cryoglyph" +version = "0.1.0" +source = "git+https://github.com/pop-os/glyphon.git?tag=cosmic-0.14#c49de15bce4d8254ac136d1be9911960cc85ce12" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -1710,9 +1653,9 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a878cfd6075649977f548ed439564cfdbe1f190a6656a00b48af7740f2f148" +checksum = "199f851bd3cb5004c09474252c7f74e7c047441ed0979bf3688a7106a13da952" dependencies = [ "num-traits", "phf 0.13.1", @@ -1732,17 +1675,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "d3d12" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" -dependencies = [ - "bitflags 2.11.0", - "libloading", - "winapi", -] - [[package]] name = "darling" version = "0.21.3" @@ -1764,7 +1696,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn", ] [[package]] @@ -1775,7 +1707,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1786,9 +1718,9 @@ checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "deflate64" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" +checksum = "807800ff3288b621186fe0a8f3392c4652068257302709c24efd918c3dffcdc2" [[package]] name = "deranged" @@ -1800,17 +1732,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive_setters" version = "0.1.9" @@ -1820,18 +1741,18 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "derive_utils" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" +checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1908,22 +1829,16 @@ dependencies = [ "winapi", ] -[[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.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", "libc", - "objc2 0.6.3", + "objc2 0.6.4", ] [[package]] @@ -1934,14 +1849,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "dlib" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ "libloading", ] @@ -1949,12 +1864,12 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "bitflags 2.11.0", "mime 0.1.0", "raw-window-handle", - "smithay-client-toolkit 0.19.2", + "smithay-client-toolkit", "smithay-clipboard", ] @@ -1975,8 +1890,8 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" -version = "0.1.1" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#dd46a1499bcc38f2134ab869e8860a32e091c55b" +version = "0.1.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" [[package]] name = "drm" @@ -2053,7 +1968,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2096,7 +2011,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2140,23 +2055,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.4.1" @@ -2174,7 +2072,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener", "pin-project-lite", ] @@ -2199,15 +2097,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.3.0" @@ -2231,7 +2120,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2306,6 +2195,15 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "float_next_after" version = "1.0.0" @@ -2378,6 +2276,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "font-types" version = "0.10.1" @@ -2405,20 +2309,6 @@ dependencies = [ "roxmltree", ] -[[package]] -name = "fontdb" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32eac81c1135c1df01d4e6d4233c47ba11f6a6d07f33e0bba09d18797077770" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2 0.9.10", - "slotmap", - "tinyvec", - "ttf-parser 0.21.1", -] - [[package]] name = "fontdb" version = "0.23.0" @@ -2430,7 +2320,7 @@ dependencies = [ "memmap2 0.9.10", "slotmap", "tinyvec", - "ttf-parser 0.25.1", + "ttf-parser", ] [[package]] @@ -2451,7 +2341,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2560,28 +2450,13 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-lite" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "fastrand 2.3.0", + "fastrand", "futures-core", "futures-io", "parking", @@ -2596,7 +2471,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2628,6 +2503,21 @@ dependencies = [ "slab", ] +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link 0.2.1", + "windows-result 0.4.1", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2668,20 +2558,20 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -2801,10 +2691,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf59b675301228a696fe01c3073974643365080a76cc3ed5bc2cbc466ad87f17" dependencies = [ "heck 0.5.0", - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2838,9 +2728,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.13.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ "js-sys", "slotmap", @@ -2889,15 +2779,14 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log", "presser", "thiserror 1.0.69", - "winapi", - "windows 0.52.0", + "windows 0.58.0", ] [[package]] @@ -2944,14 +2833,15 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", "zerocopy", ] [[package]] name = "harfrust" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9f40651a03bc0f7316bd75267ff5767e93017ef3cfffe76c6aa7252cc5a31c" +checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ "bitflags 2.11.0", "bytemuck", @@ -2972,7 +2862,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -2980,20 +2870,8 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.11.0", - "com", - "libc", - "libloading", - "thiserror 1.0.69", - "widestring", - "winapi", + "foldhash 0.2.0", ] [[package]] @@ -3008,12 +2886,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.5.2" @@ -3068,7 +2940,7 @@ dependencies = [ "i18n-embed-impl", "intl-memoizer", "log", - "parking_lot 0.12.5", + "parking_lot", "rust-embed", "sys-locale", "thiserror 1.0.69", @@ -3091,7 +2963,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn", "unic-langid", ] @@ -3105,7 +2977,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3134,26 +3006,29 @@ dependencies = [ [[package]] name = "iced" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "dnd", "iced_accessibility", "iced_core", + "iced_debug", "iced_futures", + "iced_program", "iced_renderer", + "iced_runtime", "iced_widget", "iced_winit", "image", "mime 0.1.0", - "thiserror 1.0.69", + "thiserror 2.0.18", "window_clipboard", ] [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "accesskit", "accesskit_winit", @@ -3161,32 +3036,42 @@ dependencies = [ [[package]] name = "iced_core" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "bitflags 2.11.0", "bytes", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", "dnd", "glam", + "lilt", "log", "mime 0.1.0", "num-traits", - "once_cell", "palette", "raw-window-handle", "rustc-hash 2.1.1", "serde", - "smol_str 0.2.2", - "thiserror 1.0.69", + "smol_str", + "thiserror 2.0.18", "web-time", "window_clipboard", ] +[[package]] +name = "iced_debug" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" +dependencies = [ + "iced_core", + "iced_futures", + "log", +] + [[package]] name = "iced_futures" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "futures", "iced_core", @@ -3194,25 +3079,13 @@ dependencies = [ "rustc-hash 2.1.1", "tokio", "wasm-bindgen-futures", - "wasm-timer", -] - -[[package]] -name = "iced_glyphon" -version = "0.6.0" -source = "git+https://github.com/pop-os/glyphon.git?tag=iced-0.14-dev#6ef9d12a20cfd0f7bdf38136a26ded9f7459ec8b" -dependencies = [ - "cosmic-text", - "etagere", - "lru", - "rustc-hash 2.1.1", - "wgpu", + "wasmtimer", ] [[package]] name = "iced_graphics" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "bitflags 2.11.0", "bytemuck", @@ -3224,47 +3097,56 @@ dependencies = [ "kamadak-exif", "log", "lyon_path", - "once_cell", "raw-window-handle", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.18", "unicode-segmentation", ] +[[package]] +name = "iced_program" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + [[package]] name = "iced_renderer" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "iced_graphics", "iced_tiny_skia", "iced_wgpu", "log", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "iced_runtime" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "bytes", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", "dnd", "iced_core", "iced_futures", "raw-window-handle", - "thiserror 1.0.69", + "thiserror 2.0.18", "window_clipboard", ] [[package]] name = "iced_tiny_skia" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "bytemuck", "cosmic-text", + "iced_debug", "iced_graphics", "kurbo 0.10.4", "log", @@ -3276,26 +3158,26 @@ dependencies = [ [[package]] name = "iced_wgpu" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.0", "bytemuck", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", + "cryoglyph", "futures", "glam", "guillotiere", - "iced_glyphon", + "iced_debug", "iced_graphics", "log", "lyon", - "once_cell", "raw-window-handle", "resvg", "rustc-hash 2.1.1", "rustix 0.38.44", - "thiserror 1.0.69", + "thiserror 2.0.18", "tiny-xlib", "wayland-backend", "wayland-client", @@ -3307,39 +3189,40 @@ dependencies = [ [[package]] name = "iced_widget" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.2" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", "dnd", "iced_renderer", "iced_runtime", "log", "num-traits", - "once_cell", "ouroboros", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.18", "unicode-segmentation", "window_clipboard", ] [[package]] name = "iced_winit" -version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", + "cursor-icon", "dnd", + "iced_debug", "iced_futures", "iced_graphics", + "iced_program", "iced_runtime", "log", "raw-window-handle", "rustc-hash 2.1.1", "rustix 0.38.44", - "thiserror 1.0.69", - "tracing", + "thiserror 2.0.18", "wasm-bindgen-futures", "wayland-backend", "wayland-client", @@ -3348,6 +3231,7 @@ dependencies = [ "winapi", "window_clipboard", "winit", + "winit-core", "xkbcommon 0.7.0", "xkbcommon-dl", "xkeysym", @@ -3799,9 +3683,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -3818,7 +3702,7 @@ dependencies = [ "rgb", "tiff", "zune-core 0.5.1", - "zune-jpeg 0.5.12", + "zune-jpeg 0.5.13", ] [[package]] @@ -3833,9 +3717,9 @@ dependencies = [ [[package]] name = "imagesize" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" @@ -3843,15 +3727,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" -[[package]] -name = "immutable-chunkmap" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3e98b1520e49e252237edc238a39869da9f3241f2ec19dc788c1d24694d1e4" -dependencies = [ - "arrayvec", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -3886,9 +3761,9 @@ dependencies = [ [[package]] name = "inotify" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ "bitflags 2.11.0", "inotify-sys", @@ -3913,15 +3788,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "interpolate_name" version = "0.2.4" @@ -3930,7 +3796,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3952,17 +3818,6 @@ dependencies = [ "unic-langid", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "io-uring" version = "0.7.11" @@ -4033,9 +3888,9 @@ checksum = "84de9d95a6d2547d9b77ee3f25fa0ee32e3c3a6484d47a55adebc0439c077992" [[package]] name = "jiff" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -4048,20 +3903,20 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "jiff-tzdb" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" [[package]] name = "jiff-tzdb-platform" @@ -4104,17 +3959,11 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" -version = "0.3.88" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e709f3e3d22866f9c25b3aff01af289b18422cc8b4262fb19103ee80fe513d" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -4302,13 +4151,23 @@ dependencies = [ [[package]] name = "kamadak-exif" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" dependencies = [ "mutate_once", ] +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.11.0", + "serde", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -4402,19 +4261,19 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#384e8f6e219bb458720eafa5bb971b832c057f23" +source = "git+https://github.com/pop-os/libcosmic.git#01e5593741c7aa7eedf0692c6087ee3fb97feeb8" dependencies = [ "apply", "ashpd 0.12.3", "auto_enums", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0", "cosmic-config", "cosmic-freedesktop-icons", "cosmic-settings-config", @@ -4422,6 +4281,7 @@ dependencies = [ "cosmic-theme", "css-color", "derive_setters", + "float-cmp 0.10.0", "freedesktop-desktop-entry", "futures", "i18n-embed", @@ -4486,13 +4346,23 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ "bitflags 2.11.0", "libc", - "redox_syscall 0.7.1", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", ] [[package]] @@ -4501,12 +4371,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4565,6 +4429,20 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "pin-utils", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + [[package]] name = "loop9" version = "0.1.5" @@ -4576,15 +4454,15 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.5" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" [[package]] name = "lyon" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" +checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" dependencies = [ "lyon_algorithms", "lyon_tessellation", @@ -4592,9 +4470,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" +checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" dependencies = [ "lyon_path", "num-traits", @@ -4602,9 +4480,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" dependencies = [ "arrayvec", "euclid", @@ -4613,9 +4491,9 @@ dependencies = [ [[package]] name = "lyon_path" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" dependencies = [ "lyon_geom", "num-traits", @@ -4623,9 +4501,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" +checksum = "05a35a7dd71b845ff317ce1834c4185506b79790294bde397df8d5c23031e357" dependencies = [ "float_next_after", "lyon_path", @@ -4644,12 +4522,12 @@ dependencies = [ [[package]] name = "mac-notification-sys" -version = "0.6.9" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fd3f75411f4725061682ed91f131946e912859d0044d39c4ec0aac818d7621" +checksum = "29a16783dd1a47849b8c8133c9cd3eb2112cfbc6901670af3dba47c8bbfb07d3" dependencies = [ "cc", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-foundation 0.3.2", "time", ] @@ -4716,15 +4594,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -4736,13 +4605,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.29.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.11.0", "block", - "core-graphics-types", + "core-graphics-types 0.2.0", "foreign-types", "log", "objc", @@ -4752,7 +4621,7 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "smithay-clipboard", ] @@ -4803,9 +4672,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.11" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -4819,23 +4688,28 @@ checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" -version = "22.1.0" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", "bitflags 2.11.0", - "cfg_aliases 0.1.1", + "cfg-if", + "cfg_aliases", "codespan-reporting", + "half", + "hashbrown 0.16.1", "hexf-parse", "indexmap 2.13.0", + "libm", "log", + "num-traits", + "once_cell", "rustc-hash 1.1.0", "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", + "thiserror 2.0.18", + "unicode-ident", ] [[package]] @@ -4847,7 +4721,7 @@ dependencies = [ "bitflags 2.11.0", "jni-sys", "log", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -4859,15 +4733,6 @@ 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", -] - [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -4883,18 +4748,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", -] - [[package]] name = "nix" version = "0.29.0" @@ -4903,9 +4756,9 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.11.0", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", - "memoffset 0.9.1", + "memoffset", ] [[package]] @@ -4970,7 +4823,7 @@ version = "4.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21af20a1b50be5ac5861f74af1a863da53a11c38684d9818d82f1c42f7fdc6c2" dependencies = [ - "futures-lite 2.6.1", + "futures-lite", "log", "mac-notification-sys", "serde", @@ -5020,7 +4873,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5059,7 +4912,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", ] @@ -5079,10 +4932,10 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5123,9 +4976,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -5154,34 +5007,11 @@ checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", - "objc2 0.6.3", + "objc2 0.6.4", + "objc2-core-foundation", "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.0", - "block2 0.5.1", - "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 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - [[package]] name = "objc2-core-data" version = "0.2.2" @@ -5201,8 +5031,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.11.0", + "block2 0.6.2", "dispatch2", - "objc2 0.6.3", + "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.0", + "libc", + "objc2-core-foundation", ] [[package]] @@ -5218,15 +5060,14 @@ dependencies = [ ] [[package]] -name = "objc2-core-location" -version = "0.2.2" +name = "objc2-core-video" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", + "bitflags 2.11.0", + "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] @@ -5243,7 +5084,6 @@ checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.11.0", "block2 0.5.1", - "dispatch", "libc", "objc2 0.5.2", ] @@ -5257,22 +5097,10 @@ dependencies = [ "bitflags 2.11.0", "block2 0.6.2", "libc", - "objc2 0.6.3", + "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 0.5.1", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - [[package]] name = "objc2-metal" version = "0.2.2" @@ -5298,59 +5126,16 @@ dependencies = [ "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" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ "bitflags 2.11.0", - "block2 0.5.1", - "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 0.5.1", - "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.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", ] [[package]] @@ -5401,6 +5186,15 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-float" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -5453,7 +5247,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5462,7 +5256,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ - "ttf-parser 0.25.1", + "ttf-parser", ] [[package]] @@ -5487,7 +5281,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5496,17 +5290,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -5514,21 +5297,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -5615,7 +5384,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "fastrand 2.3.0", + "fastrand", "phf_shared 0.13.1", ] @@ -5629,7 +5398,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5642,7 +5411,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "uncased", ] @@ -5673,29 +5442,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5705,12 +5474,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", - "fastrand 2.3.0", + "fastrand", "futures-io", ] @@ -5720,6 +5489,12 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[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" @@ -5746,22 +5521,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - [[package]] name = "polling" version = "3.11.0" @@ -5770,7 +5529,7 @@ checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.5.2", + "hermit-abi", "pin-project-lite", "rustix 1.1.4", "windows-sys 0.61.2", @@ -5842,26 +5601,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn", ] [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit", ] [[package]] @@ -5883,7 +5632,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5903,7 +5652,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "version_check", "yansi", ] @@ -5948,7 +5697,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5959,12 +5708,9 @@ checksum = "869675ad2d7541aea90c6d88c81f46a7f4ea9af8cd0395d38f11a95126998a0d" [[package]] name = "pxfm" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" -dependencies = [ - "num-traits", -] +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "qoi" @@ -6005,15 +5751,25 @@ name = "quick-xml" version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", + "serde", +] + +[[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.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -6024,6 +5780,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.5" @@ -6085,9 +5847,9 @@ dependencies = [ [[package]] name = "range-alloc" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" [[package]] name = "rangemap" @@ -6132,9 +5894,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -6208,25 +5970,6 @@ dependencies = [ "url", ] -[[package]] -name = "redox_event" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3514da49aa6ca4cff5088a1b382ef3a0d9149964d29bb49ebd03fd66cc575a18" -dependencies = [ - "bitflags 2.11.0", - "libredox", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.18" @@ -6238,9 +5981,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ "bitflags 2.11.0", ] @@ -6284,7 +6027,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6312,9 +6055,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "renderdoc-sys" @@ -6324,18 +6067,19 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "resvg" -version = "0.42.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944d052815156ac8fa77eaac055220e95ba0b01fa8887108ca710c03805d9051" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ "gif 0.13.3", - "jpeg-decoder", + "image-webp", "log", "pico-args", "rgb", "svgtypes", "tiny-skia", "usvg", + "zune-jpeg 0.4.21", ] [[package]] @@ -6349,7 +6093,7 @@ dependencies = [ "dispatch2", "js-sys", "log", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -6364,9 +6108,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" dependencies = [ "bytemuck", ] @@ -6424,7 +6168,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.117", + "syn", "walkdir", ] @@ -6450,20 +6194,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustix" -version = "0.37.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.38.44" @@ -6498,14 +6228,16 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustybuzz" -version = "0.14.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ "bitflags 2.11.0", "bytemuck", + "core_maths", + "log", "smallvec", - "ttf-parser 0.21.1", + "ttf-parser", "unicode-bidi-mirroring", "unicode-ccc", "unicode-properties", @@ -6559,14 +6291,14 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +checksum = "1dd3accc0f3f4bbaf2c9e1957a030dc582028130c67660d44c0a0345a22ca69b" dependencies = [ "ab_glyph", "log", "memmap2 0.9.10", - "smithay-client-toolkit 0.19.2", + "smithay-client-toolkit", "tiny-skia", ] @@ -6609,7 +6341,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6634,7 +6366,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6648,9 +6380,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" dependencies = [ "base64", "chrono", @@ -6667,14 +6399,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6795,31 +6527,6 @@ 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.0", - "calloop 0.13.0", - "calloop-wayland-source 0.3.0", - "cursor-icon", - "libc", - "log", - "memmap2 0.9.10", - "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" @@ -6828,8 +6535,8 @@ checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ "bitflags 2.11.0", "bytemuck", - "calloop 0.14.4", - "calloop-wayland-source 0.4.1", + "calloop", + "calloop-wayland-source", "cursor-icon", "libc", "log", @@ -6853,47 +6560,32 @@ dependencies = [ [[package]] name = "smithay-clipboard" version = "0.8.0" -source = "git+https://github.com/pop-os/smithay-clipboard?tag=pop-dnd-5#5a3007def49eb678d1144850c9ee04b80707c56a" +source = "git+https://github.com/pop-os/smithay-clipboard?tag=sctk-0.20#859b02c88f45c554049a67c6ddeec1692ce0e20b" dependencies = [ "libc", "raw-window-handle", - "smithay-client-toolkit 0.19.2", + "smithay-client-toolkit", "wayland-backend", ] [[package]] name = "smol_str" -version = "0.2.2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" dependencies = [ - "serde", -] - -[[package]] -name = "smol_str" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7a918bd2a9951d18ee6e48f076843e8e73a9a5d22cf05bcd4b7a81bdd04e17" - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", + "borsh", + "serde_core", ] [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6903,11 +6595,11 @@ source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422 dependencies = [ "as-raw-xcb-connection", "bytemuck", - "cfg_aliases 0.2.1", + "cfg_aliases", "cocoa", "core-graphics", "drm", - "fastrand 2.3.0", + "fastrand", "foreign-types", "js-sys", "log", @@ -6962,7 +6654,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" dependencies = [ - "float-cmp", + "float-cmp 0.9.0", ] [[package]] @@ -7004,17 +6696,6 @@ dependencies = [ "zeno", ] -[[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" @@ -7028,11 +6709,12 @@ dependencies = [ [[package]] name = "synchrony" -version = "0.1.1" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0208d3660701622272151bc63c35f5d32ca3d45c19785a9a8dc04dc797dc43" +checksum = "e6d5f5d3091c2d998f6ab4c8b495c0d232ad0aecbc1fa9ac52c247a79d497e16" dependencies = [ "futures-util", + "loom", ] [[package]] @@ -7043,7 +6725,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7117,12 +6799,12 @@ checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" -version = "3.25.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "fastrand 2.3.0", - "getrandom 0.4.1", + "fastrand", + "getrandom 0.4.2", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -7156,7 +6838,7 @@ checksum = "be35209fd0781c5401458ab66e4f98accf63553e8fae7425503e92fdd319783b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7191,7 +6873,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7202,7 +6884,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7216,16 +6898,16 @@ dependencies = [ [[package]] name = "tiff" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ "fax", "flate2", "half", "quick-error", "weezl", - "zune-jpeg 0.4.21", + "zune-jpeg 0.5.13", ] [[package]] @@ -7347,16 +7029,16 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -7364,13 +7046,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7405,15 +7087,9 @@ dependencies = [ "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.14", + "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -7424,26 +7100,24 @@ dependencies = [ ] [[package]] -name = "toml_edit" -version = "0.19.15" +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.6.11", - "winnow 0.5.40", + "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" dependencies = [ "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime 1.0.0+spec-1.1.0", "toml_parser", - "winnow 0.7.14", + "winnow", ] [[package]] @@ -7452,7 +7126,7 @@ version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ - "winnow 0.7.14", + "winnow", ] [[package]] @@ -7481,7 +7155,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7516,6 +7190,7 @@ dependencies = [ "once_cell", "regex-automata", "sharded-slab", + "smallvec", "thread_local", "tracing", "tracing-core", @@ -7539,12 +7214,6 @@ dependencies = [ "windows 0.56.0", ] -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - [[package]] name = "ttf-parser" version = "0.25.1" @@ -7583,13 +7252,13 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +checksum = "51b70b87d15e91f553711b40df3048faf27a7a04e01e0ddc0cf9309f0af7c2ca" dependencies = [ - "memoffset 0.9.1", + "memoffset", "tempfile", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -7634,15 +7303,15 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" [[package]] name = "unicode-ccc" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" @@ -7682,9 +7351,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -7713,14 +7382,14 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "usvg" -version = "0.42.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84ea542ae85c715f07b082438a4231c3760539d902e11d093847a0b22963032" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ "base64", "data-url", "flate2", - "fontdb 0.18.0", + "fontdb", "imagesize", "kurbo 0.11.3", "log", @@ -7758,9 +7427,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ "js-sys", "serde_core", @@ -7806,12 +7475,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "walkdir" version = "2.5.0" @@ -7848,9 +7511,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.111" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1adf1535672f5b7824f817792b1afd731d7e843d2d04ec8f27e8cb51edd8ac" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -7861,9 +7524,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.61" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88540d1c934c4ec8e6db0afa536876c5441289d7f9f9123d4f065ac1250a6b" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -7875,9 +7538,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.111" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e638317c08b21663aed4d2b9a2091450548954695ff4efa75bff5fa546b3b1" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7885,22 +7548,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.111" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c64760850114d03d5f65457e96fc988f11f01d38fbaa51b254e4ab5809102af" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.111" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60eecd4fe26177cfa3339eb00b4a36445889ba3ad37080c2429879718e20ca41" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -7927,21 +7590,6 @@ dependencies = [ "wasmparser", ] -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.11.2", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wasmparser" version = "0.244.0" @@ -7955,10 +7603,24 @@ dependencies = [ ] [[package]] -name = "wayland-backend" -version = "0.3.12" +name = "wasmtimer" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "wayland-backend" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa75f400b7f719bcd68b3f47cd939ba654cedeef690f486db71331eec4c6a406" dependencies = [ "cc", "downcast-rs", @@ -7970,9 +7632,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.12" +version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" +checksum = "ab51d9f7c071abeee76007e2b742499e535148035bb835f97aaed1338cf516c3" dependencies = [ "bitflags 2.11.0", "rustix 1.1.4", @@ -7993,9 +7655,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.12" +version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078" +checksum = "4b3298683470fbdc6ca40151dfc48c8f2fd4c41a26e13042f801f85002384091" dependencies = [ "rustix 1.1.4", "wayland-client", @@ -8004,9 +7666,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.10" +version = "0.32.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" +checksum = "b23b5df31ceff1328f06ac607591d5ba360cf58f90c8fad4ac8d3a55a3c4aec7" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -8030,9 +7692,9 @@ dependencies = [ [[package]] name = "wayland-protocols-misc" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e" +checksum = "429b99200febaf95d4f4e46deff6fe4382bcff3280ee16a41cf887b3c3364984" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -8043,9 +7705,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b" +checksum = "d392fc283a87774afc9beefcd6f931582bb97fe0e6ced0b306a62cb1d026527c" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -8056,9 +7718,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3" +checksum = "78248e4cc0eff8163370ba5c158630dcae1f3497a586b826eca2ef5f348d6235" dependencies = [ "bitflags 2.11.0", "wayland-backend", @@ -8070,20 +7732,20 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.8" +version = "0.31.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3" +checksum = "c86287151a309799b821ca709b7345a048a2956af05957c89cb824ab919fa4e3" dependencies = [ "proc-macro2", - "quick-xml 0.38.4", + "quick-xml 0.39.2", "quote", ] [[package]] name = "wayland-server" -version = "0.31.11" +version = "0.31.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9297ab90f8d1f597711d36455c5b1b2290eca59b8134485e377a296b80b118c9" +checksum = "63736a4a73e781cf6a736aa32c5d6773c3eb5389197562742a8c611b49b5e359" dependencies = [ "bitflags 2.11.0", "downcast-rs", @@ -8094,9 +7756,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd" +checksum = "374f6b70e8e0d6bf9461a32988fd553b59ff630964924dad6e4a4eb6bd538d17" dependencies = [ "dlib", "log", @@ -8106,9 +7768,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.88" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6bb20ed2d9572df8584f6dc81d68a41a625cadc6f15999d649a70ce7e3597a" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -8132,17 +7794,21 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "22.1.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "cfg_aliases 0.1.1", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", "document-features", + "hashbrown 0.16.1", "js-sys", "log", "naga", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "smallvec", @@ -8157,34 +7823,68 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "22.1.0" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", + "bit-set", "bit-vec", "bitflags 2.11.0", - "cfg_aliases 0.1.1", + "bytemuck", + "cfg_aliases", "document-features", + "hashbrown 0.16.1", "indexmap 2.13.0", "log", "naga", "once_cell", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", "wgpu-hal", "wgpu-types", ] [[package]] -name = "wgpu-hal" -version = "22.0.0" +name = "wgpu-core-deps-apple" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", @@ -8192,15 +7892,16 @@ dependencies = [ "bit-set", "bitflags 2.11.0", "block", - "cfg_aliases 0.1.1", - "core-graphics-types", - "d3d12", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hassle-rs", + "hashbrown 0.16.1", "js-sys", "khronos-egl", "libc", @@ -8208,31 +7909,37 @@ dependencies = [ "log", "metal", "naga", - "ndk-sys 0.5.0+25.2.9519653", + "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.5", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "web-sys", "wgpu-types", - "winapi", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] name = "wgpu-types" -version = "22.0.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.11.0", + "bytemuck", "js-sys", + "log", + "thiserror 2.0.18", "web-sys", ] @@ -8276,7 +7983,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#3a7af79e54db6854d8aa9d9e2866a9288d0f95d5" dependencies = [ "clipboard-win", "clipboard_macos", @@ -8288,28 +7995,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[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" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" -dependencies = [ - "windows-core 0.54.0", - "windows-implement 0.53.0", - "windows-interface 0.53.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.56.0" @@ -8320,6 +8005,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" @@ -8342,25 +8037,6 @@ dependencies = [ "windows-core 0.61.2", ] -[[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.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" -dependencies = [ - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.56.0" @@ -8373,6 +8049,19 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.61.2" @@ -8410,17 +8099,6 @@ dependencies = [ "windows-threading", ] -[[package]] -name = "windows-implement" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "windows-implement" version = "0.56.0" @@ -8429,7 +8107,18 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -8440,18 +8129,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -8462,7 +8140,18 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -8473,7 +8162,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -8507,6 +8196,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -8525,6 +8223,16 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -8860,51 +8568,214 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" -version = "0.30.5" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#dd46a1499bcc38f2134ab869e8860a32e091c55b" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "ahash", - "android-activity", - "atomic-waker", "bitflags 2.11.0", - "block2 0.5.1", - "bytemuck", - "calloop 0.13.0", - "cfg_aliases 0.2.1", - "concurrent-queue", - "core-foundation", - "core-graphics", + "cfg_aliases", "cursor-icon", "dpi", - "js-sys", "libc", - "libredox", - "memmap2 0.9.10", - "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", "raw-window-handle", - "redox_event", - "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit 0.19.2", - "smol_str 0.2.2", + "rustix 1.1.4", + "smol_str", + "tracing", + "winit-android", + "winit-appkit", + "winit-common", + "winit-core", + "winit-orbital", + "winit-uikit", + "winit-wayland", + "winit-web", + "winit-win32", + "winit-x11", +] + +[[package]] +name = "winit-android" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "android-activity", + "bitflags 2.11.0", + "dpi", + "ndk", + "raw-window-handle", + "smol_str", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-appkit" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-video", + "objc2-foundation 0.3.2", + "raw-window-handle", + "smol_str", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-common" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "memmap2 0.9.10", + "objc2 0.6.4", + "objc2-core-foundation", + "smol_str", + "tracing", + "winit-core", + "x11-dl", + "xkbcommon-dl", +] + +[[package]] +name = "winit-core" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "cursor-icon", + "dpi", + "keyboard-types", + "raw-window-handle", + "smol_str", + "web-time", +] + +[[package]] +name = "winit-orbital" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "dpi", + "libredox", + "orbclient", + "raw-window-handle", + "redox_syscall 0.7.3", + "smol_str", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-uikit" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-ui-kit", + "raw-window-handle", + "smol_str", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-wayland" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "ahash", + "bitflags 2.11.0", + "calloop", + "cursor-icon", + "dpi", + "libc", + "memmap2 0.9.10", + "raw-window-handle", + "rustix 1.1.4", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-protocols-plasma", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-web" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "atomic-waker", + "bitflags 2.11.0", + "concurrent-queue", + "cursor-icon", + "dpi", + "js-sys", + "pin-project", + "raw-window-handle", + "smol_str", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", "web-time", - "windows-sys 0.52.0", + "winit-core", +] + +[[package]] +name = "winit-win32" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "cursor-icon", + "dpi", + "raw-window-handle", + "smol_str", + "tracing", + "unicode-segmentation", + "windows-sys 0.59.0", + "winit-core", +] + +[[package]] +name = "winit-x11" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "calloop", + "cursor-icon", + "dpi", + "libc", + "percent-encoding", + "raw-window-handle", + "rustix 1.1.4", + "smol_str", + "tracing", + "winit-common", + "winit-core", "x11-dl", "x11rb", "xkbcommon-dl", @@ -8912,18 +8783,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] @@ -8958,7 +8820,7 @@ dependencies = [ "heck 0.5.0", "indexmap 2.13.0", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -8974,7 +8836,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -9239,69 +9101,33 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] -[[package]] -name = "zbus" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" -dependencies = [ - "async-broadcast 0.5.1", - "async-process 1.8.1", - "async-recursion", - "async-trait", - "byteorder", - "derivative", - "enumflags2", - "event-listener 2.5.3", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.26.4", - "once_cell", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tokio", - "tracing", - "uds_windows", - "winapi", - "xdg-home", - "zbus_macros 3.15.2", - "zbus_names 2.6.1", - "zvariant 3.15.2", -] - [[package]] name = "zbus" version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ - "async-broadcast 0.7.2", + "async-broadcast", "async-executor", "async-fs", - "async-io 2.6.0", - "async-lock 3.4.2", - "async-process 2.5.0", + "async-io", + "async-lock", + "async-process", "async-recursion", "async-task", "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.29.0", + "nix", "ordered-stream", "rand 0.8.5", "serde", @@ -9323,19 +9149,19 @@ version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ - "async-broadcast 0.7.2", + "async-broadcast", "async-executor", - "async-io 2.6.0", - "async-lock 3.4.2", - "async-process 2.5.0", + "async-io", + "async-lock", + "async-process", "async-recursion", "async-task", "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener", "futures-core", - "futures-lite 2.6.1", + "futures-lite", "hex", "libc", "ordered-stream", @@ -9347,24 +9173,34 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 0.7.14", + "winnow", "zbus_macros 5.14.0", "zbus_names 4.3.1", "zvariant 5.10.0", ] [[package]] -name = "zbus_macros" -version = "3.15.2" +name = "zbus-lockstep" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant 5.10.0", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" dependencies = [ - "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "regex", - "syn 1.0.109", - "zvariant_utils 1.0.1", + "syn", + "zbus-lockstep", + "zbus_xml", + "zvariant 5.10.0", ] [[package]] @@ -9373,10 +9209,10 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zvariant_utils 2.1.0", ] @@ -9386,26 +9222,15 @@ version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zbus_names 4.3.1", "zvariant 5.10.0", "zvariant_utils 3.3.0", ] -[[package]] -name = "zbus_names" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" -dependencies = [ - "serde", - "static_assertions", - "zvariant 3.15.2", -] - [[package]] name = "zbus_names" version = "3.0.0" @@ -9424,7 +9249,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", - "winnow 0.7.14", + "winnow", + "zvariant 5.10.0", +] + +[[package]] +name = "zbus_xml" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" +dependencies = [ + "quick-xml 0.38.4", + "serde", + "zbus_names 4.3.1", "zvariant 5.10.0", ] @@ -9436,22 +9273,22 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -9471,7 +9308,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -9492,7 +9329,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -9526,7 +9363,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -9559,9 +9396,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c745c48e1007337ed136dc99df34128b9faa6ed542d80a1c673cf55a6d7236c8" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" [[package]] name = "zmij" @@ -9641,27 +9478,13 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" +checksum = "ec5f41c76397b7da451efd19915684f727d7e1d516384ca6bd0ec43ec94de23c" dependencies = [ "zune-core 0.5.1", ] -[[package]] -name = "zvariant" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive 3.15.2", -] - [[package]] name = "zvariant" version = "4.2.0" @@ -9685,34 +9508,21 @@ dependencies = [ "enumflags2", "serde", "url", - "winnow 0.7.14", + "winnow", "zvariant_derive 5.10.0", "zvariant_utils 3.3.0", ] -[[package]] -name = "zvariant_derive" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", - "zvariant_utils 1.0.1", -] - [[package]] name = "zvariant_derive" version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zvariant_utils 2.1.0", ] @@ -9722,24 +9532,13 @@ version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zvariant_utils 3.3.0", ] -[[package]] -name = "zvariant_utils" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "zvariant_utils" version = "2.1.0" @@ -9748,7 +9547,7 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -9760,6 +9559,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.117", - "winnow 0.7.14", + "syn", + "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index d622c8e..be0b5ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,8 +103,8 @@ default = [ "io-uring", "lzma-rust2", "notify", - "wgpu", "wayland", + "wgpu", ] dbus-config = ["libcosmic/dbus-config"] desktop = ["dep:cosmic-mime-apps", "dep:xdg"] @@ -146,6 +146,10 @@ tokio = { version = "1", features = ["rt", "macros"] } # libcosmic = { path = "../libcosmic" } # cosmic-config = { path = "../libcosmic/cosmic-config" } # cosmic-theme = { path = "../libcosmic/cosmic-theme" } +# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } +# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } +# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } + # [patch.'https://github.com/pop-os/smithay-clipboard'] # smithay-clipboard = { path = "../smithay-clipboard" } diff --git a/src/app.rs b/src/app.rs index d62d14c..4e20f48 100644 --- a/src/app.rs +++ b/src/app.rs @@ -33,16 +33,16 @@ use cosmic::{ window::{self, Event as WindowEvent, Id as WindowId}, }, iced_runtime::clipboard, - iced_widget::button::focus, + iced_widget::{button::focus, scrollable::AbsoluteOffset}, style, surface, theme, widget::{ self, about::About, dnd_destination::DragId, - horizontal_space, icon, + icon, menu::{action::MenuAction, key_bind::KeyBind}, segmented_button::{self, Entity, ReorderEvent}, - vertical_space, + space, }, }; use mime_guess::Mime; @@ -1900,7 +1900,7 @@ impl App { section = section.add(widget::column::with_children([ widget::row::with_children([ widget::progress_bar(0.0..=1.0, progress) - .height(progress_bar_height) + .girth(progress_bar_height) .into(), if controller.is_paused() { widget::tooltip( @@ -2400,8 +2400,7 @@ impl Application for App { } Some(Element::from( - // XXX both must be shrink to avoid flex layout from ignoring it - nav.width(Length::Shrink).height(Length::Shrink), + nav.width(Length::Shrink).height(Length::Fill), )) } @@ -3213,7 +3212,10 @@ impl Application for App { if let Some(offset) = tab.select_focus_scroll() { return scrollable::scroll_to( tab.scrollable_id.clone(), - offset, + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, ); } } @@ -4199,7 +4201,13 @@ impl Application for App { //Restore scroll //TODO: why do scrollers with different IDs get the same scroll position? let scroll = tab.scroll_opt.unwrap_or_default(); - tasks.push(scrollable::scroll_to(tab.scrollable_id.clone(), scroll)); + tasks.push(scrollable::scroll_to( + tab.scrollable_id.clone(), + AbsoluteOffset { + x: Some(scroll.x), + y: Some(scroll.y), + }, + )); } self.activate_nav_model_location(&tab.location.clone()); } @@ -5229,7 +5237,7 @@ impl Application for App { .title(fl!("add-network-drive")) .header(text_input) .footer(widget::row::with_children([ - widget::horizontal_space().into(), + widget::space::horizontal().into(), button.into(), ])) } @@ -5251,7 +5259,7 @@ impl Application for App { _ => None, } }) - .unwrap_or_else(|| widget::horizontal_space().into()); + .unwrap_or_else(|| widget::space::horizontal().into()); context_drawer::context_drawer( self.preview(entity_opt, kind, true) .map(move |x| Message::TabMessage(Some(entity), x)), @@ -5534,8 +5542,9 @@ impl Application for App { //TODO: what should submit do? //TODO: button for showing password controls = controls.push( - widget::checkbox(fl!("remember-password"), *remember).on_toggle( - move |value| { + widget::checkbox(*remember) + .label(fl!("remember-password")) + .on_toggle(move |value| { Message::DialogUpdate(DialogPage::NetworkAuth { mounter_key: *mounter_key, uri: uri.clone(), @@ -5545,8 +5554,7 @@ impl Application for App { }, auth_tx: auth_tx.clone(), }) - }, - ), + }), ); } @@ -5710,11 +5718,13 @@ impl Application for App { } else { widget::text::body(app.name.clone()).into() }, - widget::horizontal_space().into(), + widget::space::horizontal().into(), if *selected == i { icon::from_name("checkbox-checked-symbolic").size(16).into() } else { - widget::Space::with_width(Length::Fixed(16.0)).into() + widget::space::horizontal() + .width(Length::Fixed(16.0)) + .into() }, ]) .spacing(space_s) @@ -5919,20 +5929,18 @@ impl Application for App { if *multiple { dialog .control( - widget::checkbox( - format!("{} ({})", fl!("apply-to-all"), *conflict_count), - *apply_to_all, - ) - .on_toggle(|apply_to_all| { - Message::DialogUpdate(DialogPage::Replace { - from: from.clone(), - to: to.clone(), - multiple: *multiple, - apply_to_all, - conflict_count: *conflict_count, - tx: tx.clone(), - }) - }), + widget::checkbox(*apply_to_all) + .label(format!("{} ({})", fl!("apply-to-all"), *conflict_count)) + .on_toggle(|apply_to_all| { + Message::DialogUpdate(DialogPage::Replace { + from: from.clone(), + to: to.clone(), + multiple: *multiple, + apply_to_all, + conflict_count: *conflict_count, + tx: tx.clone(), + }) + }), ) .secondary_action( widget::button::standard(fl!("skip")).on_press(Message::ReplaceResult( @@ -6053,7 +6061,7 @@ impl Application for App { //TODO: get height from theme? let progress_bar_height = Length::Fixed(4.0); let progress_bar = - widget::progress_bar(0.0..=1.0, total_progress).height(progress_bar_height); + widget::progress_bar(0.0..=1.0, total_progress).girth(progress_bar_height); let container = widget::layer_container(widget::column::with_children([ widget::row::with_children([ @@ -6089,14 +6097,14 @@ impl Application for App { .align_y(Alignment::Center) .into(), widget::text::body(title).into(), - widget::Space::with_height(space_s).into(), + widget::space::vertical().height(space_s).into(), widget::row::with_children([ widget::button::link(fl!("details")) .on_press(Message::ToggleContextPage(ContextPage::EditHistory)) .padding(0) .trailing_icon(true) .into(), - widget::horizontal_space().into(), + widget::space::horizontal().into(), widget::button::standard(fl!("dismiss")) .on_press(Message::PendingDismiss) .into(), @@ -6218,7 +6226,7 @@ impl Application for App { } // The toaster is added on top of an empty element to ensure that it does not override context menus - tab_column = tab_column.push(widget::toaster(&self.toasts, widget::horizontal_space())); + tab_column = tab_column.push(widget::toaster(&self.toasts, widget::space::horizontal())); let content: Element<_> = tab_column.into(); @@ -6257,27 +6265,27 @@ impl Application for App { self.clipboard_has_content(), ) .map(move |message| Message::TabMessage(Some(*entity), message)), - None => widget::vertical_space().into(), + None => widget::space::vertical().into(), }; tab_column = tab_column.push(tab_view); // The toaster is added on top of an empty element to ensure that it does not override context menus tab_column = - tab_column.push(widget::toaster(&self.toasts, widget::horizontal_space())); + tab_column.push(widget::toaster(&self.toasts, widget::space::horizontal())); return if let Some(margin) = self.margin.get(&id) { if margin.0 >= 0. || margin.2 >= 0. { tab_column = widget::column::with_children([ - vertical_space().height(margin.0).into(), + space::vertical().height(margin.0).into(), tab_column.into(), - vertical_space().height(margin.2).into(), + space::vertical().height(margin.2).into(), ]); } if margin.1 >= 0. || margin.3 >= 0. { Element::from(widget::row::with_children([ - horizontal_space().width(margin.1).into(), + space::horizontal().width(margin.1).into(), tab_column.into(), - horizontal_space().width(margin.3).into(), + space::horizontal().width(margin.3).into(), ])) } else { tab_column.into() @@ -6289,7 +6297,7 @@ impl Application for App { WindowKind::DesktopViewOptions => self.desktop_view_options(), WindowKind::Dialogs(id) => match self.dialog() { Some(element) => return widget::autosize::autosize(element, id.clone()).into(), - None => widget::horizontal_space().into(), + None => widget::space::horizontal().into(), }, WindowKind::Preview(entity_opt, kind) => self .preview(entity_opt, kind, false) @@ -6309,11 +6317,14 @@ impl Application for App { } }; - widget::container(widget::scrollable(content)) - .width(Length::Fill) - .height(Length::Fill) - .class(theme::Container::WindowBackground) - .into() + widget::container(widget::id_container( + widget::scrollable(content), + widget::Id::new("main container for files"), + )) + .width(Length::Fill) + .height(Length::Fill) + .class(theme::Container::WindowBackground) + .into() } fn system_theme_update( @@ -6403,20 +6414,21 @@ impl Application for App { } Message::TimeConfigChange(update.config) }), - Subscription::run_with_id( - TypeId::of::(), - stream::channel(100, |mut output| async move { - let watcher_res = { - let mut output = output.clone(); - new_debouncer( - time::Duration::from_millis(250), - Some(time::Duration::from_millis(250)), - move |events_res: notify_debouncer_full::DebounceEventResult| { - match events_res { - Ok(mut events) => { - log::debug!("{events:?}"); + Subscription::run_with(TypeId::of::(), |_| { + stream::channel( + 100, + |mut output: futures::channel::mpsc::Sender| async move { + let watcher_res = { + let mut output = output.clone(); + new_debouncer( + time::Duration::from_millis(250), + Some(time::Duration::from_millis(250)), + move |events_res: notify_debouncer_full::DebounceEventResult| { + match events_res { + Ok(mut events) => { + log::debug!("{events:?}"); - events.retain(|event| { + events.retain(|event| { match &event.kind { notify::EventKind::Access(_) => { // Data not mutated @@ -6435,190 +6447,196 @@ impl Application for App { } }); - if !events.is_empty() { - match futures::executor::block_on(async { - output.send(Message::NotifyEvents(events)).await - }) { - Ok(()) => {} - Err(err) => { - log::warn!( - "failed to send notify events: {err:?}" - ); + if !events.is_empty() { + match futures::executor::block_on(async { + output.send(Message::NotifyEvents(events)).await + }) { + Ok(()) => {} + Err(err) => { + log::warn!( + "failed to send notify events: {err:?}" + ); + } } } } + Err(err) => { + log::warn!("failed to watch files: {err:?}"); + } } + }, + ) + }; + + match watcher_res { + Ok(watcher) => { + match output + .send(Message::NotifyWatcher(WatcherWrapper { + watcher_opt: Some(watcher), + })) + .await + { + Ok(()) => {} Err(err) => { - log::warn!("failed to watch files: {err:?}"); + log::warn!("failed to send notify watcher: {err:?}"); + } + } + } + Err(err) => { + log::warn!("failed to create file watcher: {err:?}"); + } + } + + std::future::pending().await + }, + ) + }), + Subscription::run_with(TypeId::of::(), |_| { + stream::channel( + 1, + |mut output: futures::channel::mpsc::Sender| async move { + let watcher_res = new_debouncer( + time::Duration::from_millis(250), + Some(time::Duration::from_millis(250)), + move |event_res: notify_debouncer_full::DebounceEventResult| { + match event_res { + Ok(events) => { + // Rescan on any event. We don't need to evaluate each event + // because as long as the trash changed in any way we need to + // rescan. + let should_rescan = + events.iter().any(|event| !event.kind.is_access()); + + if should_rescan + && let Err(e) = futures::executor::block_on(async { + output.send(Message::RescanTrash).await + }) + { + log::warn!( + "trash needs to be rescanned but sending message failed: {e:?}" + ); + } + } + Err(e) => { + log::warn!("failed to watch trash bin for changes: {e:?}"); } } }, - ) - }; - - match watcher_res { - Ok(watcher) => { - match output - .send(Message::NotifyWatcher(WatcherWrapper { - watcher_opt: Some(watcher), - })) - .await - { - Ok(()) => {} - Err(err) => { - log::warn!("failed to send notify watcher: {err:?}"); - } - } - } - Err(err) => { - log::warn!("failed to create file watcher: {err:?}"); - } - } - - std::future::pending().await - }), - ), - Subscription::run_with_id( - TypeId::of::(), - stream::channel(1, |mut output| async move { - let watcher_res = new_debouncer( - time::Duration::from_millis(250), - Some(time::Duration::from_millis(250)), - move |event_res: notify_debouncer_full::DebounceEventResult| match event_res - { - Ok(events) => { - // Rescan on any event. We don't need to evaluate each event - // because as long as the trash changed in any way we need to - // rescan. - let should_rescan = - events.iter().any(|event| !event.kind.is_access()); - - if should_rescan - && let Err(e) = futures::executor::block_on(async { - output.send(Message::RescanTrash).await - }) - { - log::warn!( - "trash needs to be rescanned but sending message failed: {e:?}" - ); - } - } - Err(e) => { - log::warn!("failed to watch trash bin for changes: {e:?}"); - } - }, - ); - - // TODO: Trash watching support for Windows, macOS, and other OSes - #[cfg(all( - unix, - not(target_os = "macos"), - not(target_os = "ios"), - not(target_os = "android") - ))] - match (watcher_res, trash::os_limited::trash_folders()) { - (Ok(mut watcher), Ok(trash_bins)) => { - // Watch the "bins" themselves as well as the files folder where - // trashed items are placed. This allows us to avoid recursively - // watching the trash which is slow but also properly get events. - let trash_paths = trash_bins - .into_iter() - .flat_map(|path| [path.join("files"), path]); - for path in trash_paths { - if let Err(e) = - watcher.watch(&path, notify::RecursiveMode::NonRecursive) - { - log::warn!( - "failed to add trash bin `{}` to watcher: {e:?}", - path.display() - ); - } - } - - // Don't drop the watcher - std::future::pending().await - } - (Err(e), _) => { - log::warn!("failed to create new watcher for trash bin: {e:?}"); - } - (_, Err(e)) => { - log::warn!("could not find any valid trash bins to watch: {e:?}"); - } - } - - std::future::pending().await - }), - ), - ]; - - #[cfg(all( - not(feature = "desktop-applet"), - not(target_os = "ios"), - not(target_os = "android") - ))] - if self.config.show_recents { - subscriptions.push(Subscription::run_with_id( - TypeId::of::(), - stream::channel(1, |mut output| async move { - let Some(recents_path) = recently_used_xbel::dir() else { - log::warn!( - "failed to watch recents changes: .recently_used.xbel does not exist" ); - return std::future::pending().await; - }; - let watcher_res = new_debouncer( - time::Duration::from_millis(250), - Some(time::Duration::from_millis(250)), - move |event_res: notify_debouncer_full::DebounceEventResult| match event_res - { - Ok(events) => { - // Programs differ in how they modify the recents file so the - // rescan is triggered on any event but access. - if events.iter().any(|event| { - let kind = event.kind; - kind.is_create() - || kind.is_modify() - || kind.is_remove() - || kind.is_other() - }) && let Err(e) = futures::executor::block_on(async { - output.send(Message::RescanRecents).await - }) { + // TODO: Trash watching support for Windows, macOS, and other OSes + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_os = "ios"), + not(target_os = "android") + ))] + match (watcher_res, trash::os_limited::trash_folders()) { + (Ok(mut watcher), Ok(trash_bins)) => { + // Watch the "bins" themselves as well as the files folder where + // trashed items are placed. This allows us to avoid recursively + // watching the trash which is slow but also properly get events. + let trash_paths = trash_bins + .into_iter() + .flat_map(|path| [path.join("files"), path]); + for path in trash_paths { + if let Err(e) = + watcher.watch(&path, notify::RecursiveMode::NonRecursive) + { + log::warn!( + "failed to add trash bin `{}` to watcher: {e:?}", + path.display() + ); + } + } + + // Don't drop the watcher + std::future::pending().await + } + (Err(e), _) => { + log::warn!("failed to create new watcher for trash bin: {e:?}"); + } + (_, Err(e)) => { + log::warn!("could not find any valid trash bins to watch: {e:?}"); + } + } + + std::future::pending().await + }, + ) + }), + #[cfg(all( + not(feature = "desktop-applet"), + not(target_os = "ios"), + not(target_os = "android") + ))] + Subscription::run_with(TypeId::of::(), |_| { + stream::channel( + 1, + |mut output: futures::channel::mpsc::Sender| async move { + let Some(recents_path) = recently_used_xbel::dir() else { + log::warn!( + "failed to watch recents changes: .recently_used.xbel does not exist" + ); + return std::future::pending().await; + }; + + let watcher_res = new_debouncer( + time::Duration::from_millis(250), + Some(time::Duration::from_millis(250)), + move |event_res: notify_debouncer_full::DebounceEventResult| { + match event_res { + Ok(events) => { + // Programs differ in how they modify the recents file so the + // rescan is triggered on any event but access. + if events.iter().any(|event| { + let kind = event.kind; + kind.is_create() + || kind.is_modify() + || kind.is_remove() + || kind.is_other() + }) && let Err(e) = futures::executor::block_on(async { + output.send(Message::RescanRecents).await + }) { + log::warn!( + "open recents tabs need to be updated but sending message failed: {e:?}" + ); + } + } + Err(e) => { + log::warn!( + "failed to watch recents file for changes: {e:?}" + ) + } + } + }, + ); + + match watcher_res { + Ok(mut watcher) => { + if let Err(e) = watcher + .watch(&recents_path, notify::RecursiveMode::NonRecursive) + { log::warn!( - "open recents tabs need to be updated but sending message failed: {e:?}" + "failed to add recents file `{}` to watcher: {}", + recents_path.display(), + e ); } + + // Don't drop the watcher. + std::future::pending::<()>().await; } Err(e) => { - log::warn!("failed to watch recents file for changes: {e:?}") + log::warn!("failed to create new watcher for recents file: {e:?}") } - }, - ); - - match watcher_res { - Ok(mut watcher) => { - if let Err(e) = - watcher.watch(&recents_path, notify::RecursiveMode::NonRecursive) - { - log::warn!( - "failed to add recents file `{}` to watcher: {}", - recents_path.display(), - e - ); - } - - // Don't drop the watcher. - std::future::pending::<()>().await; } - Err(e) => { - log::warn!("failed to create new watcher for recents file: {e:?}") - } - } - std::future::pending().await - }), - )); - } + std::future::pending().await + }, + ) + }), + ]; if let Some(scroll_speed) = self.auto_scroll_speed { subscriptions.push( @@ -6663,38 +6681,44 @@ impl Application for App { // Handle notification when window is closed and operations are in progress #[cfg(feature = "notify")] { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] struct NotificationSubscription; - subscriptions.push(Subscription::run_with_id( + subscriptions.push(Subscription::run_with( TypeId::of::(), - stream::channel(1, move |msg_tx| async move { - let msg_tx = Arc::new(tokio::sync::Mutex::new(msg_tx)); - tokio::task::spawn_blocking(move || { - match notify_rust::Notification::new() - .summary(&fl!("notification-in-progress")) - .timeout(notify_rust::Timeout::Never) - .show() - { - Ok(notification) => { - let _ = futures::executor::block_on(async { - msg_tx - .lock() - .await - .send(Message::Notification(Arc::new(Mutex::new( - notification, - )))) - .await - }); - } - Err(err) => { - log::warn!("failed to create notification: {err}"); - } - } - }) - .await - .unwrap(); + |_| { + stream::channel( + 1, + move |msg_tx: futures::channel::mpsc::Sender<_>| async move { + let msg_tx = Arc::new(tokio::sync::Mutex::new(msg_tx)); + tokio::task::spawn_blocking(move || { + match notify_rust::Notification::new() + .summary(&fl!("notification-in-progress")) + .timeout(notify_rust::Timeout::Never) + .show() + { + Ok(notification) => { + let _ = futures::executor::block_on(async { + msg_tx + .lock() + .await + .send(Message::Notification(Arc::new( + Mutex::new(notification), + ))) + .await + }); + } + Err(err) => { + log::warn!("failed to create notification: {err}"); + } + } + }) + .await + .unwrap(); - std::future::pending().await - }), + std::future::pending().await + }, + ) + }, )); } } diff --git a/src/dialog.rs b/src/dialog.rs index f1c9395..6f0e5cb 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -16,6 +16,7 @@ use cosmic::{ window, }, iced_core::widget::operation, + iced_widget::scrollable::AbsoluteOffset, iced_winit::{self, SurfaceIdWrapper}, theme, widget::{ @@ -202,7 +203,8 @@ impl> From for DialogLabel { impl<'a, M: Clone + 'static> From<&'a DialogLabel> for Element<'a, M> { fn from(label: &'a DialogLabel) -> Self { - let mut iced_spans = Vec::with_capacity(label.spans.len()); + let mut iced_spans: Vec> = + Vec::with_capacity(label.spans.len()); for span in &label.spans { iced_spans.push(cosmic::iced::widget::span(&span.text).underline(span.underline)); } @@ -615,10 +617,13 @@ impl App { for (choice_i, choice) in self.choices.iter().enumerate() { match choice { DialogChoice::CheckBox { label, value, .. } => { - row = - row.push(widget::checkbox(label, *value).on_toggle(move |checked| { - Message::Choice(choice_i, usize::from(checked)) - })); + row = row.push( + widget::checkbox(*value) + .label(label) + .on_toggle(move |checked| { + Message::Choice(choice_i, usize::from(checked)) + }), + ); } DialogChoice::ComboBox { label, @@ -640,7 +645,7 @@ impl App { .align_y(Alignment::Center) .spacing(space_xxs); } - row = row.push(widget::horizontal_space()); + row = row.push(widget::space::horizontal()); row = row.push(widget::button::standard(fl!("cancel")).on_press(Message::Cancel)); let mut has_selected = false; @@ -1103,7 +1108,7 @@ impl Application for App { .find(|item| item.selected) .map(|item| item.preview_actions().map(Message::TabMessage)) }) - .unwrap_or_else(|| widget::horizontal_space().into()); + .unwrap_or_else(|| widget::space::horizontal().into()); Some( context_drawer::context_drawer( self.preview(kind).map(Message::TabMessage), @@ -1289,8 +1294,7 @@ impl Application for App { } Some(Element::from( - // XXX both must be shrink to avoid flex layout from ignoring it - nav.width(Length::Shrink).height(Length::Shrink), + nav.width(Length::Shrink).height(Length::Fill), )) } @@ -1506,7 +1510,10 @@ impl Application for App { if let Some(offset) = self.tab.select_focus_scroll() { return scrollable::scroll_to( self.tab.scrollable_id.clone(), - offset, + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, ); } } @@ -2076,18 +2083,18 @@ impl Application for App { } Message::TimeConfigChange(update.config) }), - Subscription::run_with_id( - TypeId::of::(), - stream::channel(100, |mut output| async move { - let watcher_res = { - let mut output = output.clone(); - new_debouncer( - time::Duration::from_millis(250), - Some(time::Duration::from_millis(250)), - move |events_res: notify_debouncer_full::DebounceEventResult| { - match events_res { - Ok(mut events) => { - events.retain(|event| { + Subscription::run_with(TypeId::of::(), |_| { + stream::channel(100, { + |mut output: futures::channel::mpsc::Sender<_>| async move { + let watcher_res = { + let mut output = output.clone(); + new_debouncer( + time::Duration::from_millis(250), + Some(time::Duration::from_millis(250)), + move |events_res: notify_debouncer_full::DebounceEventResult| { + match events_res { + Ok(mut events) => { + events.retain(|event| { match &event.kind { notify::EventKind::Access(_) => { // Data not mutated @@ -2106,49 +2113,50 @@ impl Application for App { } }); - if !events.is_empty() { - match futures::executor::block_on(async { - output.send(Message::NotifyEvents(events)).await - }) { - Ok(()) => {} - Err(err) => { - log::warn!( - "failed to send notify events: {err:?}" - ); + if !events.is_empty() { + match futures::executor::block_on(async { + output.send(Message::NotifyEvents(events)).await + }) { + Ok(()) => {} + Err(err) => { + log::warn!( + "failed to send notify events: {err:?}" + ); + } } } } + Err(err) => { + log::warn!("failed to watch files: {err:?}"); + } } - Err(err) => { - log::warn!("failed to watch files: {err:?}"); - } - } - }, - ) - }; + }, + ) + }; - match watcher_res { - Ok(watcher) => { - match output - .send(Message::NotifyWatcher(WatcherWrapper { - watcher_opt: Some(watcher), - })) - .await - { - Ok(()) => {} - Err(err) => { - log::warn!("failed to send notify watcher: {err:?}"); + match watcher_res { + Ok(watcher) => { + match output + .send(Message::NotifyWatcher(WatcherWrapper { + watcher_opt: Some(watcher), + })) + .await + { + Ok(()) => {} + Err(err) => { + log::warn!("failed to send notify watcher: {err:?}"); + } } } + Err(err) => { + log::warn!("failed to create file watcher: {err:?}"); + } } - Err(err) => { - log::warn!("failed to create file watcher: {err:?}"); - } - } - std::future::pending().await - }), - ), + std::future::pending().await + } + }) + }), self.tab .subscription( self.core.window.show_context diff --git a/src/key_bind.rs b/src/key_bind.rs index 3736a7c..8340580 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -24,7 +24,6 @@ pub fn key_binds(mode: &tab::Mode) -> HashMap { } // Common keys - bind!([], Key::Named(Named::Space), Gallery); bind!([], Key::Named(Named::ArrowDown), ItemDown); bind!([], Key::Named(Named::ArrowLeft), ItemLeft); bind!([], Key::Named(Named::ArrowRight), ItemRight); @@ -40,7 +39,9 @@ pub fn key_binds(mode: &tab::Mode) -> HashMap { bind!([Shift], Key::Named(Named::End), SelectLast); bind!([Ctrl, Shift], Key::Character("n".into()), NewFolder); bind!([], Key::Named(Named::Enter), Open); - bind!([Ctrl], Key::Named(Named::Space), Preview); + bind!([Ctrl], Key::Character(" ".into()), Preview); + bind!([], Key::Character(" ".into()), Gallery); + bind!([Ctrl], Key::Character("h".into()), ToggleShowHidden); bind!([Ctrl], Key::Character("a".into()), SelectAll); bind!([Ctrl], Key::Character("=".into()), ZoomIn); diff --git a/src/lib.rs b/src/lib.rs index 0489098..159af08 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,7 @@ pub mod config; pub mod dialog; mod key_bind; pub(crate) mod large_image; +pub(crate) mod load_image; mod localize; mod menu; mod mime_app; diff --git a/src/load_image.rs b/src/load_image.rs new file mode 100644 index 0000000..00e9bdf --- /dev/null +++ b/src/load_image.rs @@ -0,0 +1,219 @@ +use cosmic::{iced_core, iced_widget}; +use iced_core::event::Event; +use iced_core::layout; +use iced_core::mouse; +use iced_core::overlay; +use iced_core::renderer; +use iced_core::widget::{Operation, Tree}; +use iced_core::{Clipboard, Element, Layout, Length, Rectangle, Shell, Vector, Widget}; + +pub fn loaded_image<'a, Message: 'static, Theme>( + handle: ::Handle, +) -> LoadedImage<'a, Message, Theme, cosmic::Renderer> +where + Theme: iced_widget::container::Catalog, + ::Class<'a>: From>, +{ + LoadedImage::new(handle) +} + +/// Forces the wrapped image to be loaded before drawing. +/// +/// May cause a dropped frame if the image is not already in the cache. +/// This is useful when you want to ensure an image is loaded before it is drawn, for example when swapping out a placeholder. +/// Otherwise, the image may be blank until the next redraw. +#[allow(missing_debug_implementations)] +pub struct LoadedImage<'a, Message, Theme, Renderer> +where + Renderer: iced_core::Renderer + iced_core::image::Renderer, +{ + handle: ::Handle, + content: cosmic::iced::Element<'a, Message, Theme, Renderer>, +} + +impl<'a, Message, Theme, Renderer> LoadedImage<'a, Message, Theme, Renderer> +where + Renderer: iced_core::Renderer + iced_core::image::Renderer, + ::Handle: 'a, +{ + /// Creates an empty [`LoadedImage`]. + pub(crate) fn new(handle: ::Handle) -> Self { + LoadedImage { + handle: handle.clone(), + content: cosmic::widget::Image::new(handle).into(), + } + } +} + +impl Widget + for LoadedImage<'_, Message, Theme, Renderer> +where + Renderer: iced_core::Renderer + iced_core::image::Renderer, +{ + fn children(&self) -> Vec { + vec![Tree::new(&self.content)] + } + + fn diff(&mut self, tree: &mut Tree) { + tree.diff_children(std::slice::from_mut(&mut self.content)); + } + + fn size(&self) -> iced_core::Size { + self.content.as_widget().size() + } + + fn layout( + &mut self, + tree: &mut Tree, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let node = self + .content + .as_widget_mut() + .layout(&mut tree.children[0], renderer, limits); + let size = node.size(); + layout::Node::with_children(size, vec![node]) + } + + fn operate( + &mut self, + tree: &mut Tree, + layout: Layout<'_>, + renderer: &Renderer, + operation: &mut dyn Operation, + ) { + operation.container(None, layout.bounds()); + operation.traverse(&mut |operation| { + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout + .children() + .next() + .unwrap() + .with_virtual_offset(layout.virtual_offset()), + renderer, + operation, + ); + }); + } + + fn update( + &mut self, + tree: &mut Tree, + event: &Event, + layout: Layout<'_>, + cursor_position: mouse::Cursor, + renderer: &Renderer, + clipboard: &mut dyn Clipboard, + shell: &mut Shell<'_, Message>, + viewport: &Rectangle, + ) { + self.content.as_widget_mut().update( + &mut tree.children[0], + event, + layout + .children() + .next() + .unwrap() + .with_virtual_offset(layout.virtual_offset()), + cursor_position, + renderer, + clipboard, + shell, + viewport, + ); + } + + fn mouse_interaction( + &self, + tree: &Tree, + layout: Layout<'_>, + cursor_position: mouse::Cursor, + viewport: &Rectangle, + renderer: &Renderer, + ) -> mouse::Interaction { + let content_layout = layout.children().next().unwrap(); + self.content.as_widget().mouse_interaction( + &tree.children[0], + content_layout.with_virtual_offset(layout.virtual_offset()), + cursor_position, + viewport, + renderer, + ) + } + + fn draw( + &self, + tree: &Tree, + renderer: &mut Renderer, + theme: &Theme, + renderer_style: &renderer::Style, + layout: Layout<'_>, + cursor_position: mouse::Cursor, + viewport: &Rectangle, + ) { + let content_layout = layout.children().next().unwrap(); + + // forces image to be loaded before drawing + _ = renderer.load_image(&self.handle); + self.content.as_widget().draw( + &tree.children[0], + renderer, + theme, + renderer_style, + content_layout.with_virtual_offset(layout.virtual_offset()), + cursor_position, + viewport, + ); + } + + fn overlay<'b>( + &'b mut self, + tree: &'b mut Tree, + layout: Layout<'b>, + renderer: &Renderer, + viewport: &Rectangle, + translation: Vector, + ) -> Option> { + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout + .children() + .next() + .unwrap() + .with_virtual_offset(layout.virtual_offset()), + renderer, + viewport, + translation, + ) + } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + renderer: &Renderer, + dnd_rectangles: &mut iced_core::clipboard::DndDestinationRectangles, + ) { + let content_layout = layout.children().next().unwrap(); + self.content.as_widget().drag_destinations( + &state.children[0], + content_layout.with_virtual_offset(layout.virtual_offset()), + renderer, + dnd_rectangles, + ); + } +} + +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> +where + Message: 'a, + Renderer: 'a + iced_core::Renderer + iced_core::image::Renderer, + Theme: 'a, +{ + fn from(c: LoadedImage<'a, Message, Theme, Renderer>) -> Element<'a, Message, Theme, Renderer> { + Element::new(c) + } +} diff --git a/src/menu.rs b/src/menu.rs index eda7588..d025a0f 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -9,9 +9,9 @@ use cosmic::{ }, theme, widget::{ - self, Row, button, column, container, divider, horizontal_space, + self, Row, button, column, container, divider, menu::{self, ItemHeight, ItemWidth, MenuBar, key_bind::KeyBind}, - responsive_menu_bar, text, + responsive_menu_bar, space, text, }, }; use i18n_embed::LanguageLoader; @@ -88,7 +88,7 @@ pub fn context_menu<'a>( let key = find_key(&action); menu_button!( text::body(label), - horizontal_space(), + space::horizontal(), text::body(key).class(theme::Text::Custom(key_style)) ) .on_press(tab::Message::ContextAction(action)) @@ -98,7 +98,7 @@ pub fn context_menu<'a>( let key = find_key(&action); menu_button!( text::body(label).class(theme::Text::Custom(disabled_style)), - horizontal_space(), + space::horizontal(), text::body(key).class(theme::Text::Custom(disabled_style)) ) }; diff --git a/src/mounter/gvfs.rs b/src/mounter/gvfs.rs index 77fd4eb..cd4ea68 100644 --- a/src/mounter/gvfs.rs +++ b/src/mounter/gvfs.rs @@ -4,7 +4,7 @@ use cosmic::{ widget, }; use gio::{glib, prelude::*}; -use std::{any::TypeId, cell::Cell, future::pending, path::PathBuf, sync::Arc}; +use std::{any::TypeId, cell::Cell, future::pending, hash::Hash, path::PathBuf, sync::Arc}; use tokio::sync::{Mutex, mpsc}; use super::{Mounter, MounterAuth, MounterItem, MounterItems, MounterMessage}; @@ -668,32 +668,56 @@ impl Mounter for Gvfs { fn subscription(&self) -> Subscription { let command_tx = self.command_tx.clone(); let event_rx = self.event_rx.clone(); - Subscription::run_with_id( - TypeId::of::(), - stream::channel(1, |mut output| async move { - command_tx.send(Cmd::Rescan).unwrap(); - while let Some(event) = event_rx.lock().await.recv().await { - match event { - Event::Changed => command_tx.send(Cmd::Rescan).unwrap(), - Event::Items(items) => { - output.send(MounterMessage::Items(items)).await.unwrap(); + struct Wrapper { + command_tx: mpsc::UnboundedSender, + event_rx: Arc>>, + } + impl Hash for Wrapper { + fn hash(&self, state: &mut H) { + TypeId::of::().hash(state); + } + } + Subscription::run_with( + Wrapper { + command_tx, + event_rx, + }, + |Wrapper { + command_tx, + event_rx, + }| { + let command_tx = command_tx.clone(); + let event_rx = event_rx.clone(); + stream::channel( + 1, + move |mut output: cosmic::iced::futures::channel::mpsc::Sender< + MounterMessage, + >| async move { + command_tx.send(Cmd::Rescan).unwrap(); + while let Some(event) = event_rx.lock().await.recv().await { + match event { + Event::Changed => command_tx.send(Cmd::Rescan).unwrap(), + Event::Items(items) => { + output.send(MounterMessage::Items(items)).await.unwrap(); + } + Event::MountResult(item, res) => output + .send(MounterMessage::MountResult(item, res)) + .await + .unwrap(), + Event::NetworkAuth(uri, auth, auth_tx) => output + .send(MounterMessage::NetworkAuth(uri, auth, auth_tx)) + .await + .unwrap(), + Event::NetworkResult(uri, res) => output + .send(MounterMessage::NetworkResult(uri, res)) + .await + .unwrap(), + } } - Event::MountResult(item, res) => output - .send(MounterMessage::MountResult(item, res)) - .await - .unwrap(), - Event::NetworkAuth(uri, auth, auth_tx) => output - .send(MounterMessage::NetworkAuth(uri, auth, auth_tx)) - .await - .unwrap(), - Event::NetworkResult(uri, res) => output - .send(MounterMessage::NetworkResult(uri, res)) - .await - .unwrap(), - } - } - pending().await - }), + pending().await + }, + ) + }, ) } } diff --git a/src/mouse_area.rs b/src/mouse_area.rs index 173800c..dea4b25 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -8,7 +8,7 @@ use cosmic::{ iced_core::{ Clipboard, Color, Layout, Length, Point, Rectangle, Shell, Size, Vector, Widget, border::Border, - event::{self, Event}, + event::Event, layout, mouse::{self, click}, overlay, @@ -345,51 +345,52 @@ where } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { self.content - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &Renderer, operation: &mut dyn Operation, ) { self.content - .as_widget() + .as_widget_mut() .operate(&mut tree.children[0], layout, renderer, operation); } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { - if self.content.as_widget_mut().on_event( + ) { + self.content.as_widget_mut().update( &mut tree.children[0], - event.clone(), + event, layout, cursor, renderer, clipboard, shell, viewport, - ) == event::Status::Captured - { - return event::Status::Captured; + ); + + if shell.is_event_captured() { + return; } update( @@ -400,7 +401,7 @@ where shell, tree.state.downcast_mut::(), viewport, - ) + ); } fn mouse_interaction( @@ -468,13 +469,18 @@ where fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { - self.content - .as_widget_mut() - .overlay(&mut tree.children[0], layout, renderer, translation) + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) } fn drag_destinations( @@ -522,7 +528,7 @@ fn update( shell: &mut Shell<'_, Message>, state: &mut State, viewport: &Rectangle, -) -> event::Status { +) { let offset = layout.virtual_offset(); let layout_bounds = layout.bounds(); @@ -590,7 +596,7 @@ fn update( } if state.drag_initiated.is_none() && !cursor.is_over(layout_bounds) { - return event::Status::Ignored; + return; } if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) @@ -620,7 +626,8 @@ fn update( } if widget.on_press.is_some() { - return event::Status::Captured; + shell.capture_event(); + return; } } @@ -653,13 +660,14 @@ fn update( { if !recent_click { state.prev_click = None; - return event::Status::Ignored; + return; } state.drag_initiated = None; if let Some(message) = widget.on_release.as_ref() { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } } @@ -681,9 +689,10 @@ fn update( shell.publish(message(point_opt)); if widget.on_right_press_no_capture { - return event::Status::Ignored; + return; } - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_right_release.as_ref() @@ -694,7 +703,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_middle_press.as_ref() @@ -705,7 +715,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_middle_release.as_ref() @@ -716,7 +727,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_back_press.as_ref() @@ -727,7 +739,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_back_release.as_ref() @@ -738,7 +751,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_forward_press.as_ref() @@ -749,7 +763,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(message) = widget.on_forward_release.as_ref() @@ -760,7 +775,8 @@ fn update( { shell.publish(message(cursor.position_in(layout_bounds))); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some(on_scroll) = widget.on_scroll.as_ref() @@ -768,7 +784,8 @@ fn update( && let Some(message) = on_scroll(*delta) { shell.publish(message); - return event::Status::Captured; + shell.capture_event(); + return; } if let Some((message, drag_rect)) = widget.on_drag.as_ref().zip(state.drag_rect(cursor)) { @@ -780,6 +797,4 @@ fn update( }, ))); } - - event::Status::Ignored } diff --git a/src/tab.rs b/src/tab.rs index 6eafca0..d36aff0 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -4,16 +4,7 @@ use cosmic::{ desktop::fde::{DesktopEntry, get_languages_from_env}, font, iced::{ - Alignment, - Border, - Color, - ContentFit, - Length, - Point, - Rectangle, - Size, - Subscription, - Vector, + Alignment, Border, Color, ContentFit, Length, Point, Rectangle, Size, Subscription, Vector, advanced::{ graphics, text::{self, Paragraph}, @@ -23,11 +14,9 @@ use cosmic::{ event, futures::{self, SinkExt}, keyboard::Modifiers, - padding, - stream, - //TODO: export in cosmic::widget + padding, stream, widget::{ - horizontal_rule, rule, + rule, scrollable::{self, AbsoluteOffset, Viewport}, stack, }, @@ -36,8 +25,9 @@ use cosmic::{ iced_core::{mouse::ScrollDelta, widget::tree}, theme, widget::{ - self, DndDestination, DndSource, Id, Space, Widget, + self, DndDestination, DndSource, Id, RcElementWrapper, Space, Widget, menu::{action::MenuAction, key_bind::KeyBind}, + space, }, }; use i18n_embed::LanguageLoader; @@ -57,7 +47,7 @@ use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use std::{ borrow::Cow, - cell::{Cell, RefCell}, + cell::Cell, cmp::{Ordering, Reverse}, collections::{BTreeMap, HashMap}, error::Error, @@ -67,7 +57,6 @@ use std::{ io::{BufRead, BufReader}, os::unix::fs::MetadataExt, path::{self, Path, PathBuf}, - rc::Rc, sync::{Arc, LazyLock, RwLock, atomic}, time::{Duration, Instant, SystemTime}, }; @@ -2968,6 +2957,11 @@ impl Tab { } pub fn set_items(&mut self, mut items: Vec) { + let highlighted = self + .items_opt + .as_ref() + .and_then(|items| items.iter().enumerate().find(|i| i.1.highlighted)) + .map(|(i, _)| i); let selected = self.selected_locations(); for item in &mut items { item.selected = false; @@ -2978,6 +2972,12 @@ impl Tab { } } self.items_opt = Some(items); + if let Some(i) = highlighted + .zip(self.items_opt.as_mut()) + .and_then(|(h, items)| items.get_mut(h)) + { + i.highlighted = true; + } } pub fn cut_selected(&mut self) { @@ -3813,7 +3813,14 @@ impl Tab { } if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -3877,7 +3884,14 @@ impl Tab { } if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -3928,7 +3942,14 @@ impl Tab { } if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -3962,7 +3983,14 @@ impl Tab { } if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -4000,7 +4028,14 @@ impl Tab { } if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -4192,7 +4227,14 @@ impl Tab { && let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } @@ -4217,7 +4259,14 @@ impl Tab { Message::ScrollToFocused => { if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } } @@ -4293,7 +4342,14 @@ impl Tab { if self.select_position(0, 0, mod_shift) { if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -4308,7 +4364,14 @@ impl Tab { { if let Some(offset) = self.select_focus_scroll() { commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(offset.x), + y: Some(offset.y), + }, + ) + .into(), )); } if let Some(id) = self.select_focus_id() { @@ -4497,7 +4560,14 @@ impl Tab { let offset = AbsoluteOffset { x: 0.0, y: 0.0 }; self.scroll_opt = Some(offset); commands.push(Command::Iced( - scrollable::scroll_to(self.scrollable_id.clone(), offset).into(), + scrollable::scroll_to( + self.scrollable_id.clone(), + AbsoluteOffset { + x: Some(0.0), + y: Some(0.0), + }, + ) + .into(), )); } @@ -4796,7 +4866,7 @@ impl Tab { .into() } else { //TODO: use widget::image::viewer, when its zoom can be reset - widget::image(image_handle).into() + crate::load_image::loaded_image(image_handle).into() }; element_opt = Some(widget::container(content).center(Length::Fill).into()); @@ -4822,20 +4892,20 @@ impl Tab { } let mut column = widget::column::with_capacity(2); - column = column.push(widget::Space::with_height(Length::Fixed(space_m.into()))); + column = column.push(widget::space::vertical().height(Length::Fixed(space_m.into()))); { let mut row = widget::row::with_capacity(5).align_y(Alignment::Center); - row = row.push(widget::horizontal_space()); + row = row.push(widget::space::horizontal()); if let Some(name) = name_opt { row = row.push(name); } - row = row.push(widget::horizontal_space()); + row = row.push(widget::space::horizontal()); row = row.push( widget::button::icon(widget::icon::from_name("window-close-symbolic")) .class(theme::Button::Standard) .on_press(Message::Gallery(false)), ); - row = row.push(widget::Space::with_width(Length::Fixed(space_m.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_m.into()))); // This mouse area provides window drag while the header bar is hidden let mouse_area = mouse_area::MouseArea::new(row) .on_press(|_| Message::WindowDrag) @@ -4844,28 +4914,29 @@ impl Tab { } { let mut row = widget::row::with_capacity(7).align_y(Alignment::Center); - row = row.push(widget::Space::with_width(Length::Fixed(space_m.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_m.into()))); row = row.push( widget::button::icon(widget::icon::from_name("go-previous-symbolic")) .padding(space_xs) .class(theme::Button::Standard) .on_press(Message::GalleryPrevious), ); - row = row.push(widget::Space::with_width(Length::Fixed(space_xxs.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_xxs.into()))); if let Some(element) = element_opt { row = row.push(element); } else { //TODO: what to do when no image? - row = row.push(widget::Space::new(Length::Fill, Length::Fill)); + row = row.push(space::horizontal().width(Length::Fill)); + row = row.push(space::vertical().height(Length::Fill)); } - row = row.push(widget::Space::with_width(Length::Fixed(space_xxs.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_xxs.into()))); row = row.push( widget::button::icon(widget::icon::from_name("go-next-symbolic")) .padding(space_xs) .class(theme::Button::Standard) .on_press(Message::GalleryNext), ); - row = row.push(widget::Space::with_width(Length::Fixed(space_m.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_m.into()))); column = column.push(row); } @@ -4894,12 +4965,12 @@ impl Tab { ) -> f32 { let text: text::Text<&'a str, font::Font> = text::Text { content, - bounds: Size::INFINITY, + bounds: Size::INFINITE, size: font_size.into(), line_height: text::LineHeight::Absolute(line_height.into()), font, - horizontal_alignment: Horizontal::Left, - vertical_alignment: Vertical::Top, + align_x: text::Alignment::Left, + align_y: Vertical::Top, shaping: text::Shaping::default(), wrapping: text::Wrapping::None, ellipsize: text::Ellipsize::End(text::EllipsizeHeightLimit::Lines(1)), @@ -4951,7 +5022,7 @@ impl Tab { row = row.push(next_button); w += f32::from(space_xxs).mul_add(2.0, 16.0); - row = row.push(widget::Space::with_width(Length::Fixed(space_s.into()))); + row = row.push(widget::space::horizontal().width(Length::Fixed(space_s.into()))); w += f32::from(space_s); //TODO: allow resizing? @@ -5004,13 +5075,13 @@ impl Tab { .padding([0, space_xxs]); let accent_rule = - horizontal_rule(1).class(theme::Rule::Custom(Box::new(|theme| rule::Style { + rule::horizontal(1).class(theme::Rule::Custom(Box::new(|theme| rule::Style { color: theme.cosmic().accent_color().into(), - width: 1, radius: 0.0.into(), fill_mode: rule::FillMode::Full, + snap: true, }))); - let heading_rule = widget::container(horizontal_rule(1)) + let heading_rule = widget::container(rule::horizontal(1)) .padding([0, theme::active().cosmic().corner_radii.radius_xs[0] as u16]); if let Some(edit_location) = &self.edit_location { @@ -5549,9 +5620,9 @@ impl Tab { let spacer_height = height.saturating_sub(max_bottom + top_deduct); if spacer_height > 0 { - column = column.push(widget::container(Space::with_height(Length::Fixed( - spacer_height as f32, - )))); + column = column.push(widget::container( + space::vertical().height(Length::Fixed(spacer_height as f32)), + )); } } } @@ -5612,7 +5683,7 @@ impl Tab { dnd_item_i += 1; } else { dnd_grid = dnd_grid.push( - widget::container(Space::with_height(item_width as f32)) + widget::container(space::vertical().height(item_width as f32)) .height(Length::Fixed(item_height as f32)), ); } @@ -5701,7 +5772,7 @@ impl Tab { if count > 0 { column = column - .push(widget::container(horizontal_rule(1)).padding([0, rule_padding])); + .push(widget::container(rule::horizontal(1)).padding([0, rule_padding])); y += 1.0; } @@ -5899,7 +5970,9 @@ impl Tab { if item.selected || !drag_items.is_empty() { let dnd_row = if !item.selected { - Element::from(Space::with_height(Length::Fixed(f32::from(row_height)))) + Element::from( + space::vertical().height(Length::Fixed(f32::from(row_height))), + ) } else if condensed { widget::row::with_children([ widget::icon::icon(item.icon_handle_list_condensed.clone()) @@ -6006,7 +6079,7 @@ impl Tab { let spacer_height = size.height - y - f32::from(top_deduct); if spacer_height > 0. { - column = column.push(widget::container(Space::with_height(spacer_height))); + column = column.push(widget::container(space::vertical().height(spacer_height))); } } let drag_col = (!drag_items.is_empty()) @@ -6075,7 +6148,7 @@ impl Tab { let view = self.config.view; let item_view = match drag_list { Some(drag_list) if self.selected_clicked => { - let drag_list = RcElementWrapper::(Rc::new(RefCell::new(drag_list))); + let drag_list = RcElementWrapper::new(drag_list); item_view .drag_content(move || { ClipboardCopy::new(crate::clipboard::ClipboardKind::Copy, &files) @@ -6132,11 +6205,17 @@ impl Tab { } if can_scroll { tab_column = tab_column.push( - widget::scrollable(popover) - .id(self.scrollable_id.clone()) - .on_scroll(Message::Scroll) - .width(Length::Fill) - .height(Length::Fill), + // FIXME: new responsive widget will remove the state from the scrollable + // id_container with custom id forces the state to be extracted in a diff + // pre-processing step + widget::id_container( + widget::scrollable(popover) + .id(self.scrollable_id.clone()) + .on_scroll(Message::Scroll) + .width(Length::Fill) + .height(Length::Fill), + widget::Id::new(format!("{}-scrollable", self.scrollable_id)), + ), ); } else { tab_column = tab_column.push(popover); @@ -6148,7 +6227,7 @@ impl Tab { { tab_column = tab_column.push( widget::layer_container(widget::row::with_children([ - widget::horizontal_space().into(), + widget::space::horizontal().into(), widget::button::standard(fl!("empty-trash")) .on_press(Message::EmptyTrash) .into(), @@ -6163,7 +6242,7 @@ impl Tab { Location::Network(uri, _display_name, _path) if uri == "network:///" => { tab_column = tab_column.push( widget::layer_container(widget::row::with_children([ - widget::horizontal_space().into(), + widget::space::horizontal().into(), widget::button::standard(fl!("add-network-drive")) .on_press(Message::AddNetworkDrive) .into(), @@ -6342,7 +6421,14 @@ impl Tab { clipboard_paste_available: bool, ) -> Element<'a, Message> { widget::responsive(move |size| { - self.view_responsive(key_binds, modifiers, size, clipboard_paste_available) + widget::id_container( + self.view_responsive(key_binds, modifiers, size, clipboard_paste_available), + Id::new(format!( + "tab-{}-{}", + self.scrollable_id, self.location_title + )), + ) + .into() }) .into() } @@ -6413,50 +6499,86 @@ impl Tab { (max_mb, max_jobs) }; - subscriptions.push(Subscription::run_with_id( - ("thumbnail", path.clone()), - stream::channel(1, move |mut output| async move { - let message = { - let path = path.clone(); + #[derive(Clone)] + struct Wrapper { + path: PathBuf, + metadata: ItemMetadata, + mime: mime::Mime, + effective_max_mb: u64, + effective_jobs: usize, + max_size: u64, + } - // Acquire semaphore permit - _ = THUMB_SEMAPHORE.acquire().await; + impl Hash for Wrapper { + fn hash(&self, state: &mut H) { + self.path.hash(state); + } + } - tokio::task::spawn_blocking(move || { - let start = Instant::now(); - let thumbnail = ItemThumbnail::new( - &path, - metadata, - mime, - THUMBNAIL_SIZE, - effective_max_mb, - effective_jobs, - max_size, - ); - log::debug!( - "thumbnailed {} in {:?}", - path.display(), - start.elapsed() - ); - Message::Thumbnail(path, thumbnail) - }) - .await - .unwrap() - }; + subscriptions.push(Subscription::run_with( + Wrapper { + path: path.clone(), + metadata, + mime, + effective_max_mb, + effective_jobs, + max_size, + }, + |wrapper| { + let Wrapper { + path, + metadata, + mime, + effective_max_mb, + effective_jobs, + max_size, + } = wrapper.clone(); + stream::channel( + 1, + move |mut output: futures::channel::mpsc::Sender<_>| async move { + let message = { + let path = path.clone(); - match output.send(message).await { - Ok(()) => {} - Err(err) => { - log::warn!( - "failed to send thumbnail for {}: {}", - path.display(), - err - ); - } - } + // Acquire semaphore permit + _ = THUMB_SEMAPHORE.acquire().await; - std::future::pending().await - }), + tokio::task::spawn_blocking(move || { + let start = Instant::now(); + let thumbnail = ItemThumbnail::new( + &path, + metadata, + mime, + THUMBNAIL_SIZE, + effective_max_mb, + effective_jobs, + max_size, + ); + log::debug!( + "thumbnailed {} in {:?}", + path.display(), + start.elapsed() + ); + Message::Thumbnail(path, thumbnail) + }) + .await + .unwrap() + }; + + match output.send(message).await { + Ok(()) => {} + Err(err) => { + log::warn!( + "failed to send thumbnail for {}: {}", + path.display(), + err + ); + } + } + + std::future::pending().await + }, + ) + }, )); } @@ -6481,51 +6603,63 @@ impl Tab { if let Some(path) = item.path_opt().cloned() { // Item must be calculating directory size if let DirSize::Calculating(controller) = &item.dir_size { - let controller = controller.clone(); - subscriptions.push(Subscription::run_with_id( - ("dir_size", path.clone()), - stream::channel(1, |mut output| async move { - let message = { - let start = Instant::now(); - match calculate_dir_size(&path, controller).await { - Ok(size) => { - log::debug!( - "calculated directory size of {} in {:?}", - path.display(), - start.elapsed() - ); - Message::DirectorySize( - path.clone(), - DirSize::Directory(size), - ) + struct Wrapper { + path: PathBuf, + controller: Controller, + } + impl Hash for Wrapper { + fn hash(&self, state: &mut H) { + self.path.hash(state); + } + } + subscriptions.push(Subscription::run_with( + Wrapper { path: path.clone(), controller: controller.clone() }, + |Wrapper { path, controller }| { + let path = path.clone(); + let controller = controller.clone(); + stream::channel(1, |mut output: futures::channel::mpsc::Sender<_>| async move { + let message = { + let start = Instant::now(); + match calculate_dir_size(&path, controller).await { + Ok(size) => { + log::debug!( + "calculated directory size of {} in {:?}", + path.display(), + start.elapsed() + ); + Message::DirectorySize( + path.clone(), + DirSize::Directory(size), + ) + } + Err(err) => { + log::warn!( + "failed to calculate directory size of {}: {}", + path.display(), + err + ); + Message::DirectorySize( + path.clone(), + DirSize::Error(err.to_string()), + ) + } } + }; + + match output.send(message).await { + Ok(()) => {} Err(err) => { log::warn!( - "failed to calculate directory size of {}: {}", + "failed to send directory size for {}: {}", path.display(), err ); - Message::DirectorySize( - path.clone(), - DirSize::Error(err.to_string()), - ) } } - }; - match output.send(message).await { - Ok(()) => {} - Err(err) => { - log::warn!( - "failed to send directory size for {}: {}", - path.display(), - err - ); - } - } - - std::future::pending().await - }), + std::future::pending().await + }) + } )); } } @@ -6540,85 +6674,116 @@ impl Tab { let term = term.clone(); let show_hidden = *show_hidden; let start = *start; - subscriptions.push(Subscription::run_with_id( - location.clone(), - stream::channel(2, move |mut output| async move { - //TODO: optimal size? - let (results_tx, results_rx) = mpsc::channel(65536); + #[derive(Debug, Hash, Clone)] + struct Wrapper { + location: Location, + search_location: SearchLocation, + term: String, + show_hidden: bool, + start: Instant, + } - let ready = Arc::new(atomic::AtomicBool::new(false)); - let last_modified_opt = Arc::new(RwLock::new(None)); - output - .send(Message::SearchContext( - location.clone(), - SearchContextWrapper(Some(SearchContext { - results_rx, - ready: ready.clone(), - last_modified_opt: last_modified_opt.clone(), - })), - )) - .await - .unwrap(); - - let output = Arc::new(tokio::sync::Mutex::new(output)); - { - let output = output.clone(); - tokio::task::spawn_blocking(move || { - scan_search( - &search_location, - &term, - show_hidden, - move |search_item| -> bool { - // Don't send if the result is too old - if let Some(last_modified) = *last_modified_opt.read().unwrap() - { - if let SearchItem::Path(_, _, ref metadata) = search_item { - if let Ok(modified) = metadata.modified() { - if modified < last_modified { - return true; - } - } else { - return true; - } - } - } - - match results_tx.blocking_send(search_item) { - Ok(()) => { - if ready.swap(true, atomic::Ordering::SeqCst) { - true - } else { - // Wake up update method - futures::executor::block_on(async { - output - .lock() - .await - .send(Message::SearchReady(false)) - .await - }) - .is_ok() - } - } - Err(_) => false, - } - }, - ); - log::info!( - "searched for {:?} in {} in {:?}", - term, + subscriptions.push(Subscription::run_with( + Wrapper { + location: location.clone(), + search_location: search_location.clone(), + term: term.clone(), + show_hidden, + start, + }, + |wrapper| { + let wrapper = wrapper.clone(); + stream::channel( + 2, + move |mut output: futures::channel::mpsc::Sender| async move { + let Wrapper { + location, search_location, - start.elapsed(), - ); - }) - .await - .unwrap(); - } + term, + show_hidden, + start, + } = wrapper; + //TODO: optimal size? + let (results_tx, results_rx) = mpsc::channel(65536); - // Send final ready - let _ = output.lock().await.send(Message::SearchReady(true)).await; + let ready = Arc::new(atomic::AtomicBool::new(false)); + let last_modified_opt = Arc::new(RwLock::new(None)); + output + .send(Message::SearchContext( + location.clone(), + SearchContextWrapper(Some(SearchContext { + results_rx, + ready: ready.clone(), + last_modified_opt: last_modified_opt.clone(), + })), + )) + .await + .unwrap(); - std::future::pending().await - }), + let output = Arc::new(tokio::sync::Mutex::new(output)); + { + let output = output.clone(); + tokio::task::spawn_blocking(move || { + scan_search( + &search_location, + &term, + show_hidden, + move |search_item| -> bool { + // Don't send if the result is too old + if let Some(last_modified) = + *last_modified_opt.read().unwrap() + { + if let SearchItem::Path(_, _, ref metadata) = + search_item + { + if let Ok(modified) = metadata.modified() { + if modified < last_modified { + return true; + } + } else { + return true; + } + } + } + + match results_tx.blocking_send(search_item) { + Ok(()) => { + if ready.swap(true, atomic::Ordering::SeqCst) { + true + } else { + // Wake up update method + futures::executor::block_on(async { + output + .lock() + .await + .send(Message::SearchReady(false)) + .await + }) + .is_ok() + } + } + Err(_) => false, + } + }, + ); + log::info!( + "searched for {:?} in {} in {:?}", + term, + search_location, + start.elapsed(), + ); + }) + .await + .unwrap(); + } + + // Send final ready + let _ = output.lock().await.send(Message::SearchReady(true)).await; + + std::future::pending().await + }, + ) + }, )); } @@ -6628,49 +6793,55 @@ impl Tab { .and_then(|x| x.location.path_opt()) .cloned() { - subscriptions.push(Subscription::run_with_id( - ("tab_complete", path.to_string_lossy().into_owned()), - stream::channel(1, |mut output| async move { - let message = { - let path = path.clone(); - tokio::task::spawn_blocking(move || { - let start = Instant::now(); - match tab_complete(&path) { - Ok(completions) => { - log::info!( - "tab completed {} in {:?}", - path.display(), - start.elapsed() - ); - Message::TabComplete(path.clone(), completions) - } + subscriptions.push(Subscription::run_with( + ("tab_complete", path.clone()), + |(_, path)| { + let path = path.clone(); + stream::channel( + 1, + |mut output: futures::channel::mpsc::Sender<_>| async move { + let message = { + let path = path.clone(); + tokio::task::spawn_blocking(move || { + let start = Instant::now(); + match tab_complete(&path) { + Ok(completions) => { + log::info!( + "tab completed {} in {:?}", + path.display(), + start.elapsed() + ); + Message::TabComplete(path.clone(), completions) + } + Err(err) => { + log::warn!( + "failed to tab complete {}: {}", + path.display(), + err + ); + Message::TabComplete(path.clone(), Vec::new()) + } + } + }) + .await + .unwrap() + }; + + match output.send(message).await { + Ok(()) => {} Err(err) => { log::warn!( - "failed to tab complete {}: {}", + "failed to send tab completion for {}: {}", path.display(), err ); - Message::TabComplete(path.clone(), Vec::new()) } } - }) - .await - .unwrap() - }; - match output.send(message).await { - Ok(()) => {} - Err(err) => { - log::warn!( - "failed to send tab completion for {}: {}", - path.display(), - err - ); - } - } - - std::future::pending().await - }), + std::future::pending().await + }, + ) + }, )); } @@ -6703,141 +6874,6 @@ pub fn respond_to_scroll_direction(delta: ScrollDelta, modifiers: &Modifiers) -> None } -#[derive(Clone)] -pub struct RcElementWrapper(pub Rc>>); - -impl Widget for RcElementWrapper { - fn size(&self) -> Size { - self.0.borrow().as_widget().size() - } - - fn size_hint(&self) -> Size { - self.0.borrow().as_widget().size_hint() - } - - fn layout( - &self, - tree: &mut tree::Tree, - renderer: &cosmic::Renderer, - limits: &cosmic::iced_core::layout::Limits, - ) -> cosmic::iced_core::layout::Node { - self.0.borrow().as_widget().layout(tree, renderer, limits) - } - - fn draw( - &self, - tree: &tree::Tree, - renderer: &mut cosmic::Renderer, - theme: &cosmic::Theme, - style: &cosmic::iced_core::renderer::Style, - layout: cosmic::iced_core::Layout<'_>, - cursor: cosmic::iced_core::mouse::Cursor, - viewport: &Rectangle, - ) { - self.0 - .borrow() - .as_widget() - .draw(tree, renderer, theme, style, layout, cursor, viewport); - } - - fn tag(&self) -> tree::Tag { - self.0.borrow().as_widget().tag() - } - - fn state(&self) -> tree::State { - self.0.borrow().as_widget().state() - } - - fn children(&self) -> Vec { - self.0.borrow().as_widget().children() - } - - fn diff(&mut self, tree: &mut tree::Tree) { - self.0.borrow_mut().as_widget_mut().diff(tree); - } - - fn operate( - &self, - state: &mut tree::Tree, - layout: cosmic::iced_core::Layout<'_>, - renderer: &cosmic::Renderer, - operation: &mut dyn widget::Operation, - ) { - self.0 - .borrow() - .as_widget() - .operate(state, layout, renderer, operation); - } - - fn on_event( - &mut self, - _state: &mut tree::Tree, - _event: cosmic::iced::Event, - _layout: cosmic::iced_core::Layout<'_>, - _cursor: cosmic::iced_core::mouse::Cursor, - _renderer: &cosmic::Renderer, - _clipboard: &mut dyn cosmic::iced_core::Clipboard, - _shell: &mut cosmic::iced_core::Shell<'_, M>, - _viewport: &Rectangle, - ) -> event::Status { - self.0.borrow_mut().as_widget_mut().on_event( - _state, _event, _layout, _cursor, _renderer, _clipboard, _shell, _viewport, - ) - } - - fn mouse_interaction( - &self, - _state: &tree::Tree, - _layout: cosmic::iced_core::Layout<'_>, - _cursor: cosmic::iced_core::mouse::Cursor, - _viewport: &Rectangle, - _renderer: &cosmic::Renderer, - ) -> cosmic::iced_core::mouse::Interaction { - self.0 - .borrow() - .as_widget() - .mouse_interaction(_state, _layout, _cursor, _viewport, _renderer) - } - - fn overlay<'a>( - &'a mut self, - _state: &'a mut tree::Tree, - _layout: cosmic::iced_core::Layout<'_>, - _renderer: &cosmic::Renderer, - _translation: cosmic::iced_core::Vector, - ) -> Option> { - // TODO - None - } - - fn id(&self) -> Option { - self.0.borrow().as_widget().id() - } - - fn set_id(&mut self, _id: Id) { - self.0.borrow_mut().as_widget_mut().set_id(_id); - } - - fn drag_destinations( - &self, - _state: &tree::Tree, - _layout: cosmic::iced_core::Layout<'_>, - renderer: &cosmic::Renderer, - _dnd_rectangles: &mut cosmic::iced_core::clipboard::DndDestinationRectangles, - ) { - self.0 - .borrow() - .as_widget() - .drag_destinations(_state, _layout, renderer, _dnd_rectangles); - } -} - -impl From> for Element<'static, Message> { - fn from(wrapper: RcElementWrapper) -> Self { - Element::new(wrapper) - } -} - fn text_editor_class( theme: &cosmic::Theme, status: cosmic::widget::text_editor::Status, @@ -6852,7 +6888,6 @@ fn text_editor_class( let mut placeholder = cosmic.palette.neutral_9; placeholder.alpha = 0.7; let placeholder = placeholder.into(); - let icon = cosmic.background.on.into(); match status { cosmic::iced_widget::text_editor::Status::Active @@ -6864,14 +6899,13 @@ fn text_editor_class( width: 2.0, color: container.component.divider.into(), }, - icon, placeholder, value, selection, } } cosmic::iced_widget::text_editor::Status::Hovered - | cosmic::iced_widget::text_editor::Status::Focused => { + | cosmic::iced_widget::text_editor::Status::Focused { .. } => { cosmic::iced_widget::text_editor::Style { background: background.into(), border: cosmic::iced::Border { @@ -6879,7 +6913,6 @@ fn text_editor_class( width: 2.0, color: cosmic::iced::Color::from(cosmic.accent.base), }, - icon, placeholder, value, selection,