diff --git a/Cargo.lock b/Cargo.lock index 92d1d9c..51f3695 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" version = "0.22.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "uuid", ] @@ -29,7 +29,7 @@ dependencies = [ [[package]] name = "accesskit_atspi_common" version = "0.15.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", @@ -41,7 +41,7 @@ dependencies = [ [[package]] name = "accesskit_consumer" version = "0.32.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "hashbrown 0.16.1", @@ -50,7 +50,7 @@ dependencies = [ [[package]] name = "accesskit_macos" version = "0.23.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", @@ -63,7 +63,7 @@ dependencies = [ [[package]] name = "accesskit_unix" version = "0.18.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_atspi_common", @@ -78,7 +78,7 @@ dependencies = [ [[package]] name = "accesskit_windows" version = "0.30.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", @@ -91,7 +91,7 @@ dependencies = [ [[package]] name = "accesskit_winit" version = "0.30.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_macos", @@ -109,13 +109,13 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" -version = "0.9.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" +checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" dependencies = [ "cipher", "cpubits", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", ] [[package]] @@ -198,7 +198,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.13.2", + "bitflags 2.13.1", "cc", "jni", "libc", @@ -529,7 +529,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -600,7 +600,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -658,12 +658,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" - [[package]] name = "basic-toml" version = "0.1.10" @@ -702,9 +696,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.2" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] @@ -776,9 +770,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.8.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" dependencies = [ "bytes", "cfg_aliases", @@ -859,13 +853,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.12.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -911,7 +905,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "polling", "rustix 1.1.4", "slab", @@ -932,9 +926,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.6" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "jobserver", @@ -1087,9 +1081,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" -version = "4.6.8" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -1234,9 +1228,9 @@ dependencies = [ [[package]] name = "configparser" -version = "3.3.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031ad3d167622974ed636505ae4556267ed4aa2aea0464122fa6bc9698a32825" +checksum = "b46dec724fd22199ebde05033a0cbae453bc3b1ecff11eb6a6bb3eec4b90c6a4" [[package]] name = "const-oid" @@ -1306,7 +1300,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "core-foundation 0.10.1", "libc", ] @@ -1335,7 +1329,7 @@ dependencies = [ name = "cosmic-client-toolkit" version = "0.2.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cosmic-protocols 0.2.0", "libc", "smithay-client-toolkit", @@ -1346,10 +1340,10 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ - "bitflags 2.13.2", - "cosmic-protocols 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "bitflags 2.13.1", + "cosmic-protocols 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", "libc", "smithay-client-toolkit", "wayland-client", @@ -1386,14 +1380,14 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.9.0" +version = "1.7.0" dependencies = [ "anyhow", "atomic_float", "bstr", "bzip2", "compio", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", "cosmic-mime-apps", "dirs 6.0.0", "fastrand", @@ -1455,21 +1449,13 @@ dependencies = [ [[package]] name = "cosmic-files-applet" -version = "1.9.0" +version = "1.7.0" dependencies = [ "cosmic-files", "log", "zbus 4.4.0", ] -[[package]] -name = "cosmic-files-thumbnailer" -version = "1.9.0" -dependencies = [ - "image", - "pelite", -] - [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" @@ -1498,7 +1484,7 @@ dependencies = [ name = "cosmic-protocols" version = "0.2.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1510,9 +1496,9 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1523,7 +1509,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" -version = "1.9.0" +version = "0.1.0" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1544,7 +1530,7 @@ dependencies = [ name = "cosmic-text" version = "0.19.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "fontdb", "harfrust", "linebender_resource_handle", @@ -1597,27 +1583,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.5.2" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.8" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1625,27 +1611,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.21" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.14" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.23" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1728,12 +1714,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.24.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.24.1", - "darling_macro 0.24.1", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -1752,15 +1738,15 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.24.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ "ident_case", "proc-macro2", "quote", "strsim", - "syn 3.0.5", + "syn 2.0.119", ] [[package]] @@ -1776,13 +1762,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.24.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.24.1", + "darling_core 0.23.0", "quote", - "syn 3.0.5", + "syn 2.0.119", ] [[package]] @@ -1791,15 +1777,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" -[[package]] -name = "dataview" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daba87f72c730b508641c9fb6411fc9bba73939eed2cab611c399500511880d0" -dependencies = [ - "derive_pod", -] - [[package]] name = "deflate64" version = "0.1.12" @@ -1846,12 +1823,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "derive_pod" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ea6706d74fca54e15f1d40b5cf7fe7f764aaec61352a9fcec58fe27e042fc8" - [[package]] name = "derive_setters" version = "0.1.9" @@ -1872,7 +1843,7 @@ checksum = "dc05a5d33db20c784f873e84934ad94bb209a090987ac5f62fede2c178234f23" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -1967,7 +1938,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -1981,7 +1952,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -1997,7 +1968,7 @@ dependencies = [ name = "dnd" version = "0.1.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit", @@ -2174,7 +2145,7 @@ dependencies = [ "bit_field", "half", "lebe", - "miniz_oxide 0.8.9", + "miniz_oxide", "num-complex", "pulp", "rayon-core", @@ -2233,9 +2204,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.12" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fixed_decimal" @@ -2250,12 +2221,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "miniz_oxide 0.9.1", + "miniz_oxide", "zlib-rs", ] @@ -2363,9 +2334,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.12.5" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8eb065f3251655b3c90e22e5e363f310fc5332fb3402e37bbc94752283248f6" +checksum = "e64eb721ca85a34323425f4041adc5d82704d3782d5f8f03793bc012419dce23" dependencies = [ "bytemuck", ] @@ -2411,7 +2382,7 @@ checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -2440,9 +2411,9 @@ dependencies = [ [[package]] name = "freedesktop-desktop-entry" -version = "0.8.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cfa09933e03f1ced380ad639822d65cb59a1914217da6c72aa8db3563e94214" +checksum = "28273c5c6b97a5f07724f6652f064c0c7f637f9aa5e7c09c83bc3bc4ad4ea245" dependencies = [ "bstr", "gettext-rs", @@ -2459,7 +2430,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6d3a3635983a889f065aa9ce760384713f23a9b4a04f696f86c39a5d7a6a5a" dependencies = [ - "indexmap 2.14.2", + "indexmap 2.14.0", "nom 8.0.0", ] @@ -2541,7 +2512,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -2636,9 +2607,9 @@ dependencies = [ [[package]] name = "gettext-rs" -version = "0.8.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df5e3fa8c077b15fdfa8ce130e2bc73d663b8aaa6d51b71421b8659980b1d80" +checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" dependencies = [ "gettext-sys", "locale_config", @@ -2646,9 +2617,9 @@ dependencies = [ [[package]] name = "gettext-sys" -version = "0.27.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caa7e4460b196107cc1bb2629488e8b6dbb7f34f6683ea6753c4ac22f590785" +checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" dependencies = [ "cc", "temp-dir", @@ -2727,7 +2698,7 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16de123c2e6c90ce3b573b7330de19be649080ec612033d397d72da265f1bd8b" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "futures-channel", "futures-core", "futures-executor", @@ -2836,7 +2807,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2847,7 +2818,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -2884,7 +2855,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "core_maths", "read-fonts 0.37.0", @@ -2937,9 +2908,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2975,9 +2946,9 @@ dependencies = [ [[package]] name = "hybrid-array" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] @@ -3106,7 +3077,7 @@ dependencies = [ name = "iced_core" version = "0.14.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "build_helpers", "bytes", "cosmic-client-toolkit 0.2.0", @@ -3153,7 +3124,7 @@ dependencies = [ name = "iced_graphics" version = "0.14.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cosmic-text", "half", @@ -3223,7 +3194,7 @@ dependencies = [ name = "iced_wgpu" version = "0.14.0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "build_helpers", "bytemuck", "cosmic-client-toolkit 0.2.0", @@ -3813,9 +3784,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "indexmap" @@ -3830,9 +3801,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.2" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -3855,7 +3826,7 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "inotify-sys", "libc", ] @@ -3910,11 +3881,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.15" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3bd0ecfbb87805f538bb7b32e5239ca0763890c623e349860ecba69469f2bb" +checksum = "d64d8ca234d152948ceaede1f419b6a83983a5ecccaac05fb337a809c96d3aa6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cfg-if", "libc", ] @@ -3978,9 +3949,9 @@ checksum = "4d3667095d64c3ecffc96463a21157b04bf3e252f6e8d5750b20c02e33c194e3" [[package]] name = "jiff" -version = "0.2.37" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" dependencies = [ "defmt", "jiff-core", @@ -3995,12 +3966,11 @@ dependencies = [ [[package]] name = "jiff-core" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" dependencies = [ "defmt", - "log", ] [[package]] @@ -4016,9 +3986,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.37" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" dependencies = [ "jiff-core", "proc-macro2", @@ -4111,9 +4081,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.105" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -4315,7 +4285,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "serde", ] @@ -4361,7 +4331,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", ] @@ -4450,7 +4420,6 @@ dependencies = [ "palette", "phf", "rfd", - "roxmltree", "rust-embed", "rustix 1.1.4", "serde", @@ -4493,14 +4462,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.24" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a" +checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", "plain", - "redox_syscall 0.9.4", + "redox_syscall 0.9.3", ] [[package]] @@ -4611,9 +4580,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.21" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" +checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" dependencies = [ "lyon_path", "num-traits", @@ -4642,9 +4611,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.22" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" +checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" dependencies = [ "float_next_after", "lyon_path", @@ -4751,7 +4720,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -4799,21 +4768,11 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "miniz_oxide" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "mio" -version = "1.2.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -4845,14 +4804,14 @@ checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.13.2", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "codespan-reporting", "half", "hashbrown 0.16.1", "hexf-parse", - "indexmap 2.14.2", + "indexmap 2.14.0", "libm", "log", "num-traits", @@ -4869,7 +4828,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "jni-sys 0.3.1", "log", "ndk-sys", @@ -4905,19 +4864,13 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", "memoffset", ] -[[package]] -name = "no-std-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" - [[package]] name = "no_std_io2" version = "0.9.4" @@ -4958,7 +4911,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "fsevent-sys", "inotify", "kqueue", @@ -5003,7 +4956,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -5165,7 +5118,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -5181,7 +5134,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -5194,7 +5147,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5206,7 +5159,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", "objc2 0.6.4", @@ -5218,7 +5171,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", "objc2-core-foundation", ] @@ -5241,7 +5194,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "objc2-core-foundation", "objc2-core-graphics", ] @@ -5258,7 +5211,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -5270,7 +5223,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -5283,7 +5236,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5295,7 +5248,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5308,7 +5261,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -5337,9 +5290,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "open" -version = "5.4.4" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +checksum = "ade3be4664bc1ef537ce133015f04c176b737815c2ba9fd60edf212d6e90dd55" dependencies = [ "is-wsl", "libc", @@ -5382,11 +5335,11 @@ dependencies = [ [[package]] name = "ordermap" -version = "1.2.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a756ddcdeb6c0efc8927bdf0ed112885815a35ba350472a467be5104f01ca1" +checksum = "7f7476a5b122ff1fce7208e7ee9dccd0a516e835f5b8b19b8f3c98a34cf757c1" dependencies = [ - "indexmap 2.14.2", + "indexmap 2.14.0", "serde", "serde_core", ] @@ -5516,25 +5469,6 @@ dependencies = [ "hmac", ] -[[package]] -name = "pelite" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88dccf4bd32294364aeb7bd55d749604450e9db54605887551f21baea7617685" -dependencies = [ - "dataview", - "libc", - "no-std-compat", - "pelite-macros", - "winapi", -] - -[[package]] -name = "pelite-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7cf3f8ecebb0f4895f4892a8be0a0dc81b498f9d56735cb769dc31bf00815b" - [[package]] name = "percent-encoding" version = "2.3.2" @@ -5657,7 +5591,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.9", + "miniz_oxide", ] [[package]] @@ -5666,11 +5600,11 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.9", + "miniz_oxide", ] [[package]] @@ -5701,9 +5635,9 @@ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -5727,9 +5661,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196a7c80b9a7652aba7cc070827516c2abe4ccdf53d128e1944003cf5726cff1" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "ppv-lite86" @@ -5757,9 +5691,9 @@ dependencies = [ [[package]] name = "proc-macro-error-attr3" -version = "3.1.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e564d14133360e1ae169ffde5da25881b5fa47261665b8e5713c212c27799da" +checksum = "b0084e6206a967a2dad822180626b2f6b07a3b379325e8f1ec0438e33a469ba7" dependencies = [ "proc-macro2", "quote", @@ -5767,14 +5701,14 @@ dependencies = [ [[package]] name = "proc-macro-error3" -version = "3.1.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0d4471b3436c22106b21913b1dda531558918ae9b7ec55d58aa84b43552233" +checksum = "0cf066225f2373bc711684792b69bdeac0356019b007e721090c24d92d5d5a50" dependencies = [ "proc-macro-error-attr3", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -5805,7 +5739,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "chrono", "flate2", "procfs-core", @@ -5818,7 +5752,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "chrono", "hex", ] @@ -6062,7 +5996,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -6109,7 +6043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ "bytemuck", - "font-types 0.12.5", + "font-types 0.12.4", "once_cell", ] @@ -6141,7 +6075,7 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5018d583d6d2f5499352aea8d177e9067d1eb03ab17c78169d5ba7a30001b15" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libredox", ] @@ -6151,16 +6085,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] name = "redox_syscall" -version = "0.9.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" +checksum = "d678d17679829e73d371e96880897e98fee2ded7acc0a50bdf8af2affa4b2fe5" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -6202,7 +6136,7 @@ checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -6296,8 +6230,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ - "base64 0.22.1", - "bitflags 2.13.2", + "base64", + "bitflags 2.13.1", "serde", "serde_derive", "unicode-ident", @@ -6309,7 +6243,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "once_cell", "serde", "serde_derive", @@ -6385,7 +6319,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6398,7 +6332,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -6417,7 +6351,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "core_maths", "log", @@ -6526,7 +6460,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -6535,7 +6469,7 @@ version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ - "indexmap 2.14.2", + "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -6551,7 +6485,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -6565,16 +6499,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.23.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935177bb8c0cd8ca1a4e6d1a2ac8988bea69cab4f9d3a31311e012ad27868ea4" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" dependencies = [ - "base64 0.23.1", + "base64", "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.14.2", + "indexmap 2.14.0", "jiff", "schemars 0.9.0", "schemars 1.2.2", @@ -6586,14 +6520,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.23.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d607aa01a3cb0ad757d6fd216136910db3c97b102fe686585689615a02dbcdc" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" dependencies = [ - "darling 0.24.1", + "darling 0.23.0", "proc-macro2", "quote", - "syn 3.0.5", + "syn 2.0.119", ] [[package]] @@ -6614,7 +6548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", "digest 0.11.3", ] @@ -6636,7 +6570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", "digest 0.11.3", ] @@ -6754,9 +6688,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.16.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smithay-client-toolkit" @@ -6764,7 +6698,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "calloop", "calloop-wayland-source", @@ -6858,7 +6792,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -6928,9 +6862,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -6976,7 +6910,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 1.1.6+spec-1.1.0", + "toml 1.1.4+spec-1.1.0", "version-compare", ] @@ -7123,7 +7057,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -7264,9 +7198,18 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.13.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" @@ -7293,7 +7236,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -7318,11 +7261,11 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.6+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ - "indexmap 2.14.2", + "indexmap 2.14.0", "serde_core", "serde_spanned", "toml_datetime", @@ -7342,11 +7285,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.15+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap 2.14.2", + "indexmap 2.14.0", "toml_datetime", "toml_parser", "winnow", @@ -7431,9 +7374,9 @@ dependencies = [ [[package]] name = "trash" -version = "5.2.9" +version = "5.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be89b3fe156965d29ac4f8522f3a640c655affdd9f21cb4f36857f0c92c00317" +checksum = "7602e0c7d66ec2d92a8c917219fbc7894039efa2063b9064260110828a356f46" dependencies = [ "chrono", "libc", @@ -7444,7 +7387,7 @@ dependencies = [ "percent-encoding", "scopeguard", "urlencoding", - "windows 0.62.2", + "windows 0.56.0", ] [[package]] @@ -7613,7 +7556,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ - "base64 0.22.1", + "base64", "data-url", "flate2", "fontdb", @@ -7654,9 +7597,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.26.1" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +checksum = "f053576934f05a761a402421fbbe3d425d9366f75f978806a037b3ca481abecc" dependencies = [ "getrandom 0.4.3", "js-sys", @@ -7730,9 +7673,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.128" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -7743,9 +7686,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.78" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", "wasm-bindgen", @@ -7753,9 +7696,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.128" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7763,22 +7706,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.128" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.5", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.128" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] @@ -7817,7 +7760,7 @@ version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -7829,7 +7772,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "wayland-backend", ] @@ -7851,7 +7794,7 @@ version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7864,7 +7807,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7877,7 +7820,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7890,7 +7833,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7903,7 +7846,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7928,7 +7871,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "downcast-rs", "rustix 1.1.4", "wayland-backend", @@ -7949,9 +7892,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.105" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -7980,7 +7923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" dependencies = [ "arrayvec", - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cfg-if", "cfg_aliases", @@ -8012,12 +7955,12 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cfg_aliases", "document-features", "hashbrown 0.16.1", - "indexmap 2.14.2", + "indexmap 2.14.0", "log", "naga", "once_cell", @@ -8072,7 +8015,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.13.2", + "bitflags 2.13.1", "block", "bytemuck", "cfg-if", @@ -8116,7 +8059,7 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "js-sys", "log", @@ -8173,6 +8116,16 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core 0.56.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" @@ -8216,14 +8169,26 @@ dependencies = [ "windows-core 0.62.2", ] +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -8235,8 +8200,8 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.2.1", "windows-result 0.4.1", "windows-strings 0.5.1", @@ -8264,6 +8229,17 @@ dependencies = [ "windows-threading 0.2.1", ] +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-implement" version = "0.60.2" @@ -8275,6 +8251,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -8318,6 +8305,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -8616,7 +8612,7 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" name = "winit" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cfg_aliases", "cursor-icon", "dpi", @@ -8641,7 +8637,7 @@ name = "winit-android" version = "0.31.0-beta.2" dependencies = [ "android-activity", - "bitflags 2.13.2", + "bitflags 2.13.1", "dpi", "ndk", "raw-window-handle", @@ -8654,7 +8650,7 @@ dependencies = [ name = "winit-appkit" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", "dpi", @@ -8688,7 +8684,7 @@ dependencies = [ name = "winit-core" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "dpi", "keyboard-types", @@ -8701,7 +8697,7 @@ dependencies = [ name = "winit-orbital" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "dpi", "libredox", "orbclient", @@ -8716,7 +8712,7 @@ dependencies = [ name = "winit-uikit" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", "dpi", @@ -8736,7 +8732,7 @@ name = "winit-wayland" version = "0.31.0-beta.2" dependencies = [ "ahash", - "bitflags 2.13.2", + "bitflags 2.13.1", "calloop", "cursor-icon", "dpi", @@ -8761,7 +8757,7 @@ name = "winit-web" version = "0.31.0-beta.2" dependencies = [ "atomic-waker", - "bitflags 2.13.2", + "bitflags 2.13.1", "concurrent-queue", "cursor-icon", "dpi", @@ -8781,7 +8777,7 @@ dependencies = [ name = "winit-win32" version = "0.31.0-beta.2" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "dpi", "raw-window-handle", @@ -8917,7 +8913,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "dlib", "log", "once_cell", @@ -9121,7 +9117,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", "zbus_names 4.3.4", "zvariant 5.15.0", "zvariant_utils 4.2.0", @@ -9178,18 +9174,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.57" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.57" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", @@ -9255,7 +9251,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", ] [[package]] @@ -9272,7 +9268,7 @@ dependencies = [ "flate2", "getrandom 0.4.3", "hmac", - "indexmap 2.14.2", + "indexmap 2.14.0", "lzma-rust2", "memchr", "pbkdf2", @@ -9287,9 +9283,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" [[package]] name = "zmij" @@ -9320,18 +9316,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.3.0" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.1.0+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", @@ -9427,7 +9423,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.4", "zvariant_utils 4.2.0", ] @@ -9451,14 +9447,10 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 3.0.5", + "syn 3.0.4", "winnow", ] -[[patch.unused]] -name = "winit-x11" -version = "0.31.0-beta.2" - [[patch.unused]] name = "dnd" version = "0.1.0" @@ -9473,3 +9465,7 @@ source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x name = "window_clipboard" version = "0.4.1" source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#af8e6a872d8ac4956e044b9cb05a615a48261a57" + +[[patch.unused]] +name = "winit-x11" +version = "0.31.0-beta.2" diff --git a/Cargo.toml b/Cargo.toml index d366d84..f9eae09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-files" -version = "1.9.0" +version = "1.7.0" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" @@ -11,16 +11,16 @@ anyhow = "1" jiff = "0.2" jiff-icu = "0.2" icu = { version = "2.2.0", features = ["compiled_data"] } -cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "c0cff4d", optional = true } +cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "32283d7", optional = true } cosmic-mime-apps = { git = "https://github.com/pop-os/cosmic-mime-apps.git", optional = true } dirs = "6.0.0" gio = { version = "0.21", optional = true } glib = { version = "0.21", optional = true } glob = "0.3" ignore = "0.4" -image.workspace = true +image = "0.25" libc = "0.2" -log.workspace = true +log = "0.4" mime_guess = "2" notify-debouncer-full = "0.7" notify-rust = { version = "4", optional = true } @@ -166,8 +166,4 @@ mime = { git = "https://forge.aditua.com/leyoda/window_clipboard.git", branch = cosmic-text = { path = "../cosmic-text" } [workspace] -members = ["cosmic-files-applet", "cosmic-files-thumbnailer"] - -[workspace.dependencies] -image = "0.25" -log = "0.4" +members = ["cosmic-files-applet"] diff --git a/cosmic-files-applet/Cargo.toml b/cosmic-files-applet/Cargo.toml index 3cf3264..8d396ae 100644 --- a/cosmic-files-applet/Cargo.toml +++ b/cosmic-files-applet/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "cosmic-files-applet" -version = "1.9.0" +version = "1.7.0" edition = "2024" [dependencies] -log.workspace = true +log = "0.4" zbus = "4" # Blocking connection in zbus 5 hangs [dependencies.cosmic-files] diff --git a/cosmic-files-thumbnailer/Cargo.toml b/cosmic-files-thumbnailer/Cargo.toml deleted file mode 100644 index 53cf47b..0000000 --- a/cosmic-files-thumbnailer/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "cosmic-files-thumbnailer" -version = "1.9.0" -edition = "2024" - -[dependencies] -image.workspace = true -pelite = "0.10" diff --git a/cosmic-files-thumbnailer/src/main.rs b/cosmic-files-thumbnailer/src/main.rs deleted file mode 100644 index 2463849..0000000 --- a/cosmic-files-thumbnailer/src/main.rs +++ /dev/null @@ -1,254 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -use image::{DynamicImage, ImageFormat, RgbaImage}; -use std::error::Error; -use std::ffi::{OsStr, OsString}; -use std::io; -use std::path::Path; - -fn main() -> Result<(), Box> { - thumbnail_from_args(std::env::args_os().skip(1)) -} - -#[allow(dead_code)] -pub fn thumbnail_from_args(mut args: impl Iterator) -> Result<(), Box> { - let usage = || { - io::Error::new( - io::ErrorKind::InvalidInput, - "usage: cosmic-files-thumbnailer OUTPUT --size SIZE INPUT", - ) - }; - let output = args.next().ok_or_else(usage)?; - if args.next().as_deref() != Some(OsStr::new("--size")) { - return Err(usage().into()); - } - let size = args - .next() - .and_then(|arg| arg.into_string().ok()) - .and_then(|arg| arg.parse::().ok()) - .filter(|size| *size > 0) - .ok_or_else(usage)?; - let input = args.next().ok_or_else(usage)?; - if args.next().is_some() { - return Err(usage().into()); - } - - thumbnail(Path::new(&input), Path::new(&output), size) -} - -#[allow(dead_code)] -pub fn thumbnail(input: &Path, output: &Path, size: u32) -> Result<(), Box> { - let icon = thumbnail_image(input, size)?; - DynamicImage::ImageRgba8(icon).save_with_format(output, ImageFormat::Png)?; - - Ok(()) -} - -pub fn thumbnail_image(input: &Path, size: u32) -> Result> { - if size == 0 { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - "thumbnail size must be positive", - ) - .into()); - } - - // Map the PE so only the headers and resource pages touched by pelite are read. - let data = pelite::FileMap::open(input)?; - let bytes = data.as_ref(); - if bytes.len() < 64 || !bytes.starts_with(b"MZ") { - return Err(io::Error::new(io::ErrorKind::InvalidData, "input is not a PE file").into()); - } - - let file = pelite::PeFile::from_bytes(bytes).map_err(invalid_data)?; - let resources = file.resources().map_err(invalid_data)?; - let (_name, group) = resources - .icons() - .next() - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "PE file has no icon group"))? - .map_err(invalid_data)?; - - let mut ico = Vec::new(); - group.write(&mut ico).map_err(invalid_data)?; - - Ok( - DynamicImage::ImageRgba8(largest_icon(&ico).map_err(invalid_data)?) - .thumbnail(size, size) - .into_rgba8(), - ) -} - -fn invalid_data(error: impl std::fmt::Display) -> io::Error { - io::Error::new(io::ErrorKind::InvalidData, error.to_string()) -} - -fn largest_icon(ico: &[u8]) -> Result { - if ico.len() < 6 { - return Err("ICO header is truncated".to_string()); - } - let count = usize::from(u16::from_le_bytes([ico[4], ico[5]])); - let mut best: Option<(u64, RgbaImage)> = None; - let mut errors = Vec::new(); - - for i in 0..count.min(32) { - let entry = 6 + i * 16; - if ico.len() < entry + 16 { - break; - } - let size = u32::from_le_bytes([ - ico[entry + 8], - ico[entry + 9], - ico[entry + 10], - ico[entry + 11], - ]) as usize; - let offset = u32::from_le_bytes([ - ico[entry + 12], - ico[entry + 13], - ico[entry + 14], - ico[entry + 15], - ]) as usize; - let Some(end) = offset.checked_add(size) else { - continue; - }; - let Some(data) = ico.get(offset..end) else { - continue; - }; - - match decode_icon(&ico[entry..entry + 16], data) { - Ok(image) => { - let pixels = u64::from(image.width()) * u64::from(image.height()); - if best - .as_ref() - .is_none_or(|(best_pixels, _)| pixels > *best_pixels) - { - best = Some((pixels, image)); - } - } - Err(err) => errors.push(format!("frame {i}: {err}")), - } - } - - best.map(|(_, image)| image).ok_or_else(|| { - if errors.is_empty() { - "PE icon contains no complete frames".to_string() - } else { - format!("PE icon could not be decoded ({})", errors.join("; ")) - } - }) -} - -fn decode_icon(entry: &[u8], data: &[u8]) -> Result { - if data.starts_with(b"\x89PNG\r\n\x1a\n") { - return image::ImageReader::with_format(io::Cursor::new(data), ImageFormat::Png) - .decode() - .map(DynamicImage::into_rgba8) - .map_err(|err| err.to_string()); - } - - let capacity = 22usize - .checked_add(data.len()) - .ok_or_else(|| "frame is too large".to_string())?; - let data_len = u32::try_from(data.len()).map_err(|_| "frame is too large".to_string())?; - let mut ico = Vec::with_capacity(capacity); - ico.extend_from_slice(&[0, 0, 1, 0, 1, 0]); - ico.extend_from_slice(entry); - ico[14..18].copy_from_slice(&data_len.to_le_bytes()); - ico[18..22].copy_from_slice(&22u32.to_le_bytes()); - ico.extend_from_slice(data); - - image::ImageReader::with_format(io::Cursor::new(ico), ImageFormat::Ico) - .decode() - .map(DynamicImage::into_rgba8) - .map_err(|err| err.to_string()) -} - -#[cfg(test)] -mod tests { - use super::{largest_icon, thumbnail_from_args}; - use image::{DynamicImage, ImageFormat, Rgb, RgbImage, Rgba, RgbaImage}; - use std::ffi::OsString; - use std::io::Cursor; - - #[test] - fn malformed_thumbnail_request_returns_an_error() { - let args = [OsString::from("output.png")]; - assert!(thumbnail_from_args(args.into_iter()).is_err()); - } - - #[test] - fn largest_icon_skips_invalid_entries() { - let image = RgbaImage::from_pixel(2, 2, Rgba([1, 2, 3, 255])); - let mut png = Cursor::new(Vec::new()); - DynamicImage::ImageRgba8(image) - .write_to(&mut png, ImageFormat::Png) - .unwrap(); - let png = png.into_inner(); - - let mut ico = vec![0, 0, 1, 0, 2, 0]; - let mut invalid_entry = [0; 16]; - invalid_entry[8..12].copy_from_slice(&4u32.to_le_bytes()); - invalid_entry[12..16].copy_from_slice(&u32::MAX.to_le_bytes()); - ico.extend_from_slice(&invalid_entry); - - let mut valid_entry = [0; 16]; - valid_entry[..8].copy_from_slice(&[2, 2, 0, 0, 1, 0, 32, 0]); - valid_entry[8..12].copy_from_slice(&u32::try_from(png.len()).unwrap().to_le_bytes()); - valid_entry[12..16].copy_from_slice(&38u32.to_le_bytes()); - ico.extend_from_slice(&valid_entry); - ico.extend_from_slice(&png); - - let decoded = largest_icon(&ico).expect("valid icon after malformed entry"); - assert_eq!(decoded.dimensions(), (2, 2)); - assert_eq!(decoded.get_pixel(0, 0), &Rgba([1, 2, 3, 255])); - } - - #[test] - fn dib_and_mask_is_applied() { - let mut dib = vec![0; 40]; - dib[0..4].copy_from_slice(&40u32.to_le_bytes()); - dib[4..8].copy_from_slice(&2i32.to_le_bytes()); - dib[8..12].copy_from_slice(&4i32.to_le_bytes()); - dib[12..14].copy_from_slice(&1u16.to_le_bytes()); - dib[14..16].copy_from_slice(&24u16.to_le_bytes()); - - // Two bottom-up BGR rows, padded to four-byte boundaries. - dib.extend_from_slice(&[0, 0, 255, 0, 0, 255, 0, 0]); - dib.extend_from_slice(&[0, 0, 255, 0, 0, 255, 0, 0]); - // The first mask row is the bottom image row; its first pixel is transparent. - dib.extend_from_slice(&[0b1000_0000, 0, 0, 0]); - dib.extend_from_slice(&[0, 0, 0, 0]); - - let mut ico = vec![0, 0, 1, 0, 1, 0]; - let mut entry = [0; 16]; - entry[..8].copy_from_slice(&[2, 2, 0, 0, 1, 0, 24, 0]); - entry[8..12].copy_from_slice(&u32::try_from(dib.len()).unwrap().to_le_bytes()); - entry[12..16].copy_from_slice(&22u32.to_le_bytes()); - ico.extend_from_slice(&entry); - ico.extend_from_slice(&dib); - - let decoded = largest_icon(&ico).expect("valid DIB icon"); - assert_eq!(decoded.get_pixel(0, 0), &Rgba([255, 0, 0, 255])); - assert_eq!(decoded.get_pixel(0, 1), &Rgba([255, 0, 0, 0])); - } - - #[test] - fn rgb_png_icon_is_decoded() { - let image = RgbImage::from_pixel(2, 2, Rgb([1, 2, 3])); - let mut png = Cursor::new(Vec::new()); - DynamicImage::ImageRgb8(image) - .write_to(&mut png, ImageFormat::Png) - .unwrap(); - let png = png.into_inner(); - - let mut ico = vec![0, 0, 1, 0, 1, 0]; - let mut entry = [0; 16]; - entry[..8].copy_from_slice(&[2, 2, 0, 0, 1, 0, 24, 0]); - entry[8..12].copy_from_slice(&u32::try_from(png.len()).unwrap().to_le_bytes()); - entry[12..16].copy_from_slice(&22u32.to_le_bytes()); - ico.extend_from_slice(&entry); - ico.extend_from_slice(&png); - - let decoded = largest_icon(&ico).expect("valid RGB PNG icon"); - assert_eq!(decoded.get_pixel(0, 0), &Rgba([1, 2, 3, 255])); - } -} diff --git a/debian/changelog b/debian/changelog index 48a34d7..6cbee03 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,15 +1,3 @@ -cosmic-files (1.9.0) noble; urgency=medium - - * Epoch 1.9.0 version update - - -- Michael Murphy Mon, 14 Sep 2026 20:35:19 +0200 - -cosmic-files (1.8.0) noble; urgency=medium - - * Epoch 1.8.0 version update - - -- Jeremy Soller Wed, 02 Sep 2026 08:14:53 -0600 - cosmic-files (1.7.0) noble; urgency=medium * Epoch 1.7.0 version update diff --git a/debian/source/options b/debian/source/options index 2f8c4a1..5d4ff73 100644 --- a/debian/source/options +++ b/debian/source/options @@ -1,6 +1,4 @@ tar-ignore=.github -tar-ignore=target/.rustc_info.json -tar-ignore=target/CACHEDIR.TAG -tar-ignore=target/debug -tar-ignore=target/release +tar-ignore=.vscode tar-ignore=vendor +tar-ignore=target \ No newline at end of file diff --git a/i18n/cs/cosmic_files.ftl b/i18n/cs/cosmic_files.ftl index d544dc8..81f34f5 100644 --- a/i18n/cs/cosmic_files.ftl +++ b/i18n/cs/cosmic_files.ftl @@ -431,6 +431,3 @@ rename-confirm = Přejmenovat checksum = Kontrolní součet { $kind } calculate = Vypočítat error = Chyba -search-application = Hledat podle názvu aplikace -sidebar-label = Popisek v postranním panelu -change-sidebar-label = Změnit popisek diff --git a/i18n/de/cosmic_files.ftl b/i18n/de/cosmic_files.ftl index 87ba8b8..d7393e9 100644 --- a/i18n/de/cosmic_files.ftl +++ b/i18n/de/cosmic_files.ftl @@ -341,7 +341,7 @@ new-folder = Neuer Ordner ... open-in-terminal = Im Terminal öffnen move-to-trash = In den Papierkorb verschieben restore-from-trash = Aus dem Papierkorb wiederherstellen -remove-from-sidebar = Aus der Seitenleiste entfernen +remove-from-sidebar = Von der Seitenleiste entfernen sort-by-name = Nach Name sortieren sort-by-modified = Nach Änderung sortieren sort-by-size = Nach Größe sortieren @@ -441,5 +441,3 @@ rename-confirm = Umbenennen checksum = { $kind } Prüfsumme calculate = Berechnen error = Fehler -sidebar-label = Bezeichnung in der Seitenleiste -search-application = Nach App-Name suchen diff --git a/i18n/el/cosmic_files.ftl b/i18n/el/cosmic_files.ftl index 6443d4b..f8ff7cd 100644 --- a/i18n/el/cosmic_files.ftl +++ b/i18n/el/cosmic_files.ftl @@ -331,6 +331,3 @@ rename-confirm = Μετονομασία checksum = Άθροισμα ελέγχου { $kind } calculate = Υπολογισμός error = Σφάλμα -sidebar-label = Ετικέτα πλαϊνής στήλης -search-application = Αναζήτηση με όνομα εφαρμογής -change-sidebar-label = Αλλαγή ετικέτας πλαϊνής στήλης diff --git a/i18n/fi/cosmic_files.ftl b/i18n/fi/cosmic_files.ftl index ce1f7ff..f0bf682 100644 --- a/i18n/fi/cosmic_files.ftl +++ b/i18n/fi/cosmic_files.ftl @@ -418,6 +418,3 @@ rename-confirm = Nimeä uudelleen checksum = { $kind }-tarkistussumma calculate = Laske error = Virhe -search-application = Hae sovelluksen nimellä -sidebar-label = Sivupalkin nimike -change-sidebar-label = Muuta sivupalkin nimikettä diff --git a/i18n/fil/cosmic_files.ftl b/i18n/fil/cosmic_files.ftl deleted file mode 100644 index e69de29..0000000 diff --git a/i18n/fr/cosmic_files.ftl b/i18n/fr/cosmic_files.ftl index cdcfe35..21d4a5a 100644 --- a/i18n/fr/cosmic_files.ftl +++ b/i18n/fr/cosmic_files.ftl @@ -456,6 +456,3 @@ rename-confirm = Renommer calculate = Calculer error = Erreur checksum = Somme de contrôle { $kind } -sidebar-label = Libellé de la barre latérale -search-application = Chercher par nom d'appli -change-sidebar-label = Changer le libellé de la barre latérale diff --git a/i18n/hu/cosmic_files.ftl b/i18n/hu/cosmic_files.ftl index fa15499..827bfa1 100644 --- a/i18n/hu/cosmic_files.ftl +++ b/i18n/hu/cosmic_files.ftl @@ -446,9 +446,6 @@ context-action-confirm-warning = } fog lefutni. run = Futtatás rename-confirm = Átnevezés -checksum = { $kind }-ellenőrzőösszeg +checksum = { $kind } ellenőrzőösszeg calculate = Számítás error = Hiba -sidebar-label = Oldalsávcímke -search-application = Keresés alkalmazásnév alapján -change-sidebar-label = Oldalsávcímke módosítása diff --git a/i18n/id/cosmic_files.ftl b/i18n/id/cosmic_files.ftl index f1203e7..5bce181 100644 --- a/i18n/id/cosmic_files.ftl +++ b/i18n/id/cosmic_files.ftl @@ -331,6 +331,3 @@ rename-confirm = Ganti nama checksum = { $kind } checksum calculate = Hitung error = Galat -sidebar-label = Label bilah sisi -search-application = Cari berdasarkan nama aplikasi -change-sidebar-label = Ubah label bilah sisi diff --git a/i18n/kab/cosmic_files.ftl b/i18n/kab/cosmic_files.ftl index f0f776e..233c47d 100644 --- a/i18n/kab/cosmic_files.ftl +++ b/i18n/kab/cosmic_files.ftl @@ -20,7 +20,7 @@ name = Isem modified = Ittusnifel trashed-on = Yettwakkes ɣer tqecwalt n yiḍumman size = Tiddi -details = Ifatusen +details = Talqayt pause = Serǧu resume = Kemmel create-archive = Snulfu-d aɣbaṛ @@ -40,7 +40,7 @@ file-already-exists = Afaylu s yisem-agi yella yakan folder-already-exists = Akaram s yisem-agi yella yakan name-hidden = Ismawen ibeddun s "." ad ttwaffren name-invalid = Isem ur yezmir ara ad yili "{ $filename }" -cancel = Semmet +cancel = Sefsex create = Snulfu-d open = Ldi open-file = Ldi afaylu @@ -72,7 +72,7 @@ comment = Amsefrak n yifuyla i tnarit COSMIC keywords = Akaram;Amsefrak; delete = kkes replace = Semselsi -support = Tallelt +support = Tallalt settings = Iɣewwaṛen appearance = Timeẓri theme = Asentel @@ -86,10 +86,10 @@ zoom-out = Asemẓi view = Wali menu-settings = Iɣewwaṛen… save = Sekles -match-desktop = Semṣada akked tnarit +match-desktop = Amṣada d tnarit file = Afaylu new-window = Asfaylu amaynut -quit = Ffeɣ +quit = Tuffɣa edit = Ẓreg cut = Gzem copy = Nɣel diff --git a/i18n/kmr/cosmic_files.ftl b/i18n/kmr/cosmic_files.ftl index b15e92d..f45eaeb 100644 --- a/i18n/kmr/cosmic_files.ftl +++ b/i18n/kmr/cosmic_files.ftl @@ -117,7 +117,7 @@ list-directories-first = Pêşî rêgehan lîste bike folder-name = Navê peldankê browse-store = { $store } bigere remove-from-recents = Ji dawiyê rake -paste = Pê ve bike +paste = Pêve bike empty-trash-title = Jêbirdankê vala bike? menu-settings = Sazkarî... moving = @@ -325,12 +325,9 @@ replace = Biguhêrîne replace-title = "{ $filename }" jixwe di vê cihê de heye unknown-folder = Peldanka nenas write-only = Tenê nivîsandin -trashed-on = Jêbirî +trashed-on = Li Jêbirdankê hatiye avêtin mixed = Tevlihev type-to-search-select = Pel an peldanka yekem a lihevhatî hildibijêre calculate = Bijmêre error = Şaşetî checksum = Tevahiya { $kind } kontrol bike -sidebar-label = Nîşanka benda kêlekê -search-application = Li gorî navê sepanê bigere -change-sidebar-label = Nîşanka benda kêlekê biguhêrîne diff --git a/i18n/oc/cosmic_files.ftl b/i18n/oc/cosmic_files.ftl index 71afc45..aa7bd53 100644 --- a/i18n/oc/cosmic_files.ftl +++ b/i18n/oc/cosmic_files.ftl @@ -1,33 +1,6 @@ appearance = Aparéncia theme = Tèma match-desktop = Assortir al burèu -dark = Escur +dark = Fosc light = Clar file = Fichièr -details = Detalhs -name = Nom -cancel = Anullar -repository = Depaus -settings = Configuracion -menu-settings = Configuracion... -quit = Quitar -cosmic-files = Fichièrs de COSMIC -comment = Gestionari de fichièrs pel burèu COSMIC -save-file = Enregistrar lo fichièr -open-with-title = Cossí volètz dobrir « { $name } » ? -other-apps = Autras aplicacions -context-action-confirm-title = Executar « { $name } » ? -run = Executar -delete = Suprimir -replace = Remplaçar -owner = Propietari -group = Grop -write-execute = Escritura e execucion -read-only = Lectura sola -read-execute = Lectura e execucion -read-write = Lectura e execucion -read-write-execute = Lectura, escritura e execucion -remove = Suprimir -connecting = Connexion... -domain = Domeni -password = Senhal diff --git a/i18n/pl/cosmic_files.ftl b/i18n/pl/cosmic_files.ftl index e8d6ab2..c92546a 100644 --- a/i18n/pl/cosmic_files.ftl +++ b/i18n/pl/cosmic_files.ftl @@ -1,5 +1,5 @@ cosmic-files = Pliki COSMIC -comment = Menedżer plików dla środowiska COSMIC +comment = Menedżer plików pulpitu COSMIC keywords = Katalogi;Pliki;Menedżer; empty-folder = Pusty katalog empty-folder-hidden = Pusty katalog (z ukrytymi plikami) @@ -450,6 +450,3 @@ rename-confirm = Zmień nazwę checksum = { $kind } suma kontrolna calculate = Oblicz error = Błąd -sidebar-label = Etykieta panelu bocznego -search-application = Wyszukaj po nazwie aplikacji -change-sidebar-label = Zmień etykietę panelu bocznego diff --git a/i18n/pt-BR/cosmic_files.ftl b/i18n/pt-BR/cosmic_files.ftl index fd10ac3..b47214a 100644 --- a/i18n/pt-BR/cosmic_files.ftl +++ b/i18n/pt-BR/cosmic_files.ftl @@ -111,7 +111,7 @@ rename-folder = Renomear pasta ## Change Sidebar Label Dialog -sidebar-label = Legenda da barra lateral +sidebar-label = Rótulo da barra lateral ## Replace Dialog @@ -369,7 +369,7 @@ open-in-terminal = Abrir no terminal move-to-trash = Mover para a lixeira restore-from-trash = Restaurar da lixeira remove-from-sidebar = Remover da barra lateral -change-sidebar-label = Alterar legenda da barra lateral +change-sidebar-label = Alterar rótulo na barra lateral sort-by-name = Ordenar por nome sort-by-modified = Ordenar por data de modificação sort-by-size = Ordenar por tamanho @@ -454,4 +454,3 @@ rename-confirm = Renomear checksum = Soma de verificação { $kind } calculate = Calcular error = Erro -search-application = Pesquisar por nome de aplicativo diff --git a/i18n/ru/cosmic_files.ftl b/i18n/ru/cosmic_files.ftl index 185421f..8b1f7f2 100644 --- a/i18n/ru/cosmic_files.ftl +++ b/i18n/ru/cosmic_files.ftl @@ -383,16 +383,14 @@ clear-recents-history = Очистить историю недавних copy-path = Копировать путь mixed = Смешанные context-action = Контекстная команда -context-action-confirm-title = Запустить «{ $name }»? +context-action-confirm-title = Выполнить «{ $name }»? context-action-confirm-warning = Команда затронет { $items } { $items -> [one] элемент *[other] элем. }. -run = Запустить +run = Выполнить rename-confirm = Переименовать checksum = Хеш-сумма { $kind } calculate = Вычислить error = Ошибка -sidebar-label = Подпись в боковой панели -change-sidebar-label = Изменить подпись diff --git a/i18n/sv/cosmic_files.ftl b/i18n/sv/cosmic_files.ftl index 4714773..12f9646 100644 --- a/i18n/sv/cosmic_files.ftl +++ b/i18n/sv/cosmic_files.ftl @@ -422,6 +422,3 @@ rename-confirm = Byt namn checksum = { $kind }-kontrollsumma calculate = Beräkna error = Fel -sidebar-label = Sidofältsetikett -search-application = Sök på programnamn -change-sidebar-label = Ändra sidofältsetikett diff --git a/i18n/th/cosmic_files.ftl b/i18n/th/cosmic_files.ftl index 86a20b3..c0da7bc 100644 --- a/i18n/th/cosmic_files.ftl +++ b/i18n/th/cosmic_files.ftl @@ -202,9 +202,17 @@ moved = *[other] ไฟล์ } จาก "{ $from }" สู่ "{ $to }" renaming = กำลังเปลี่ยนชื่อจาก "{ $from }" เป็น "{ $to }" -renamed = เปลี่ยนชื่อจาก "{ $from }" เป็น "{ $to }" แล้ว -restoring = กำลังกู้คืน { $items } รายการจาก { trash } ({ $progress })... -restored = กู้คืน { $items } รายการจาก { trash } แล้ว +renamed = Renamed "{ $from }" to "{ $to }" +restoring = + Restoring { $items } { $items -> + [one] item + *[other] items + } from { trash } ({ $progress })... +restored = + Restored { $items } { $items -> + [one] item + *[other] items + } from { trash } unknown-folder = แฟ้มที่ไม่รู้จัก ## Open with @@ -232,8 +240,8 @@ settings = การตั้งค่า appearance = ลักษณะ theme = ธีม match-desktop = ใช้ตามธีมหน้าจอหลัก -dark = มืด -light = สว่าง +dark = ธีมมืด +light = ธีมสว่าง # Context menu add-to-sidebar = เพิ่มเข้าแถบด้านข้าง compress = บีบอัด @@ -298,4 +306,3 @@ sort-newest-first = ไฟล์ใหม่ก่อน sort-oldest-first = ไฟล์เก่าก่อน sort-smallest-to-largest = ขนาดเล็กก่อน sort-largest-to-smallest = ขนาดใหญ่ก่อน -remove = ลบ diff --git a/i18n/uk/cosmic_files.ftl b/i18n/uk/cosmic_files.ftl index 8a9c9d6..58fdfb5 100644 --- a/i18n/uk/cosmic_files.ftl +++ b/i18n/uk/cosmic_files.ftl @@ -392,6 +392,3 @@ mixed = Змішано checksum = контрольна сума { $kind } calculate = Вирахувати error = Помилка -sidebar-label = Назва бічної панелі -search-application = Пошук за назвою застосунку -change-sidebar-label = Змінити назву бічної панелі diff --git a/i18n/zh-CN/cosmic_files.ftl b/i18n/zh-CN/cosmic_files.ftl index cc674a3..432c875 100644 --- a/i18n/zh-CN/cosmic_files.ftl +++ b/i18n/zh-CN/cosmic_files.ftl @@ -449,6 +449,3 @@ rename-confirm = 重命名 calculate = 计算 error = 错误 checksum = { $kind } 校验和 -sidebar-label = 侧边栏标签 -search-application = 使用应用名称搜索 -change-sidebar-label = 更改侧边栏标签 diff --git a/i18n/zh-TW/cosmic_files.ftl b/i18n/zh-TW/cosmic_files.ftl index 36badae..4fc7cb7 100644 --- a/i18n/zh-TW/cosmic_files.ftl +++ b/i18n/zh-TW/cosmic_files.ftl @@ -42,7 +42,7 @@ name-no-slashes = 名稱不能包含斜線 ## Open/Save Dialog cancel = 取消 -create = 創作 +create = 建立 open = 開啟 open-file = 開啟檔案 open-folder = 開啟資料夾 @@ -396,6 +396,3 @@ rename-confirm = 重新命名 checksum = { $kind } 核對和 calculate = 計算 error = 錯誤 -sidebar-label = 側邊欄標籤 -search-application = 依應用程式名稱搜尋 -change-sidebar-label = 變更側邊欄標籤 diff --git a/justfile b/justfile index 004854d..5e8d024 100644 --- a/justfile +++ b/justfile @@ -12,10 +12,6 @@ cargo-target-dir := env('CARGO_TARGET_DIR', 'target') bin-src := cargo-target-dir / 'release' / name bin-dst := base-dir / 'bin' / name -thumbnailer-bin-name := name + '-thumbnailer' -thumbnailer-bin-src := cargo-target-dir / 'release' / thumbnailer-bin-name -thumbnailer-bin-dst := base-dir / 'bin' / thumbnailer-bin-name - applet-name := name + '-applet' applet-src := cargo-target-dir / 'release' / applet-name applet-dst := base-dir / 'bin' / applet-name @@ -28,10 +24,6 @@ metainfo := APPID + '.metainfo.xml' metainfo-src := 'target/xdgen' / metainfo metainfo-dst := clean(rootdir / prefix) / 'share' / 'metainfo' / metainfo -thumbnailer := APPID + '.thumbnailer' -thumbnailer-src := 'res' / thumbnailer -thumbnailer-dst := clean(rootdir / prefix) / 'share' / 'thumbnailers' / thumbnailer - icons-src := 'res' / 'icons' / 'hicolor' icons-dst := clean(rootdir / prefix) / 'share' / 'icons' / 'hicolor' @@ -53,11 +45,14 @@ clean-dist: clean clean-vendor build-debug *args: cargo build {{args}} cargo build --package {{applet-name}} {{args}} - cargo build --package {{thumbnailer-bin-name}} {{args}} # Compiles with release profile build-release *args: (build-debug '--release' args) +# Compiles applet with release profile +build-release-applet *args: + cargo build --package {{applet-name}} --release {{args}} + # Compiles release profile with vendored dependencies build-vendored *args: vendor-extract (build-release '--frozen --offline' args) @@ -97,11 +92,9 @@ heaptrack *args: # Installs files install: install -Dm0755 {{bin-src}} {{bin-dst}} - install -Dm0755 {{thumbnailer-bin-src}} {{thumbnailer-bin-dst}} install -Dm0755 {{applet-src}} {{applet-dst}} install -Dm0644 {{desktop-src}} {{desktop-dst}} install -Dm0644 {{metainfo-src}} {{metainfo-dst}} - install -Dm0644 {{thumbnailer-src}} {{thumbnailer-dst}} for size in `ls {{icons-src}}`; do \ install -Dm0644 "{{icons-src}}/$size/apps/{{APPID}}.svg" "{{icons-dst}}/$size/apps/{{APPID}}.svg"; \ done @@ -112,7 +105,7 @@ install-applet: # Uninstalls installed files uninstall: - rm -f {{bin-dst}} {{thumbnailer-bin-dst}} {{applet-dst}} {{thumbnailer-dst}} + rm -f {{bin-dst}} {{applet-dst}} # Vendor dependencies locally vendor: diff --git a/res/com.system76.CosmicFiles.thumbnailer b/res/com.system76.CosmicFiles.thumbnailer deleted file mode 100644 index 4c936cc..0000000 --- a/res/com.system76.CosmicFiles.thumbnailer +++ /dev/null @@ -1,4 +0,0 @@ -[Thumbnailer Entry] -TryExec=cosmic-files-thumbnailer -Exec=cosmic-files-thumbnailer %o --size %s %i -MimeType=application/vnd.microsoft.portable-executable;application/x-msdownload; diff --git a/src/app.rs b/src/app.rs index 22459c6..66fdcb4 100644 --- a/src/app.rs +++ b/src/app.rs @@ -17,10 +17,12 @@ use cosmic::iced::widget::button::focus; use cosmic::iced::widget::scrollable; use cosmic::iced::widget::scrollable::AbsoluteOffset; use cosmic::iced::window::{self, Event as WindowEvent, Id as WindowId}; -use cosmic::iced::{self, Alignment, Event, Length, Size, Subscription, event, mouse, stream}; +use cosmic::iced::{ + self, Alignment, Event, Length, Rectangle, Size, Subscription, event, mouse, stream, +}; #[cfg(all(feature = "wayland", feature = "desktop-applet"))] use cosmic::iced::{ - Limits, Point, Rectangle, + Limits, Point, event::wayland::{Event as WaylandEvent, OutputEvent, OverlapNotifyEvent}, platform_specific::runtime::wayland::layer_surface::{ IcedMargin, IcedOutput, SctkLayerSurfaceSettings, @@ -606,7 +608,7 @@ pub enum Message { OutputEvent(OutputEvent, WlOutput), Cosmic(app::Action), None, - Surface(surface::Action), + Surface(surface::Action), CutPaths(Vec), } @@ -798,6 +800,7 @@ pub struct MounterData(MounterKey, MounterItem); #[derive(Clone, Debug)] pub enum WindowKind { + ContextMenu(Entity, widget::Id), Desktop(Entity), DesktopViewOptions, Dialogs(widget::Id), @@ -1590,6 +1593,12 @@ impl App { fn remove_window(&mut self, id: &window::Id) { if let Some(window) = self.windows.remove(id) { match window.kind { + WindowKind::ContextMenu(entity, _) => { + // Close context menu + if let Some(tab) = self.tab_model.data_mut::(entity) { + tab.context_menu = None; + } + } WindowKind::Desktop(entity) => { // Remove the tab from the tab model self.tab_model.remove(entity); @@ -1926,6 +1935,21 @@ impl App { } } + fn close_context_menus(&mut self) -> Task { + let active = self.tab_model.active(); + if let Some(tab) = self.tab_model.data_mut::(active) { + tab.location_context_menu_index = None; + if tab.context_menu.is_some() { + return self.update(Message::TabMessage( + Some(active), + tab::Message::ContextMenu(None, None), + )); + } + } + + Task::none() + } + fn update_nav_model(&mut self) { let mut nav_model = segmented_button::ModelBuilder::default(); @@ -1939,7 +1963,9 @@ impl App { for (favorite_i, favorite) in self.config.favorites.iter().enumerate() { if let Some(path) = favorite.path_opt() { - let name = favorite.display_name().unwrap_or_else(|| fl!("filesystem")); + let name = favorite + .display_name() + .unwrap_or_else(|| fl!("filesystem")); nav_model = nav_model.insert(move |b| { b.text(name.clone()) .icon( @@ -2839,7 +2865,7 @@ impl Application for App { { nav = nav .window_id_maybe(self.core().main_window_id()) - .on_surface_action(|action| cosmic::Action::Surface(action.flatten())) + .on_surface_action(|m| cosmic::Action::Cosmic(cosmic::app::Action::Surface(m))) } let mut nav = nav.into_container(); @@ -3107,6 +3133,18 @@ impl Application for App { return cosmic::task::message(cosmic::action::app(Message::SetShowDetails(false))); } if let Some(tab) = self.tab_model.data_mut::(entity) { + if tab.location_context_menu_index.is_some() { + tab.location_context_menu_index = None; + return Task::none(); + } + + if tab.context_menu.is_some() { + return self.update(Message::TabMessage( + Some(entity), + tab::Message::ContextMenu(None, None), + )); + } + if tab.edit_location.is_some() { tab.edit_location = None; return Task::none(); @@ -3864,7 +3902,7 @@ impl Application for App { Message::Mouse(window_id, _button) => { // Close context menu when clicking outside. if self.core.main_window_id() == Some(window_id) { - return Task::none(); + return self.close_context_menus(); } } Message::MoveTo(entity_opt) => { @@ -4677,7 +4715,7 @@ impl Application for App { )); } Message::SearchActivate => { - let mut tasks = vec![]; + let mut tasks = vec![self.close_context_menus()]; if self.search_get().is_none() { tasks.push(self.search_set_active(Some(String::new()))); @@ -4688,7 +4726,7 @@ impl Application for App { return Task::batch(tasks); } Message::SearchClear => { - return self.search_set_active(None); + return Task::batch([self.close_context_menus(), self.search_set_active(None)]); } Message::SearchInput(input) => { return self.search_set_active(Some(input)); @@ -4789,7 +4827,7 @@ impl Application for App { return self.update_config(); } Message::TabActivate(entity) => { - let mut tasks = vec![]; + let mut tasks = vec![self.close_context_menus()]; // Activate new tab self.tab_model.activate(entity); @@ -4851,9 +4889,7 @@ impl Application for App { tasks.push(Task::future(async move { cosmic::action::app(Message::WindowClose) })); - } else if entity == self.tab_model.active() - && let Some(position) = self.tab_model.position(entity) - { + } else if let Some(position) = self.tab_model.position(entity) { let new_position = if position > 0 { position - 1 } else { @@ -4890,8 +4926,6 @@ impl Application for App { } Message::TabMessage(entity_opt, tab_message) => { let entity = entity_opt.unwrap_or_else(|| self.tab_model.active()); - // The context menu opens on right-button release, so refresh paste availability now - let right_click = matches!(tab_message, tab::Message::RightClick(..)); let tab_commands = match self.tab_model.data_mut::(entity) { Some(tab) => tab.update(tab_message, self.modifiers), @@ -4899,9 +4933,6 @@ impl Application for App { }; let mut commands = Vec::new(); - if right_click { - commands.push(self.update(Message::CheckClipboard)); - } for tab_command in tab_commands { match tab_command { tab::Command::Action(action) => { @@ -4942,11 +4973,93 @@ impl Application for App { self.update_tab(entity, tab_path, selection_paths), ])); } - tab::Command::Surface(action) => { - // re-type the tab's surface action the way its messages are re-typed - let action = action - .map(move |message| Message::TabMessage(Some(entity), message)); - commands.push(self.update(Message::Surface(action))); + tab::Command::ContextMenu(point_opt, parent_id) => { + #[cfg(feature = "wayland")] + if let Some(point) = point_opt { + if crate::is_wayland() { + // Open context menu + use cctk::wayland_protocols::xdg::shell::client::xdg_positioner::{ + Anchor, Gravity, + }; + use cosmic::{iced::runtime::platform_specific::wayland::popup::{ + SctkPopupSettings, SctkPositioner, + }, widget::menu::StyleSheet as _}; + + let window_id = WindowId::unique(); + self.windows.insert( + window_id, + Window::new(WindowKind::ContextMenu( + entity, + widget::Id::unique(), + )), + ); + commands.push(self.update(Message::CheckClipboard)); + let t = self.core.system_theme(); + let styling = t.appearance( + &cosmic::theme::menu_bar::MenuBarStyle::Default, + false, + ); + let rad = styling.menu_border_radius; + + commands.push(self.update(Message::Surface( + cosmic::surface::action::app_popup( + move |_| cosmic::surface::action::LiveSettings { + corners: Some(iced::runtime::platform_specific::wayland::CornerRadius { + top_left: rad[0] as u32, + top_right: rad[1] as u32, + bottom_left: rad[2] as u32, + bottom_right: rad[3] as u32, + }), + ..Default::default() + }, move |app: &mut Self| -> SctkPopupSettings { + let anchor_rect = Rectangle { + x: point.x as i32, + y: point.y as i32, + width: 1, + height: 1, + }; + let positioner = SctkPositioner { + size: None, + anchor_rect, + anchor: Anchor::None, + gravity: Gravity::BottomRight, + reactive: true, + ..Default::default() + }; + SctkPopupSettings { + parent: parent_id.unwrap_or( + app.core + .main_window_id() + .unwrap_or(WindowId::NONE), + ), + id: window_id, + positioner, + parent_size: None, + grab: true, + close_with_children: false, + input_zone: None, + } + }, + None, + ), + ))); + } + } else { + // Destroy previous popup + let mut window_ids = Vec::new(); + for (window_id, window) in &self.windows { + if let WindowKind::ContextMenu(e, _) = &window.kind + && *e == entity + { + window_ids.push(*window_id); + } + } + for window_id in window_ids { + commands.push(self.update(Message::Surface( + cosmic::surface::action::destroy_popup(window_id), + ))); + } + } } tab::Command::Delete(paths) => commands.push(self.delete(paths)), tab::Command::DropFiles(to, from) => { @@ -4996,6 +5109,7 @@ impl Application for App { } tab::Command::OpenFile(paths) => commands.push(self.open_file(&paths)), tab::Command::OpenInNewTab(path) => { + commands.push(self.close_context_menus()); commands.push(self.open_tab(Location::Path(path), false, None)); } tab::Command::OpenInNewWindow(path) => match env::current_exe() { @@ -5432,6 +5546,12 @@ impl Application for App { if let Some(tab) = self.tab_model.data_mut::(tab_entity) { // Close location editing if enabled tab.edit_location = None; + // Close other context menus. + tab.location_context_menu_index = None; + return Task::done(cosmic::Action::App(Message::TabMessage( + Some(tab_entity), + tab::Message::ContextMenu(None, None), + ))); } } Message::NavMenuAction(action) => match action { @@ -5530,7 +5650,7 @@ impl Application for App { _ => Task::none(), }; - return open_task; + return Task::batch([self.close_context_menus(), open_task]); } // Open the selected path in a new cosmic-files window. @@ -5613,10 +5733,16 @@ impl Application for App { } NavMenuAction::ChangeSidebarLabel(entity) => { - if let Some(favorite) = self.nav_model.data::(entity).and_then( - |FavoriteIndex(favorite_i)| self.config.favorites.get(*favorite_i), - ) { - let label = favorite.display_name().unwrap_or_else(|| fl!("filesystem")); + if let Some(favorite) = self + .nav_model + .data::(entity) + .and_then(|FavoriteIndex(favorite_i)| { + self.config.favorites.get(*favorite_i) + }) + { + let label = favorite + .display_name() + .unwrap_or_else(|| fl!("filesystem")); return Task::batch([ self.dialog_pages .push_back(DialogPage::ChangeSidebarLabel { entity, label }), @@ -5676,31 +5802,35 @@ impl Application for App { .insert(surface_id, Window::new(WindowKind::Desktop(entity))); return Task::batch([ command, - cosmic::task::message(cosmic::Action::Surface( - cosmic::surface::action::app_layer_shell( - |_| Default::default(), - move |_: &mut App| SctkLayerSurfaceSettings { - id: surface_id, - layer: Layer::Bottom, - keyboard_interactivity: KeyboardInteractivity::OnDemand, - input_zone: None, - anchor: Anchor::TOP - | Anchor::BOTTOM - | Anchor::LEFT - | Anchor::RIGHT, - output: IcedOutput::Output(output.clone()), - namespace: "cosmic-files-applet".into(), - size: Some((None, None)), - margin: IcedMargin { - top: 0, - bottom: 0, - left: 0, - right: 0, + cosmic::task::message(cosmic::action::cosmic( + cosmic::app::Action::Surface( + cosmic::surface::action::app_layer_shell( + |_| Default::default(), + move |_: &mut App| SctkLayerSurfaceSettings { + id: surface_id, + layer: Layer::Bottom, + keyboard_interactivity: KeyboardInteractivity::OnDemand, + input_zone: None, + anchor: Anchor::TOP + | Anchor::BOTTOM + | Anchor::LEFT + | Anchor::RIGHT, + output: IcedOutput::Output(output.clone()), + namespace: "cosmic-files-applet".into(), + size: Some((None, None)), + margin: IcedMargin { + top: 0, + bottom: 0, + left: 0, + right: 0, + }, + exclusive_zone: 0, + size_limits: Limits::NONE + .min_width(1.0) + .min_height(1.0), }, - exclusive_zone: 0, - size_limits: Limits::NONE.min_width(1.0).min_height(1.0), - }, - None, + None, + ), ), )), #[cfg(all(feature = "wayland", feature = "desktop-applet"))] @@ -5795,7 +5925,9 @@ impl Application for App { }); } Message::Surface(action) => { - return cosmic::task::message(cosmic::Action::Surface(action)); + return cosmic::task::message(cosmic::Action::Cosmic( + cosmic::app::Action::Surface(action), + )); } Message::SaveSortNames => { self.must_save_sort_names = false; @@ -7011,6 +7143,23 @@ impl Application for App { fn view_window(&self, id: WindowId) -> Element<'_, Self::Message> { let content = match self.windows.get(&id) { Some(window) => match &window.kind { + WindowKind::ContextMenu(entity, id) => match self.tab_model.data::(*entity) { + Some(tab) => { + return widget::autosize::autosize( + menu::context_menu( + tab, + &self.key_binds, + &window.modifiers, + self.clipboard_has_content(), + &self.config.context_actions, + ) + .map(|x| Message::TabMessage(Some(*entity), x)), + id.clone(), + ) + .into(); + } + None => widget::text("Unknown tab ID").into(), + }, WindowKind::Desktop(entity) => { let mut tab_column = widget::column::with_capacity(3); @@ -7070,7 +7219,6 @@ impl Application for App { return self.view_main().map(|message| match message { cosmic::Action::App(app) => app, cosmic::Action::Cosmic(cosmic) => Message::Cosmic(cosmic), - cosmic::Action::Surface(action) => Message::Surface(action), cosmic::Action::None => Message::None, }); } diff --git a/src/config.rs b/src/config.rs index 3855b56..aeefafc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -150,7 +150,6 @@ pub enum TypeToSearch { #[serde(default)] pub struct State { pub sort_names: FxOrderMap, - pub dialog_sort_name: (HeadingOptions, bool), } impl Default for State { @@ -162,7 +161,6 @@ impl Default for State { (HeadingOptions::Modified, false), ) })), - dialog_sort_name: (HeadingOptions::Modified, false), } } } diff --git a/src/dialog.rs b/src/dialog.rs index ba2fd15..d60a837 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -3,7 +3,6 @@ use cosmic::app::cosmic::Cosmic; use cosmic::app::{Core, Task, context_drawer}; -use cosmic::cosmic_config::ConfigSet; use cosmic::iced::core::SmolStr; use cosmic::iced::core::widget::operation; use cosmic::iced::futures::{self, SinkExt}; @@ -33,13 +32,11 @@ use std::{env, fmt, fs}; use crate::app::{ Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind, REPLACE_BUTTON_ID, }; -use crate::config::{ - Config, DialogConfig, State, TIME_CONFIG_ID, ThumbCfg, TimeConfig, TypeToSearch, -}; +use crate::config::{Config, DialogConfig, TIME_CONFIG_ID, ThumbCfg, TimeConfig, TypeToSearch}; use crate::key_bind::key_binds; use crate::localize::LANGUAGE_SORTER; use crate::mounter::{MOUNTERS, MounterItem, MounterItems, MounterKey, MounterMessage}; -use crate::tab::{self, HeadingOptions, ItemMetadata, Location, SearchLocation, Tab}; +use crate::tab::{self, ItemMetadata, Location, SearchLocation, Tab}; use crate::zoom::{zoom_in_view, zoom_out_view, zoom_to_default}; use crate::{fl, home_dir, menu, mime_icon}; @@ -254,7 +251,6 @@ impl Dialog { crate::localize::localize(); let (config_handler, config) = Config::load(); - let (state_handler, state) = State::load(); let mut settings = window::Settings { decorations: false, @@ -289,8 +285,6 @@ impl Dialog { window_id, config_handler, config, - state_handler, - state, }; let (cosmic, cosmic_command) = Cosmic::::init((core, flags)); @@ -445,8 +439,6 @@ struct Flags { #[allow(dead_code)] config_handler: Option, config: Config, - state_handler: Option, - state: State, } /// Messages that are used specifically by our [`App`]. @@ -476,7 +468,7 @@ enum Message { SearchActivate, SearchClear, SearchInput(String), - Surface(cosmic::surface::Action), + Surface(cosmic::surface::Action), #[allow(clippy::enum_variant_names)] TabMessage(tab::Message), TabRescan( @@ -509,7 +501,7 @@ impl From for Message { AppMessage::ZoomIn(_entity_opt) => Self::ZoomIn, AppMessage::ZoomOut(_entity_opt) => Self::ZoomOut, AppMessage::NewItem(_entity_opt, true) => Self::NewFolder, - AppMessage::Surface(action) => Self::Surface(action.map(Self::from)), + AppMessage::Surface(action) => Self::Surface(action), unsupported => { log::warn!("{unsupported:?} not supported in dialog mode"); Self::None @@ -549,6 +541,7 @@ struct App { title: String, accept_label: DialogLabel, choices: Vec, + context_menu_window: Option, context_page: ContextPage, dialog_pages: VecDeque, dialog_text_input: widget::Id, @@ -878,6 +871,15 @@ impl App { } } + fn close_context_menus(&mut self) -> Task { + self.tab.location_context_menu_index = None; + if self.tab.context_menu.is_some() { + return self.update(Message::TabMessage(tab::Message::ContextMenu(None, None))); + } + + Task::none() + } + fn update_nav_model(&mut self) { let mut nav_model = segmented_button::ModelBuilder::default(); @@ -1041,7 +1043,8 @@ impl Application for App { None, ); tab.mode = tab::Mode::Dialog(flags.kind.clone()); - (tab.sort_name, tab.sort_direction) = flags.state.dialog_sort_name; + tab.sort_name = tab::HeadingOptions::Modified; + tab.sort_direction = false; let key_binds = key_binds(&tab.mode); @@ -1051,6 +1054,7 @@ impl Application for App { title, accept_label: DialogLabel::from(accept_label), choices: Vec::new(), + context_menu_window: None, context_page: ContextPage::Preview(None, PreviewKind::Selected), dialog_pages: VecDeque::new(), dialog_text_input: widget::Id::new("Dialog Text Input"), @@ -1321,6 +1325,15 @@ impl Application for App { return Task::none(); } + if self.tab.location_context_menu_index.is_some() { + self.tab.location_context_menu_index = None; + return Task::none(); + } + + if self.tab.context_menu.is_some() { + return self.update(Message::TabMessage(tab::Message::ContextMenu(None, None))); + } + if self.tab.edit_location.is_some() { // Close location editing if enabled self.tab.edit_location = None; @@ -1555,7 +1568,7 @@ impl Application for App { Message::Mouse(window_id, _button) => { // Close context menu when clicking outside. if self.core.main_window_id() == Some(window_id) { - return Task::none(); + return self.close_context_menus(); } } Message::NewFolder => { @@ -1715,7 +1728,7 @@ impl Application for App { ))); } Message::SearchActivate => { - let mut tasks = vec![]; + let mut tasks = vec![self.close_context_menus()]; if self.search_get().is_none() { tasks.push(self.search_set(Some(String::new()))); @@ -1726,7 +1739,7 @@ impl Application for App { return Task::batch(tasks); } Message::SearchClear => { - return self.search_set(None); + return Task::batch([self.close_context_menus(), self.search_set(None)]); } Message::SearchInput(input) => { return self.search_set(Some(input)); @@ -1762,9 +1775,94 @@ impl Application for App { self.rescan_tab(selection_paths), ])); } - tab::Command::Surface(action) => { - let action = action.map(Message::TabMessage); - commands.push(self.update(Message::Surface(action))); + tab::Command::ContextMenu(point_opt, parent_id) => { + #[cfg(feature = "wayland")] + match point_opt { + Some(point) => { + if crate::is_wayland() { + // Open context menu + use cctk::wayland_protocols::xdg::shell::client::xdg_positioner::{ + Anchor, Gravity, + }; + use cosmic::iced::runtime::platform_specific::wayland::popup::{ + SctkPopupSettings, SctkPositioner, + }; + use cosmic::iced::Rectangle; + use cosmic::widget::menu::StyleSheet as _; + + let window_id = window::Id::unique(); + self.context_menu_window = Some(window_id); + let autosize_id = widget::Id::unique(); + let t = self.core.system_theme(); + let styling = t.appearance( + &cosmic::theme::menu_bar::MenuBarStyle::Default, + false, + ); + let rad = styling.menu_border_radius; + commands.push(self.update(Message::Surface( + cosmic::surface::action::app_popup( + move |_| cosmic::surface::action::LiveSettings { + corners: Some(iced::runtime::platform_specific::wayland::CornerRadius { + top_left: rad[0] as u32, + top_right: rad[1] as u32, + bottom_left: rad[2] as u32, + bottom_right: rad[3] as u32, + }), + ..Default::default() + }, + move |app: &mut Self| -> SctkPopupSettings { + let anchor_rect = Rectangle { + x: point.x as i32, + y: point.y as i32, + width: 1, + height: 1, + }; + let positioner = SctkPositioner { + size: None, + anchor_rect, + anchor: Anchor::None, + gravity: Gravity::BottomRight, + reactive: true, + ..Default::default() + }; + SctkPopupSettings { + parent: parent_id + .unwrap_or(app.flags.window_id), + id: window_id, + positioner, + parent_size: None, + grab: true, + close_with_children: false, + input_zone: None, + } + }, + Some(Box::new(move |app: &Self| { + widget::autosize::autosize( + menu::context_menu( + &app.tab, + &app.key_binds, + &app.modifiers, + false, // Paste not used in dialogs + &app.flags.config.context_actions, + ) + .map(Message::TabMessage) + .map(cosmic::Action::App), + autosize_id.clone(), + ) + .into() + })), + ), + ))); + } + } + None => { + if let Some(window_id) = self.context_menu_window.take() { + commands.push(self.update(Message::Surface( + cosmic::surface::action::destroy_popup(window_id), + ))); + } + } + } } tab::Command::Iced(iced_command) => { commands.push(iced_command.0.map(|tab_message| { @@ -1799,17 +1897,6 @@ impl Application for App { self.auto_scroll_speed = None; } } - tab::Command::SetSort(_, heading_options, direction) => { - self.flags.state.dialog_sort_name = (heading_options, direction); - if let Some(state_handler) = self.flags.state_handler.as_ref() - && let Err(err) = state_handler.set::<&(HeadingOptions, bool)>( - "dialog_sort_name", - &self.flags.state.dialog_sort_name, - ) - { - log::warn!("Failed to save dialog sort name: {err:?}"); - } - } unsupported => { log::warn!("{unsupported:?} not supported in dialog mode"); } @@ -1930,7 +2017,9 @@ impl Application for App { }); } Message::Surface(action) => { - return cosmic::task::message(cosmic::Action::Surface(action)); + return cosmic::task::message(cosmic::Action::Cosmic( + cosmic::app::Action::Surface(action), + )); } } diff --git a/src/menu.rs b/src/menu.rs index 05998a4..0a4ffb2 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{Element, theme}; use cosmic::app::Core; +use cosmic::iced::advanced::widget::text::Style as TextStyle; use cosmic::iced::keyboard::Modifiers; -use cosmic::widget::menu::action::MenuAction; +use cosmic::iced::{Alignment, Background, Border, Length}; use cosmic::widget::menu::key_bind::KeyBind; use cosmic::widget::menu::{self, ItemHeight, ItemWidth, MenuBar}; -use cosmic::widget::{self, responsive_menu_bar}; +use cosmic::widget::{ + self, Row, button, column, container, divider, responsive_menu_bar, space, text, +}; +use cosmic::{Element, theme}; +#[cfg(feature = "desktop")] use i18n_embed::LanguageLoader; use mime_guess::Mime; use std::collections::HashMap; @@ -23,6 +27,21 @@ use crate::trash::{Trash, TrashExt}; static MENU_ID: LazyLock = LazyLock::new(|| cosmic::widget::Id::new("responsive-menu")); +macro_rules! menu_button { + ($($x:expr),+ $(,)?) => ( + button::custom( + Row::with_children( + [$(Element::from($x)),+] + ) + .height(Length::Fixed(24.0)) + .align_y(Alignment::Center) + ) + .padding([theme::spacing().space_xxs, 16]) + .width(Length::Fill) + .class(theme::Button::MenuItem) + ); +} + const fn menu_button_optional( label: String, action: Action, @@ -35,46 +54,82 @@ const fn menu_button_optional( } } -/// A menu action dispatched to the tab the menu was opened on. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub struct TabAction(pub Action); - -impl MenuAction for TabAction { - type Message = tab::Message; - - fn message(&self) -> tab::Message { - tab::Message::ContextAction(self.0) - } -} - pub fn context_menu<'a>( tab: &Tab, key_binds: &HashMap, modifiers: &Modifiers, clipboard_paste_available: bool, context_actions: &[ContextActionPreset], -) -> Vec> { - let menu_item = - |label: String, action: Action| menu::Item::Button(label, None, TabAction(action)); - let menu_item_disabled = - |label: String, action: Action| menu::Item::ButtonDisabled(label, None, TabAction(action)); +) -> Element<'a, tab::Message> { + let find_key = |action: &Action| -> String { + for (key_bind, key_action) in key_binds { + if action == key_action { + return key_bind.to_string(); + } + } + String::new() + }; + fn key_style(theme: &cosmic::Theme) -> TextStyle { + let mut color = theme.cosmic().background(theme.transparent).component.on; + color.alpha *= 0.75; + TextStyle { + color: Some(color.into()), + ..Default::default() + } + } + fn disabled_style(theme: &cosmic::Theme) -> TextStyle { + let mut color = theme.cosmic().background(theme.transparent).component.on; + color.alpha *= 0.5; + TextStyle { + color: Some(color.into()), + ..Default::default() + } + } + + let menu_item = |label, action| { + let key = find_key(&action); + menu_button!( + text::body(label), + space::horizontal(), + text::body(key).class(theme::Text::Custom(key_style)) + ) + .on_press(tab::Message::ContextAction(action)) + }; + + let menu_item_disabled = |label, action: Action| { + let key = find_key(&action); + menu_button!( + text::body(label).class(theme::Text::Custom(disabled_style)), + space::horizontal(), + text::body(key).class(theme::Text::Custom(disabled_style)) + ) + }; // Allow paste when clipboard has data and we're in a location that supports it let can_paste = clipboard_paste_available && tab.location.supports_paste(); let (sort_name, sort_direction, _) = tab.sort_options(); - let sort_item = |label: String, variant| { - let entry = menu::Entry::new(label, TabAction(Action::ToggleSort(variant))); - menu::Item::Entry(if sort_name == variant { + let sort_item = |label, variant| { + let key = find_key(&Action::ToggleSort(variant)); + let leading: Element<'a, tab::Message> = if sort_name == variant { let icon_name = if sort_direction { "view-sort-ascending-symbolic" } else { "view-sort-descending-symbolic" }; - entry.icon(widget::icon::from_name(icon_name).size(14).handle()) + widget::icon::from_name(icon_name).size(14).into() } else { - entry.reserve_icon() - }) + space::horizontal().width(Length::Fixed(14.0)).into() + }; + menu_button!( + leading, + space::horizontal().width(Length::Fixed(theme::spacing().space_xxs.into())), + text::body(label), + space::horizontal(), + text::body(key).class(theme::Text::Custom(key_style)) + ) + .on_press(tab::Message::ContextAction(Action::ToggleSort(variant))) + .into() }; let mut selected_dir = 0; @@ -119,8 +174,8 @@ pub fn context_menu<'a>( .iter() .enumerate() .filter(|(_, action)| action.matches_selection(selected, selected_dir)) - .map(|(i, action)| menu_item(action.name.clone(), Action::RunContextAction(i))) - .collect::>() + .map(|(i, action)| menu_item(action.name.clone(), Action::RunContextAction(i)).into()) + .collect::>>() }; // Parse the desktop entry if it is the only selection #[cfg(feature = "desktop")] @@ -135,7 +190,7 @@ pub fn context_menu<'a>( } }); - let mut children: Vec> = Vec::new(); + let mut children: Vec> = Vec::new(); match (&tab.mode, &tab.location) { ( tab::Mode::App | tab::Mode::Desktop, @@ -147,114 +202,108 @@ pub fn context_menu<'a>( | Location::Network(_, _, Some(_)), ) => { if selected_trash_only { - children.push(menu_item(fl!("open"), Action::Open)); + children.push(menu_item(fl!("open"), Action::Open).into()); if !Trash::is_empty() { - children.push(menu_item(fl!("empty-trash"), Action::EmptyTrash)); + children.push(menu_item(fl!("empty-trash"), Action::EmptyTrash).into()); } - } else if let Some(entry) = selected_desktop_entry { - children.push(menu_item(fl!("open"), Action::Open)); + } else if let Some(_entry) = selected_desktop_entry { + children.push(menu_item(fl!("open"), Action::Open).into()); #[cfg(feature = "desktop")] { - children.extend( - entry - .desktop_actions - .into_iter() - .enumerate() - .map(|(i, action)| menu_item(action.name, Action::ExecEntryAction(i))), - ); + children.extend(_entry.desktop_actions.into_iter().enumerate().map( + |(i, action)| menu_item(action.name, Action::ExecEntryAction(i)).into(), + )); } - children.push(menu_item(fl!("edit-desktop-entry"), Action::EditDesktopEntry)); - children.push(menu::Item::Divider); - children.push(menu_item(fl!("rename"), Action::Rename)); - children.push(menu_item(fl!("cut"), Action::Cut)); + children + .push(menu_item(fl!("edit-desktop-entry"), Action::EditDesktopEntry).into()); + children.push(divider::horizontal::light().into()); + children.push(menu_item(fl!("rename"), Action::Rename).into()); + children.push(menu_item(fl!("cut"), Action::Cut).into()); if modifiers.shift() && !modifiers.control() { - children.push(menu_item(fl!("copy-path"), Action::CopyPath)); + children.push(menu_item(fl!("copy-path"), Action::CopyPath).into()); } else { - children.push(menu_item(fl!("copy"), Action::Copy)); + children.push(menu_item(fl!("copy"), Action::Copy).into()); } // Should this simply bypass trash and remove the shortcut? - children.push(menu_item(fl!("move-to-trash"), Action::Delete)); + children.push(menu_item(fl!("move-to-trash"), Action::Delete).into()); let action_items = context_action_items(selected, selected_dir); if !action_items.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); children.extend(action_items); } } else if selected > 0 { if selected_dir == 1 && selected == 1 || selected_dir == 0 { - children.push(menu_item(fl!("open"), Action::Open)); + children.push(menu_item(fl!("open"), Action::Open).into()); } if selected == 1 { - children.push(menu_item(fl!("menu-open-with"), Action::OpenWith)); + children.push(menu_item(fl!("menu-open-with"), Action::OpenWith).into()); if selected_dir == 1 { - children.push(menu_item(fl!("open-in-terminal"), Action::OpenTerminal)); + children + .push(menu_item(fl!("open-in-terminal"), Action::OpenTerminal).into()); } } if tab.location.is_recents() || matches!(tab.location, Location::Search(..)) { - children.push(menu_item( - fl!("open-item-location"), - Action::OpenItemLocation, - )); + children.push( + menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(), + ); } // All selected items are directories if selected == selected_dir && matches!(tab.mode, tab::Mode::App) { - children.push(menu_item(fl!("open-in-new-tab"), Action::OpenInNewTab)); - children.push(menu_item( - fl!("open-in-new-window"), - Action::OpenInNewWindow, - )); + children.push(menu_item(fl!("open-in-new-tab"), Action::OpenInNewTab).into()); + children + .push(menu_item(fl!("open-in-new-window"), Action::OpenInNewWindow).into()); } let action_items = context_action_items(selected, selected_dir); if !action_items.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); children.extend(action_items); } - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); if selected_mount_point == 0 { - children.push(menu_item(fl!("rename"), Action::Rename)); - children.push(menu_item(fl!("cut"), Action::Cut)); + children.push(menu_item(fl!("rename"), Action::Rename).into()); + children.push(menu_item(fl!("cut"), Action::Cut).into()); } if modifiers.shift() && !modifiers.control() { - children.push(menu_item(fl!("copy-path"), Action::CopyPath)); + children.push(menu_item(fl!("copy-path"), Action::CopyPath).into()); } else { - children.push(menu_item(fl!("copy"), Action::Copy)); + children.push(menu_item(fl!("copy"), Action::Copy).into()); } if selected_mount_point == 0 { - children.push(menu_item(fl!("move-to"), Action::MoveTo)); + children.push(menu_item(fl!("move-to"), Action::MoveTo).into()); } - children.push(menu_item(fl!("copy-to"), Action::CopyTo)); + children.push(menu_item(fl!("copy-to"), Action::CopyTo).into()); - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); let supported_archive_types = crate::archive::SUPPORTED_ARCHIVE_TYPES; selected_types.retain(|t| supported_archive_types.iter().copied().all(|m| *t != m)); if selected_types.is_empty() { - children.push(menu_item(fl!("extract-here"), Action::ExtractHere)); - children.push(menu_item(fl!("extract-to"), Action::ExtractTo)); + children.push(menu_item(fl!("extract-here"), Action::ExtractHere).into()); + children.push(menu_item(fl!("extract-to"), Action::ExtractTo).into()); } - children.push(menu_item(fl!("compress"), Action::Compress)); - children.push(menu::Item::Divider); + children.push(menu_item(fl!("compress"), Action::Compress).into()); + children.push(divider::horizontal::light().into()); //TODO: Print? - children.push(menu_item(fl!("show-details"), Action::Preview)); + children.push(menu_item(fl!("show-details"), Action::Preview).into()); if any_trash_item { - children.push(menu::Item::Divider); - children.push(menu_item( - fl!("restore-from-trash"), - Action::RestoreFromTrash, - )); - children.push(menu::Item::Divider); - children.push(menu_item(fl!("delete-permanently"), Action::Delete)); + children.push(divider::horizontal::light().into()); + children.push( + menu_item(fl!("restore-from-trash"), Action::RestoreFromTrash).into(), + ); + children.push(divider::horizontal::light().into()); + children.push(menu_item(fl!("delete-permanently"), Action::Delete).into()); } else { if matches!(tab.mode, tab::Mode::App) { - children.push(menu::Item::Divider); - children.push(menu_item(fl!("add-to-sidebar"), Action::AddToSidebar)); + children.push(divider::horizontal::light().into()); + children + .push(menu_item(fl!("add-to-sidebar"), Action::AddToSidebar).into()); } - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); if tab.location.is_recents() { - children.push(menu_item( - fl!("remove-from-recents"), - Action::RemoveFromRecents, - )); - children.push(menu::Item::Divider); + children.push( + menu_item(fl!("remove-from-recents"), Action::RemoveFromRecents).into(), + ); + children.push(divider::horizontal::light().into()); } if selected_mount_point == 0 { if modifiers.shift() && !modifiers.control() { @@ -263,59 +312,55 @@ pub fn context_menu<'a>( .into(), ); } else { - children.push(menu_item(fl!("move-to-trash"), Action::Delete)); + children.push(menu_item(fl!("move-to-trash"), Action::Delete).into()); } } else if selected == 1 { - children.push(menu_item(fl!("eject"), Action::Eject)); + children.push(menu_item(fl!("eject"), Action::Eject).into()); } } } else { //TODO: need better designs for menu with no selection //TODO: have things like properties but they apply to the folder? if tab.location != Location::Recents { - children.push(menu_item(fl!("new-folder"), Action::NewFolder)); - children.push(menu_item(fl!("new-file"), Action::NewFile)); - children.push(menu_item(fl!("open-in-terminal"), Action::OpenTerminal)); - children.push(menu::Item::Divider); + children.push(menu_item(fl!("new-folder"), Action::NewFolder).into()); + children.push(menu_item(fl!("new-file"), Action::NewFile).into()); + children.push(menu_item(fl!("open-in-terminal"), Action::OpenTerminal).into()); + children.push(divider::horizontal::light().into()); } if tab.mode.multiple() { - children.push(menu_item(fl!("select-all"), Action::SelectAll)); + children.push(menu_item(fl!("select-all"), Action::SelectAll).into()); } if can_paste { - children.push(menu_item(fl!("paste"), Action::Paste)); + children.push(menu_item(fl!("paste"), Action::Paste).into()); } else { - children.push(menu_item_disabled(fl!("paste"), Action::Paste)); + children.push(menu_item_disabled(fl!("paste"), Action::Paste).into()); } //TODO: only show if cosmic-settings is found? if matches!(tab.mode, tab::Mode::Desktop) { - children.push(menu::Item::Divider); - children.push(menu_item( - fl!("change-wallpaper"), - Action::CosmicSettingsWallpaper, - )); - children.push(menu_item( - fl!("desktop-appearance"), - Action::CosmicSettingsDesktop, - )); - children.push(menu_item( - fl!("display-settings"), - Action::CosmicSettingsDisplays, - )); + children.push(divider::horizontal::light().into()); + children.push( + menu_item(fl!("change-wallpaper"), Action::CosmicSettingsWallpaper).into(), + ); + children.push( + menu_item(fl!("desktop-appearance"), Action::CosmicSettingsDesktop).into(), + ); + children.push( + menu_item(fl!("display-settings"), Action::CosmicSettingsDisplays).into(), + ); } - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); // TODO: Nested menu children.push(sort_item(fl!("sort-by-name"), HeadingOptions::Name)); children.push(sort_item(fl!("sort-by-modified"), HeadingOptions::Modified)); children.push(sort_item(fl!("sort-by-size"), HeadingOptions::Size)); if matches!(tab.location, Location::Desktop(..)) { - children.push(menu::Item::Divider); - children.push(menu_item( - fl!("desktop-view-options"), - Action::DesktopViewOptions, - )); + children.push(divider::horizontal::light().into()); + children.push( + menu_item(fl!("desktop-view-options"), Action::DesktopViewOptions).into(), + ); } } } @@ -330,25 +375,24 @@ pub fn context_menu<'a>( ) => { if selected > 0 { if selected_dir == 1 && selected == 1 || selected_dir == 0 { - children.push(menu_item(fl!("open"), Action::Open)); + children.push(menu_item(fl!("open"), Action::Open).into()); } if matches!(tab.location, Location::Search(..)) || tab.location.is_recents() { - children.push(menu_item( - fl!("open-item-location"), - Action::OpenItemLocation, - )); + children.push( + menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(), + ); } - children.push(menu::Item::Divider); - children.push(menu_item(fl!("show-details"), Action::Preview)); + children.push(divider::horizontal::light().into()); + children.push(menu_item(fl!("show-details"), Action::Preview).into()); } else { if dialog_kind.save() { - children.push(menu_item(fl!("new-folder"), Action::NewFolder)); + children.push(menu_item(fl!("new-folder"), Action::NewFolder).into()); } if tab.mode.multiple() { - children.push(menu_item(fl!("select-all"), Action::SelectAll)); + children.push(menu_item(fl!("select-all"), Action::SelectAll).into()); } if !children.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); } children.push(sort_item(fl!("sort-by-name"), HeadingOptions::Name)); children.push(sort_item(fl!("sort-by-modified"), HeadingOptions::Modified)); @@ -358,14 +402,14 @@ pub fn context_menu<'a>( (_, Location::Network(..)) => { if selected > 0 { if selected_dir == 1 && selected == 1 || selected_dir == 0 { - children.push(menu_item(fl!("open"), Action::Open)); + children.push(menu_item(fl!("open"), Action::Open).into()); } } else { if tab.mode.multiple() { - children.push(menu_item(fl!("select-all"), Action::SelectAll)); + children.push(menu_item(fl!("select-all"), Action::SelectAll).into()); } if !children.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); } children.push(sort_item(fl!("sort-by-name"), HeadingOptions::Name)); children.push(sort_item(fl!("sort-by-modified"), HeadingOptions::Modified)); @@ -374,26 +418,24 @@ pub fn context_menu<'a>( } (_, Location::Trash | Location::Search(SearchLocation::Trash, ..)) => { if tab.mode.multiple() { - children.push(menu_item(fl!("select-all"), Action::SelectAll)); + children.push(menu_item(fl!("select-all"), Action::SelectAll).into()); } if !Trash::is_empty() { if !children.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); } - children.push(menu_item(fl!("empty-trash"), Action::EmptyTrash)); + children.push(menu_item(fl!("empty-trash"), Action::EmptyTrash).into()); } if !children.is_empty() { - children.push(menu::Item::Divider); + children.push(divider::horizontal::light().into()); } if selected > 0 { - children.push(menu_item(fl!("show-details"), Action::Preview)); - children.push(menu::Item::Divider); - children.push(menu_item( - fl!("restore-from-trash"), - Action::RestoreFromTrash, - )); - children.push(menu::Item::Divider); - children.push(menu_item(fl!("delete-permanently"), Action::Delete)); + children.push(menu_item(fl!("show-details"), Action::Preview).into()); + children.push(divider::horizontal::light().into()); + children + .push(menu_item(fl!("restore-from-trash"), Action::RestoreFromTrash).into()); + children.push(divider::horizontal::light().into()); + children.push(menu_item(fl!("delete-permanently"), Action::Delete).into()); } else { // TODO: Nested menu children.push(sort_item(fl!("sort-by-name"), HeadingOptions::Name)); @@ -403,11 +445,26 @@ pub fn context_menu<'a>( } } - let key_binds: HashMap = key_binds - .iter() - .map(|(key_bind, action)| (key_bind.clone(), TabAction(*action))) - .collect(); - menu::items(&key_binds, children) + container(cosmic::widget::menu::menu_column::MenuColumn::with_children(children)) + .padding(1) + //TODO: move style to libcosmic + .style(|theme| { + let cosmic = theme.cosmic(); + let component = &cosmic.background(theme.transparent); + container::Style { + icon_color: Some(component.on.into()), + text_color: Some(component.on.into()), + background: Some(Background::Color(component.base.into())), + border: Border { + radius: cosmic.radius_s().map(|x| x + 1.0).into(), + width: 1.0, + color: component.divider.into(), + }, + ..Default::default() + } + }) + .width(Length::Fixed(360.0)) + .into() } pub fn dialog_menu( @@ -756,33 +813,50 @@ pub fn menu_bar<'a>( ) } -pub fn location_context_menu(ancestor_index: usize) -> Vec> { +pub fn location_context_menu<'a>(ancestor_index: usize) -> Element<'a, tab::Message> { //TODO: only add some of these when in App mode - menu::items( - &HashMap::new(), - vec![ - menu::Item::Button( - fl!("open-in-new-tab"), - None, + let children = [ + menu_button!(text::body(fl!("open-in-new-tab"))) + .on_press(tab::Message::LocationMenuAction( LocationMenuAction::OpenInNewTab(ancestor_index), - ), - menu::Item::Button( - fl!("open-in-new-window"), - None, + )) + .into(), + menu_button!(text::body(fl!("open-in-new-window"))) + .on_press(tab::Message::LocationMenuAction( LocationMenuAction::OpenInNewWindow(ancestor_index), - ), - menu::Item::Divider, - menu::Item::Button( - fl!("show-details"), - None, + )) + .into(), + divider::horizontal::light().into(), + menu_button!(text::body(fl!("show-details"))) + .on_press(tab::Message::LocationMenuAction( LocationMenuAction::Preview(ancestor_index), - ), - menu::Item::Divider, - menu::Item::Button( - fl!("add-to-sidebar"), - None, + )) + .into(), + divider::horizontal::light().into(), + menu_button!(text::body(fl!("add-to-sidebar"))) + .on_press(tab::Message::LocationMenuAction( LocationMenuAction::AddToSidebar(ancestor_index), - ), - ], - ) + )) + .into(), + ]; + + container(column::with_children(children)) + .padding(1) + .style(|theme| { + let cosmic = theme.cosmic(); + let component = &cosmic.background(theme.transparent).component; + container::Style { + icon_color: Some(component.on.into()), + text_color: Some(component.on.into()), + background: Some(Background::Color(component.base.into())), + border: Border { + radius: cosmic.radius_s().map(|x| x + 1.0).into(), + width: 1.0, + color: component.divider.into(), + }, + ..Default::default() + } + }) + .width(Length::Fixed(360.0)) + .into() } diff --git a/src/mouse_area.rs b/src/mouse_area.rs index cbb7bbb..73bd710 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -214,9 +214,8 @@ impl<'a, Message, F> OnAutoScroll<'a, Message> for F where F: Fn(Option) -> pub trait OnMouseButton<'a, Message>: Fn(Option) -> Message + 'a {} impl<'a, Message, F> OnMouseButton<'a, Message> for F where F: Fn(Option) -> Message + 'a {} -pub trait OnDrag<'a, Message>: Fn(Option) -> Option + 'a {} -impl<'a, Message, F> OnDrag<'a, Message> for F where F: Fn(Option) -> Option + 'a -{} +pub trait OnDrag<'a, Message>: Fn(Option) -> Message + 'a {} +impl<'a, Message, F> OnDrag<'a, Message> for F where F: Fn(Option) -> Message + 'a {} pub trait OnResize<'a, Message>: Fn(Rectangle) -> Message + 'a {} impl<'a, Message, F> OnResize<'a, Message> for F where F: Fn(Rectangle) -> Message + 'a {} @@ -564,16 +563,6 @@ fn update( state.last_position = position_in; } - if state.drag_initiated.is_some() - && matches!( - event, - Event::Mouse(mouse::Event::CursorMoved { .. }) - | Event::Touch(touch::Event::FingerMoved { .. }) - ) - { - shell.request_redraw(); - } - if let Event::Mouse(mouse::Event::CursorMoved { position }) = event { let virtual_position = Point::new( viewport.x - layout_bounds.x + position.x, @@ -650,7 +639,6 @@ fn update( { state.drag_initiated = None; state.prev_click = None; - shell.request_redraw(); if let Some(message) = widget.on_drag_end.as_ref() { shell.publish(message(cursor.position_in(layout_bounds))); } @@ -670,9 +658,7 @@ fn update( state.prev_click = None; return; } - if state.drag_initiated.take().is_some() { - shell.request_redraw(); - } + state.drag_initiated = None; if let Some(message) = widget.on_release.as_ref() { shell.publish(message(cursor.position_in(layout_bounds))); @@ -799,13 +785,12 @@ fn update( } if let Some((message, drag_rect)) = widget.on_drag.as_ref().zip(state.drag_rect(cursor)) { - let rect_opt = drag_rect.intersection(&layout_bounds).map(|mut rect| { - rect.x -= layout_bounds.x; - rect.y -= layout_bounds.y; - rect - }); - if let Some(message) = message(rect_opt) { - shell.publish(message); - } + shell.publish(message(drag_rect.intersection(&layout_bounds).map( + |mut rect| { + rect.x -= layout_bounds.x; + rect.y -= layout_bounds.y; + rect + }, + ))); } } diff --git a/src/operation/recursive.rs b/src/operation/recursive.rs index eb141b8..00df0b4 100644 --- a/src/operation/recursive.rs +++ b/src/operation/recursive.rs @@ -480,9 +480,7 @@ impl Op { #[cfg(not(feature = "gvfs"))] Err(why) => { _ = from_file.close().await; - return Err(why) - .with_context(|| format!("failed to open {} for writing", self.to.display())) - .map_err(Into::into); + return Err(why).with_context(|| format!("failed to open {} for writing", self.to.display())).map_err(Into::into); } #[cfg(feature = "gvfs")] Err(_why) => { diff --git a/src/tab.rs b/src/tab.rs index 93f3293..635e2d1 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -1757,11 +1757,11 @@ impl fmt::Debug for TaskWrapper { #[derive(Debug)] pub enum Command { Action(Action), - Surface(cosmic::surface::Action), AddNetworkDrive, AddToSidebar(PathBuf), AutoScroll(Option), ChangeLocation(String, Location, Option>), + ContextMenu(Option, Option), Delete(Vec), DropFiles(PathBuf, ClipboardPaste), ClearRecents, @@ -1792,9 +1792,9 @@ pub enum Message { ClickRelease(Option), Config(TabConfig), ContextAction(Action), - RightClickBackground, - Surface(cosmic::surface::Action), - LocationContextMenuIndex(Option), + ContextMenu(Option, Option), + LocationContextMenuPoint(Option), + LocationContextMenuIndex(Option, Option), LocationMenuAction(LocationMenuAction), Drag(Option), DragEnd, @@ -2820,8 +2820,9 @@ pub struct Tab { pub location: Location, pub location_ancestors: Vec<(Location, String)>, pub location_title: String, - /// Breadcrumb whose context menu is open, drawn as active while it shows + pub location_context_menu_point: Option, pub location_context_menu_index: Option, + pub context_menu: Option, pub mode: Mode, pub scroll_opt: Option, pub size_opt: Cell>, @@ -2849,6 +2850,7 @@ pub struct Tab { search_context: Option, date_time_formatter: DateTimeFormatter, time_formatter: DateTimeFormatter, + watch_drag: bool, window_id: Option, large_image_manager: LargeImageManager, } @@ -2965,6 +2967,8 @@ impl Tab { location, location_ancestors, location_title, + context_menu: None, + location_context_menu_point: None, location_context_menu_index: None, mode: Mode::App, scroll_opt: None, @@ -2993,6 +2997,7 @@ impl Tab { search_context: None, date_time_formatter: date_time_formatter(config.military_time), time_formatter: time_formatter(config.military_time), + watch_drag: true, window_id, large_image_manager: LargeImageManager::new(), } @@ -3505,6 +3510,7 @@ impl Tab { self.location = location.normalize(); self.location_ancestors = self.location.ancestors(); self.location_title = self.location.title(); + self.context_menu = None; self.edit_location = None; self.items_opt = None; //TODO: remember scroll by location? @@ -3549,6 +3555,7 @@ impl Tab { let mut history_i_opt = None; let mod_ctrl = modifiers.contains(Modifiers::CTRL) && self.mode.multiple(); let mod_shift = modifiers.contains(Modifiers::SHIFT) && self.mode.multiple(); + let last_context_menu = self.context_menu; match message { Message::AddNetworkDrive => { commands.push(Command::AddNetworkDrive); @@ -3583,6 +3590,8 @@ impl Tab { } if click_i_opt != self.clicked.take() { + self.context_menu = None; + self.location_context_menu_index = None; if let Some(ref mut items) = self.items_opt { for (i, item) in items.iter_mut().enumerate() { if mod_ctrl { @@ -3599,6 +3608,7 @@ impl Tab { } Message::DragEnd => { self.clicked = None; + self.watch_drag = true; } Message::DoubleClick(click_i_opt) => { if let Some(clicked_item) = self @@ -3623,7 +3633,9 @@ impl Tab { } Message::Click(click_i_opt) => { self.selected_clicked = false; + self.context_menu = None; self.edit_location = None; + self.location_context_menu_index = None; if click_i_opt.is_none() { self.clicked = click_i_opt; } @@ -3765,16 +3777,24 @@ impl Tab { } } Message::ContextAction(action) => { + // Close context menu + self.context_menu = None; + commands.push(Command::Action(action)); } Message::RunContextAction(action) => { + self.context_menu = None; + commands.push(Command::RunContextAction(action)); } - Message::RightClickBackground => { + Message::ContextMenu(point_opt, _) => { self.edit_location = None; + self.context_menu = point_opt; + self.location_context_menu_index = None; //TODO: hack for clearing selecting when right clicking empty space - if self.last_right_click.take().is_none() + if self.context_menu.is_some() + && self.last_right_click.take().is_none() && let Some(ref mut items) = self.items_opt { for item in items.iter_mut() { @@ -3782,13 +3802,17 @@ impl Tab { } } } - Message::Surface(action) => { - commands.push(Command::Surface(action)); + Message::LocationContextMenuPoint(point_opt) => { + self.context_menu = None; + self.location_context_menu_point = point_opt; } - Message::LocationContextMenuIndex(index) => { - self.location_context_menu_index = index; + Message::LocationContextMenuIndex(p, index_opt) => { + self.context_menu = None; + self.location_context_menu_point = p; + self.location_context_menu_index = index_opt; } Message::LocationMenuAction(action) => { + self.location_context_menu_index = None; let path_for_index = |ancestor_index| { self.location .path_opt() @@ -3838,7 +3862,10 @@ impl Tab { } } Message::Drag(rect_opt) => { + self.watch_drag = false; if let Some(rect) = rect_opt { + self.context_menu = None; + self.location_context_menu_index = None; if self.mode.multiple() { self.select_rect(rect, mod_ctrl, mod_shift); } @@ -4475,11 +4502,13 @@ impl Tab { } } Message::HighlightDeactivate(i) => { + self.watch_drag = true; if let Some(item) = self.items_opt.as_mut().and_then(|f| f.get_mut(i)) { item.highlighted = false; } } Message::HighlightActivate(i) => { + self.watch_drag = true; if let Some(item) = self.items_opt.as_mut().and_then(|f| f.get_mut(i)) { item.highlighted = true; } @@ -4505,6 +4534,7 @@ impl Tab { } Message::Scroll(viewport) => { self.scroll_opt = Some(viewport.absolute_offset()); + self.watch_drag = true; } Message::ScrollTab(scroll_speed) => { commands.push(Command::Iced( @@ -4957,6 +4987,16 @@ impl Tab { } } + // Update context menu popup + if self.context_menu != last_context_menu { + if last_context_menu.is_some() { + commands.push(Command::ContextMenu(None, self.window_id)); + } + if let Some(point) = self.context_menu { + commands.push(Command::ContextMenu(Some(point), self.window_id)); + } + } + commands } @@ -5567,14 +5607,10 @@ impl Tab { } let location = self.location.with_path(ancestor.to_path_buf()); - let mouse_area = crate::mouse_area::MouseArea::new( + let mut mouse_area = crate::mouse_area::MouseArea::new( widget::button::custom(row) .padding(space_xxxs) - .class(if self.location_context_menu_index == Some(index) { - theme::Button::LinkActive - } else { - theme::Button::Link - }) + .class(theme::Button::Link) .on_press(if ancestor == path { Message::EditLocation(Some(self.location.clone().into())) } else { @@ -5582,6 +5618,21 @@ impl Tab { }), ); + if self.location_context_menu_index.is_some() { + mouse_area = mouse_area + .on_right_press(move |point_opt| { + Message::LocationContextMenuIndex(point_opt, None) + }) + .wayland_on_right_press_window_position(); + } else { + mouse_area = mouse_area + .on_right_press_no_capture() + .on_right_press(move |point_opt| { + Message::LocationContextMenuIndex(point_opt, Some(index)) + }) + .wayland_on_right_press_window_position(); + } + let mouse_area = if let Location::Path(_) = &self.location { mouse_area .on_middle_press(move |_| Message::OpenInNewTab(ancestor.to_path_buf())) @@ -5589,16 +5640,7 @@ impl Tab { mouse_area }; - // Each breadcrumb carries the menu for its own ancestor index - let mut context_menu = - widget::context_menu(mouse_area, Some(menu::location_context_menu(index))) - .on_open(Message::LocationContextMenuIndex(Some(index))) - .on_close(Message::LocationContextMenuIndex(None)) - .on_surface_action(Message::Surface); - if let Some(window_id) = self.window_id { - context_menu = context_menu.window_id(window_id); - } - children.push(self.dnd_dest(&location, context_menu)); + children.push(self.dnd_dest(&location, mouse_area)); if found_home || overflow { break; @@ -5649,7 +5691,20 @@ impl Tab { column = column.push(heading_rule); } - column.into() + let mouse_area = crate::mouse_area::MouseArea::new(column) + .on_right_press(Message::LocationContextMenuPoint); + + let mut popover = widget::popover(mouse_area); + if let (Some(point), Some(index)) = ( + self.location_context_menu_point, + self.location_context_menu_index, + ) { + popover = popover + .popup(menu::location_context_menu(index)) + .position(widget::popover::Position::Point(point)); + } + + popover.into() } pub fn empty_view(&self, has_hidden: bool) -> Element<'_, Message> { @@ -5838,13 +5893,18 @@ impl Tab { .height(Length::Fixed(item_height as f32)) .width(Length::Fixed(item_width as f32)); for button in buttons { - column = column.push( - mouse_area::MouseArea::new(button) - .on_right_press_no_capture() - .on_right_press(move |point_opt| { - Message::RightClick(point_opt, Some(i)) - }), - ); + if self.context_menu.is_some() { + column = column.push(button); + } else { + column = column.push( + mouse_area::MouseArea::new(button) + .on_right_press_no_capture() + .wayland_on_right_press_window_position() + .on_right_press(move |point_opt| { + Message::RightClick(point_opt, Some(i)) + }), + ); + } } let column: Element = @@ -6011,13 +6071,15 @@ impl Tab { Element::from(dnd_grid) }); - let mouse_area = mouse_area::MouseArea::new(column.width(Length::Fill)) + let mut mouse_area = mouse_area::MouseArea::new(column.width(Length::Fill)) .on_press(|_| Message::Click(None)) .on_auto_scroll(Message::AutoScroll) - .on_drag(move |rect_opt| self.on_drag(rect_opt)) .on_drag_end(|_| Message::DragEnd) .show_drag_rect(self.mode.multiple()) .on_release(|_| Message::ClickRelease(None)); + if self.watch_drag { + mouse_area = mouse_area.on_drag(Message::Drag); + } (drag_list, mouse_area.into(), true) } @@ -6247,33 +6309,39 @@ impl Tab { .spacing(space_xxs) }; - let button = - |row| { - let mouse_area = crate::mouse_area::MouseArea::new( - widget::button::custom(row) - .width(Length::Fill) - .id(item.button_id.clone()) - .padding([0, space_xxs]) - .class(button_style( - item.selected, - item.highlighted, - item.cut, - true, - true, - false, - )), - ) - .on_press(move |_| Message::Click(Some(i))) - .on_double_click(move |_| Message::DoubleClick(Some(i))) - .on_release(move |_| Message::ClickRelease(Some(i))) - .on_middle_press(move |_| Message::MiddleClick(i)) - .on_enter(move || Message::HighlightActivate(i)) - .on_exit(move || Message::HighlightDeactivate(i)); + let button = |row| { + let mouse_area = crate::mouse_area::MouseArea::new( + widget::button::custom(row) + .width(Length::Fill) + .id(item.button_id.clone()) + .padding([0, space_xxs]) + .class(button_style( + item.selected, + item.highlighted, + item.cut, + true, + true, + false, + )), + ) + .on_press(move |_| Message::Click(Some(i))) + .on_double_click(move |_| Message::DoubleClick(Some(i))) + .on_release(move |_| Message::ClickRelease(Some(i))) + .on_middle_press(move |_| Message::MiddleClick(i)) + .on_enter(move || Message::HighlightActivate(i)) + .on_exit(move || Message::HighlightDeactivate(i)); - mouse_area.on_right_press_no_capture().on_right_press( - move |point_opt| Message::RightClick(point_opt, Some(i)), - ) - }; + if self.context_menu.is_some() { + mouse_area + } else { + mouse_area + .on_right_press_no_capture() + .wayland_on_right_press_window_position() + .on_right_press(move |point_opt| { + Message::RightClick(point_opt, Some(i)) + }) + } + }; let button_row = button(row.into()); let button_row: Element<_> = if item.metadata.is_dir() @@ -6401,14 +6469,16 @@ impl Tab { let drag_col = (!drag_items.is_empty()) .then(|| Element::from(widget::column::with_children(drag_items))); - let mouse_area = mouse_area::MouseArea::new(column.padding([0, space_s])) + let mut mouse_area = mouse_area::MouseArea::new(column.padding([0, space_s])) .with_id(Id::new("list-view")) .on_press(|_| Message::Click(None)) .on_auto_scroll(Message::AutoScroll) - .on_drag(move |rect_opt| self.on_drag(rect_opt)) .on_drag_end(|_| Message::DragEnd) .show_drag_rect(self.mode.multiple()) .on_release(|_| Message::ClickRelease(None)); + if self.watch_drag { + mouse_area = mouse_area.on_drag(Message::Drag); + } (drag_col, mouse_area.into(), true) } @@ -6495,47 +6565,51 @@ impl Tab { .on_back_press(move |_point_opt| Message::GoPrevious) .on_forward_press(move |_point_opt| Message::GoNext) .on_scroll(|delta| respond_to_scroll_direction(delta, modifiers)) - .on_right_press(|_| Message::RightClickBackground); + .on_right_press(move |p| { + Message::ContextMenu( + if self.context_menu.is_some() { None } else { p }, + self.window_id, + ) + }) + .wayland_on_right_press_window_position(); - let items_area: Element<'_, Message> = if can_scroll { - // 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(mouse_area) - .id(self.scrollable_id.clone()) - .on_scroll(Message::Scroll) - .width(Length::Fill) - .height(Length::Fill), - widget::Id::new(format!("{}-scrollable", self.scrollable_id)), - ) - .into() - } else { - mouse_area.into() - }; - - // Wrap the scrollable, not its content, so the popup anchors in window coordinates - let mut context_menu = widget::context_menu( - items_area, - Some(menu::context_menu( + let mut popover = widget::popover(mouse_area); + if let Some(point) = self.context_menu + && (!cfg!(feature = "wayland") || !crate::is_wayland()) + { + let context_menu = menu::context_menu( self, key_binds, modifiers, clipboard_paste_available, context_actions, - )), - ) - .item_width(cosmic::widget::menu::ItemWidth::Uniform(360)) - .on_surface_action(Message::Surface); - if let Some(window_id) = self.window_id { - context_menu = context_menu.window_id(window_id); + ); + popover = popover + .popup(context_menu) + .position(widget::popover::Position::Point(point)); } let mut tab_column = widget::column::with_capacity(3); if let Some(location_view) = location_view_opt { tab_column = tab_column.push(location_view); } - tab_column = tab_column.push(context_menu); + if can_scroll { + tab_column = tab_column.push( + // 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); + } match &self.location { Location::Trash | Location::Search(SearchLocation::Trash, ..) => { if let Some(items) = self.items_opt() @@ -7097,7 +7171,8 @@ impl Tab { let path = path.clone(); // Acquire semaphore permit - let _permit = THUMB_SEMAPHORE.acquire().await.unwrap(); + let _permit = + THUMB_SEMAPHORE.acquire().await.unwrap(); tokio::task::spawn_blocking(move || { let start = Instant::now(); @@ -7401,19 +7476,6 @@ impl Tab { const fn format_time(&self, time: SystemTime) -> FormatTime<'_> { format_time(time, &self.date_time_formatter, &self.time_formatter) } - - fn on_drag<'a>(&self, rect_opt: Option) -> Option { - let rect = rect_opt?; - // We only want to publish a drag message if the overlapped items of the drag rect change, - // otherwise a view rebuild is triggered on every drag event. - let changed = self.items_opt.as_ref().is_some_and(|items| { - items.iter().any(|item| { - let overlaps = item.rect_opt.get().is_some_and(|r| r.intersects(&rect)); - overlaps != item.overlaps_drag_rect - }) - }); - changed.then_some(Message::Drag(Some(rect))) - } } pub fn respond_to_scroll_direction(delta: ScrollDelta, modifiers: &Modifiers) -> Option { diff --git a/src/thumbnailer.rs b/src/thumbnailer.rs index a31af6b..8e61447 100644 --- a/src/thumbnailer.rs +++ b/src/thumbnailer.rs @@ -175,25 +175,3 @@ pub fn thumbnailer(mime: &Mime) -> Vec { let thumbnailer_cache = THUMBNAILER_CACHE.lock().unwrap(); thumbnailer_cache.get(mime) } - -#[cfg(all(test, feature = "desktop"))] -mod tests { - use super::Thumbnailer; - use std::path::Path; - - #[test] - fn command_expands_thumbnailer_arguments() { - let thumbnailer = Thumbnailer { - exec: "cosmic-files-thumbnailer %o --size %s %i".to_string(), - }; - - let command = thumbnailer - .command(Path::new("input.exe"), Path::new("output.png"), 128) - .expect("valid thumbnailer command"); - assert_eq!(command.get_program(), "cosmic-files-thumbnailer"); - assert_eq!( - command.get_args().collect::>(), - ["output.png", "--size", "128", "input.exe"] - ); - } -}