From 7945b9ffc623949ca0c30a30256228e66af3781c Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 2 Sep 2026 08:16:02 -0600 Subject: [PATCH 01/14] Epoch 1.8.0 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 232 ++++++++++++++++++++--------------------------- Cargo.toml | 2 +- debian/changelog | 6 ++ 3 files changed, 105 insertions(+), 135 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index edda1ed..6fa7b10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,24 +109,13 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" -version = "0.8.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" dependencies = [ - "cfg-if", - "cipher 0.4.4", - "cpufeatures 0.2.17", -] - -[[package]] -name = "aes" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" -dependencies = [ - "cipher 0.5.2", + "cipher", "cpubits", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", ] [[package]] @@ -720,11 +709,11 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -760,9 +749,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" +checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" dependencies = [ "bytes", "cfg_aliases", @@ -801,7 +790,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "cfg_aliases", ] @@ -908,11 +897,11 @@ dependencies = [ [[package]] name = "cbc" -version = "0.1.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896" dependencies = [ - "cipher 0.4.4", + "cipher", ] [[package]] @@ -963,16 +952,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout 0.1.4", -] - [[package]] name = "cipher" version = "0.5.2" @@ -980,7 +959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ "crypto-common 0.2.2", - "inout 0.2.2", + "inout", ] [[package]] @@ -1082,9 +1061,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" -version = "4.6.7" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ "bytes", "memchr", @@ -1339,7 +1318,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1360,7 +1339,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "quote", "syn 2.0.119", @@ -1368,8 +1347,8 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.6.0" -source = "git+https://github.com/pop-os/cosmic-files.git#b46b77f3a7a162a0ea625fa156ea4d7df4e9d062" +version = "1.7.0" +source = "git+https://github.com/pop-os/cosmic-files.git#06278ee7f178a974d79e9603264fefaab1756882" dependencies = [ "anyhow", "atomic_float", @@ -1464,7 +1443,7 @@ dependencies = [ [[package]] name = "cosmic-term" -version = "1.7.0" +version = "1.8.0" dependencies = [ "alacritty_terminal", "clap_lex", @@ -1520,7 +1499,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "almost", "configparser", @@ -1552,9 +1531,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] @@ -1796,7 +1775,6 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "crypto-common 0.1.7", - "subtle", ] [[package]] @@ -2107,7 +2085,7 @@ dependencies = [ "bit_field", "half", "lebe", - "miniz_oxide", + "miniz_oxide 0.8.9", "num-complex", "pulp", "rayon-core", @@ -2183,12 +2161,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.9.1", "zlib-rs", ] @@ -2757,9 +2735,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -2786,20 +2764,11 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "hkdf" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", + "hmac", ] [[package]] @@ -2923,7 +2892,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "dnd", @@ -2945,7 +2914,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "accesskit", "accesskit_winit", @@ -2954,7 +2923,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bitflags 2.13.1", "build_helpers", @@ -2980,7 +2949,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_core", "iced_futures", @@ -2990,7 +2959,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "futures", "iced_core", @@ -3004,7 +2973,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bitflags 2.13.1", "bytemuck", @@ -3025,7 +2994,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_graphics", "iced_runtime", @@ -3034,7 +3003,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3046,7 +3015,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "bytes", @@ -3062,7 +3031,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bytemuck", "cosmic-text", @@ -3079,7 +3048,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "as-raw-xcb-connection", "bitflags 2.13.1", @@ -3111,7 +3080,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3130,7 +3099,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3667,15 +3636,15 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -3712,22 +3681,13 @@ dependencies = [ "libc", ] -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - [[package]] name = "inout" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" dependencies = [ + "block-padding", "hybrid-array", ] @@ -4237,7 +4197,7 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#2a73fbc0edfe1525381bf999e241d73def79b222" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "apply", "ashpd 0.12.3", @@ -4310,9 +4270,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.20" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" +checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" dependencies = [ "bitflags 2.13.1", "libc", @@ -4421,9 +4381,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" dependencies = [ "lyon_path", "num-traits", @@ -4452,9 +4412,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" +checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" dependencies = [ "float_next_after", "lyon_path", @@ -4597,10 +4557,20 @@ dependencies = [ ] [[package]] -name = "mio" -version = "1.2.2" +name = "miniz_oxide" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -5117,9 +5087,9 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" -version = "5.4.2" +version = "5.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade3be4664bc1ef537ce133015f04c176b737815c2ba9fd60edf212d6e90dd55" +checksum = "7c603ab8300cf18bc3b14146b19fe3dfcc4843ae5a400cd0e7a30b95aa366634" dependencies = [ "is-wsl", "libc", @@ -5162,9 +5132,9 @@ dependencies = [ [[package]] name = "ordermap" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7476a5b122ff1fce7208e7ee9dccd0a516e835f5b8b19b8f3c98a34cf757c1" +checksum = "b1288aecc871a8edf4d48083fb911efe2716700ba47bee1854c03466ff3627de" dependencies = [ "indexmap", "serde", @@ -5293,7 +5263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" dependencies = [ "digest 0.11.3", - "hmac 0.13.0", + "hmac", ] [[package]] @@ -5418,7 +5388,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -5431,7 +5401,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -5488,9 +5458,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" +checksum = "9e9219bcb9d7aca6b2f63c83cf100cf78bcd619ac46e6ecbd0dd90869a39345d" [[package]] name = "ppv-lite86" @@ -5518,9 +5488,9 @@ dependencies = [ [[package]] name = "proc-macro-error-attr3" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0084e6206a967a2dad822180626b2f6b07a3b379325e8f1ec0438e33a469ba7" +checksum = "9e564d14133360e1ae169ffde5da25881b5fa47261665b8e5713c212c27799da" dependencies = [ "proc-macro2", "quote", @@ -5528,9 +5498,9 @@ dependencies = [ [[package]] name = "proc-macro-error3" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cf066225f2373bc711684792b69bdeac0356019b007e721090c24d92d5d5a50" +checksum = "8f0d4471b3436c22106b21913b1dda531558918ae9b7ec55d58aa84b43552233" dependencies = [ "proc-macro-error-attr3", "proc-macro2", @@ -6208,20 +6178,20 @@ dependencies = [ [[package]] name = "secret-service" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a62d7f86047af0077255a29494136b9aaaf697c76ff70b8e49cded4e2623c14" +checksum = "5107b24b91445dd2aa449a258a1807b63240942157292354dc5bfdbeb8bc6db8" dependencies = [ - "aes 0.8.4", + "aes", "cbc", "futures-util", - "generic-array", - "getrandom 0.2.17", + "getrandom 0.4.3", "hkdf", + "hybrid-array", "num", "once_cell", "serde", - "sha2 0.10.9", + "sha2 0.11.0", "zbus", ] @@ -6308,7 +6278,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "digest 0.11.3", ] @@ -6330,7 +6300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "digest 0.11.3", ] @@ -6458,9 +6428,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smithay-client-toolkit" @@ -6598,12 +6568,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "svg_fmt" version = "0.4.5" @@ -7266,9 +7230,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.25.0" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f053576934f05a761a402421fbbe3d425d9366f75f978806a037b3ca481abecc" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ "js-sys", "serde_core", @@ -8914,14 +8878,14 @@ version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" dependencies = [ - "aes 0.9.2", + "aes", "bzip2", "constant_time_eq", "crc32fast", "deflate64", "flate2", "getrandom 0.4.3", - "hmac 0.13.0", + "hmac", "indexmap", "lzma-rust2", "memchr", diff --git a/Cargo.toml b/Cargo.toml index 57e8113..28c15de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "1.7.0" +version = "1.8.0" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" diff --git a/debian/changelog b/debian/changelog index 1656655..dae75ae 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-term (1.8.0) noble; urgency=medium + + * Epoch 1.8.0 version update + + -- Jeremy Soller Wed, 02 Sep 2026 08:15:55 -0600 + cosmic-term (1.7.0) noble; urgency=medium * Epoch 1.7.0 version update From 99842bde03c134cb56cf1b4515d257609f6af3dd Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 10 Sep 2026 18:12:37 +0200 Subject: [PATCH 02/14] chore: fige Cargo.lock --- Cargo.lock | 809 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 589 insertions(+), 220 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fa7b10..cd866b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,12 +309,6 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - [[package]] name = "as-slice" version = "0.2.1" @@ -790,7 +784,6 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "cfg_aliases", ] @@ -980,7 +973,6 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "objc", "objc-foundation", @@ -990,22 +982,12 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "dnd", "mime 0.1.0", "smithay-clipboard", ] -[[package]] -name = "clipboard_x11" -version = "0.4.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" -dependencies = [ - "thiserror 1.0.69", - "x11rb", -] - [[package]] name = "cmov" version = "0.5.4" @@ -1023,7 +1005,7 @@ dependencies = [ "cocoa-foundation", "core-foundation 0.9.4", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] @@ -1256,7 +1238,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1293,6 +1275,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + [[package]] name = "core_maths" version = "0.1.1" @@ -1305,7 +1293,6 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ "bitflags 2.13.1", "cosmic-protocols", @@ -1318,7 +1305,6 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1339,7 +1325,6 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "quote", "syn 2.0.119", @@ -1347,8 +1332,7 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.7.0" -source = "git+https://github.com/pop-os/cosmic-files.git#06278ee7f178a974d79e9603264fefaab1756882" +version = "1.8.0" dependencies = [ "anyhow", "atomic_float", @@ -1369,7 +1353,7 @@ dependencies = [ "jiff-icu", "jxl-oxide", "libc", - "libcosmic", + "libcosmic-yoda", "log", "md-5", "mime_guess", @@ -1408,7 +1392,6 @@ dependencies = [ [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" -source = "git+https://github.com/pop-os/freedesktop-icons#ab4c57b8e416c6af9297cb04d101889896fd9a92" dependencies = [ "bstr", "btoi", @@ -1422,7 +1405,6 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ "bitflags 2.13.1", "wayland-backend", @@ -1435,8 +1417,7 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" -version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings#eed01dd3609e90e3c8cd043656734c500956c793" +version = "0.1.1-yoda.1" dependencies = [ "zbus", ] @@ -1455,16 +1436,18 @@ dependencies = [ "i18n-embed-fl", "icu", "indexmap", - "libcosmic", + "libcosmic-yoda", "log", "open", "paste", "regex", + "reqwest", "ron 0.11.0", "rust-embed", "secret-service", "secstr", "serde", + "serde_json", "shlex 1.3.0", "thiserror 2.0.20", "tokio", @@ -1475,8 +1458,6 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ "bitflags 2.13.1", "fontdb", @@ -1494,12 +1475,12 @@ dependencies = [ "unicode-linebreak", "unicode-script", "unicode-segmentation", + "unicode-width", ] [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "almost", "configparser", @@ -1590,7 +1571,6 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" -source = "git+https://github.com/iced-rs/cryoglyph.git?rev=e429a025df36ab8145708acb309080ae3deec17a#e429a025df36ab8145708acb309080ae3deec17a" dependencies = [ "cosmic-text", "etagere", @@ -1636,15 +1616,6 @@ dependencies = [ "uncased", ] -[[package]] -name = "ctor" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" -dependencies = [ - "dtor", -] - [[package]] name = "ctutils" version = "0.4.2" @@ -1888,7 +1859,6 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "bitflags 2.13.1", "mime 0.1.0", @@ -1915,52 +1885,6 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" - -[[package]] -name = "drm" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" -dependencies = [ - "bitflags 2.13.1", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" -dependencies = [ - "drm-sys", - "rustix 0.38.44", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - -[[package]] -name = "dtor" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" [[package]] name = "either" @@ -1968,6 +1892,21 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" +[[package]] +name = "encoding_rs" +version = "0.8.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" +dependencies = [ + "cfg-if", + "core_detect", + "multiversion", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", +] + [[package]] name = "endi" version = "1.1.1" @@ -2304,6 +2243,15 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -2311,7 +2259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -2325,6 +2273,12 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -2503,16 +2457,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link 0.2.1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -2676,6 +2620,25 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" @@ -2789,6 +2752,45 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "hybrid-array" version = "0.4.14" @@ -2798,6 +2800,83 @@ dependencies = [ "typenum", ] +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + [[package]] name = "i18n-config" version = "0.4.8" @@ -2892,7 +2971,6 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "dnd", @@ -2914,7 +2992,6 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "accesskit", "accesskit_winit", @@ -2923,7 +3000,6 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bitflags 2.13.1", "build_helpers", @@ -2949,7 +3025,6 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_core", "iced_futures", @@ -2959,7 +3034,6 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "futures", "iced_core", @@ -2973,7 +3047,6 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bitflags 2.13.1", "bytemuck", @@ -2994,7 +3067,6 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_graphics", "iced_runtime", @@ -3003,7 +3075,6 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3015,7 +3086,6 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "bytes", @@ -3031,7 +3101,6 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "bytemuck", "cosmic-text", @@ -3048,9 +3117,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ - "as-raw-xcb-connection", "bitflags 2.13.1", "build_helpers", "bytemuck", @@ -3068,19 +3135,16 @@ dependencies = [ "rustc-hash 2.1.3", "rustix 0.38.44", "thiserror 2.0.20", - "tiny-xlib", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-sys", "wgpu", - "x11rb", ] [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3099,7 +3163,6 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3721,6 +3784,12 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + [[package]] name = "is-docker" version = "0.2.0" @@ -4195,9 +4264,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] -name = "libcosmic" -version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +name = "libcosmic-yoda" +version = "0.1.0-yoda.2" dependencies = [ "apply", "ashpd 0.12.3", @@ -4301,12 +4369,6 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -4510,7 +4572,7 @@ dependencies = [ "bitflags 2.13.1", "block", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -4519,7 +4581,6 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "smithay-clipboard", ] @@ -4597,6 +4658,33 @@ dependencies = [ "pxfm", ] +[[package]] +name = "multiversion" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" +dependencies = [ + "multiversion-macros", +] + +[[package]] +name = "multiversion-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" +dependencies = [ + "proc-macro2", + "quote", + "rustversion", + "syn 3.0.4", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "mutate_once" version = "0.1.2" @@ -4629,6 +4717,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.9.0" @@ -5095,6 +5200,49 @@ dependencies = [ "libc", ] +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -5942,6 +6090,49 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime 0.3.17", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + [[package]] name = "resvg" version = "0.45.1" @@ -5992,6 +6183,20 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "ron" version = "0.11.0" @@ -6118,6 +6323,39 @@ dependencies = [ "rustix 1.1.4", ] +[[package]] +name = "rustls" +version = "0.23.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.23" @@ -6142,6 +6380,12 @@ dependencies = [ "unicode-script", ] +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "same-file" version = "1.0.6" @@ -6151,6 +6395,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -6204,6 +6457,29 @@ dependencies = [ "libc", ] +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.3.0" @@ -6271,6 +6547,18 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha1" version = "0.11.0" @@ -6465,7 +6753,6 @@ dependencies = [ [[package]] name = "smithay-clipboard" version = "0.8.0" -source = "git+https://github.com/pop-os/smithay-clipboard?tag=sctk-0.20#859b02c88f45c554049a67c6ddeec1692ce0e20b" dependencies = [ "libc", "raw-window-handle", @@ -6496,31 +6783,26 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" dependencies = [ - "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", - "drm", "fastrand", - "foreign-types", + "foreign-types 0.5.0", "js-sys", + "libredox", "log", "memmap2 0.9.11", "objc", "raw-window-handle", - "redox_syscall 0.5.18", "rustix 0.38.44", - "tiny-xlib", "wasm-bindgen", "wayland-backend", "wayland-client", "wayland-sys", "web-sys", "windows-sys 0.52.0", - "x11rb", ] [[package]] @@ -6568,6 +6850,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -6617,6 +6905,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synchrony" version = "0.1.9" @@ -6647,6 +6944,27 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "taffy" version = "0.9.2" @@ -6832,19 +7150,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tiny-xlib" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" -dependencies = [ - "as-raw-xcb-connection", - "ctor", - "libloading", - "pkg-config", - "tracing", -] - [[package]] name = "tinystr" version = "0.8.4" @@ -6899,6 +7204,26 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.19" @@ -6910,6 +7235,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.11" @@ -6949,6 +7288,51 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.44" @@ -7029,6 +7413,12 @@ dependencies = [ "windows 0.56.0", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "ttf-parser" version = "0.25.1" @@ -7170,6 +7560,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.8" @@ -7266,6 +7662,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -7296,6 +7698,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -7366,6 +7777,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmtimer" version = "0.4.3" @@ -7746,12 +8170,10 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", - "clipboard_x11", "dnd", "mime 0.1.0", "raw-window-handle", @@ -7947,6 +8369,17 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -8244,7 +8677,6 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "cfg_aliases", @@ -8264,13 +8696,11 @@ dependencies = [ "winit-wayland", "winit-web", "winit-win32", - "winit-x11", ] [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "android-activity", "bitflags 2.13.1", @@ -8285,7 +8715,6 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "block2 0.6.2", @@ -8307,7 +8736,6 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "memmap2 0.9.11", "objc2 0.6.4", @@ -8315,14 +8743,12 @@ dependencies = [ "smol_str", "tracing", "winit-core", - "x11-dl", "xkbcommon-dl", ] [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "cursor-icon", @@ -8336,7 +8762,6 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "dpi", @@ -8352,7 +8777,6 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "block2 0.6.2", @@ -8372,7 +8796,6 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "ahash", "bitflags 2.13.1", @@ -8398,7 +8821,6 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "atomic-waker", "bitflags 2.13.1", @@ -8420,7 +8842,6 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "bitflags 2.13.1", "cursor-icon", @@ -8433,29 +8854,6 @@ dependencies = [ "winit-core", ] -[[package]] -name = "winit-x11" -version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" -dependencies = [ - "bitflags 2.13.1", - "bytemuck", - "calloop", - "cursor-icon", - "dpi", - "libc", - "percent-encoding", - "raw-window-handle", - "rustix 1.1.4", - "smol_str", - "tracing", - "winit-common", - "winit-core", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - [[package]] name = "winnow" version = "1.0.4" @@ -8486,39 +8884,6 @@ dependencies = [ "either", ] -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 1.1.4", - "x11rb-protocol", - "xcursor", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - [[package]] name = "xattr" version = "1.6.1" @@ -9031,3 +9396,7 @@ dependencies = [ "syn 3.0.4", "winnow", ] + +[[patch.unused]] +name = "winit-x11" +version = "0.31.0-beta.2" From 327febcc92cf6b8d5e74639e8665acdde097d975 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 13 Sep 2026 01:56:16 +0200 Subject: [PATCH 03/14] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amadɣas Co-authored-by: Blauen Co-authored-by: CYAXXX <85353920+CYAXXX@users.noreply.github.com> Co-authored-by: Geeson Wan Co-authored-by: Hosted Weblate Co-authored-by: Kurt Harren Catindig Co-authored-by: Quentin PAGÈS Co-authored-by: Satakun Utama Co-authored-by: VandaL Co-authored-by: Zahid Rizky Fakhri Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/id/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/kab/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/kmr/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/oc/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/pl/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/th/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-term/zh_Hant/ Translation: Pop OS/COSMIC Term --- i18n/fil/cosmic_term.ftl | 0 i18n/id/cosmic_term.ftl | 2 +- i18n/kab/cosmic_term.ftl | 8 ++++---- i18n/kmr/cosmic_term.ftl | 4 ++-- i18n/oc/cosmic_term.ftl | 11 +++++++++-- i18n/pl/cosmic_term.ftl | 6 +++--- i18n/th/cosmic_term.ftl | 9 +++++++-- i18n/zh-TW/cosmic_term.ftl | 2 +- 8 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 i18n/fil/cosmic_term.ftl diff --git a/i18n/fil/cosmic_term.ftl b/i18n/fil/cosmic_term.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/id/cosmic_term.ftl b/i18n/id/cosmic_term.ftl index a17d82d..6b139ad 100644 --- a/i18n/id/cosmic_term.ftl +++ b/i18n/id/cosmic_term.ftl @@ -4,7 +4,7 @@ repository = Repositori support = Dukungan color-schemes = Skema warna cosmic-terminal = Terminal COSMIC -rename = Ganti nama +rename = Ganti Nama export = Ekspor delete = Hapus import = Impor diff --git a/i18n/kab/cosmic_term.ftl b/i18n/kab/cosmic_term.ftl index 1761fee..368b6f2 100644 --- a/i18n/kab/cosmic_term.ftl +++ b/i18n/kab/cosmic_term.ftl @@ -1,9 +1,9 @@ -cancel = Sefsex +cancel = Semmet name = Isem delete = kkes rename = Snifel isem -quit = Tuffɣa -support = Tallalt +quit = Ffeɣ +support = Tallelt repository = Asarsay settings = Iɣewwaṛen appearance = Timeẓri @@ -14,7 +14,7 @@ paste = Senteḍ select-all = Fren akk view = Wali menu-settings = Iɣewwaṛen… -match-desktop = Amṣada d tnarit +match-desktop = Semṣada akked tnarit file = Afaylu new-window = Asfaylu amaynut edit = Ẓreg diff --git a/i18n/kmr/cosmic_term.ftl b/i18n/kmr/cosmic_term.ftl index 8cfa2dc..4348691 100644 --- a/i18n/kmr/cosmic_term.ftl +++ b/i18n/kmr/cosmic_term.ftl @@ -27,7 +27,7 @@ light = Ronî advanced = Pêşketî support = Piştgirî default-font = Cûrenivîs -paste = Pêve bike +paste = Pê ve bike menu-settings = Sazkarî... command-line = Rêza fermanê view = Dîtin @@ -100,7 +100,7 @@ focus-pane-left = Balê bikişîne ser destgeha çepê focus-pane-right = Balê bikişîne ser destgeha rastê focus-pane-up = Balê bikişîne ser destgeha jorîn password-manager = Rêveberê borînpeyvê -paste-primary = A sereke pêve bike +paste-primary = A sereke pê ve bike reset-to-default = Vegere rewşa berdest shortcut-capture-hint = Kombînasyona kilîtan bitikîne shortcut-replace-body = { $binding } berê ji bo { $existing } hatiye destnîşankirin. Tu dixwazî bi { $new_action } re biguherînî? diff --git a/i18n/oc/cosmic_term.ftl b/i18n/oc/cosmic_term.ftl index 0f74e05..50030da 100644 --- a/i18n/oc/cosmic_term.ftl +++ b/i18n/oc/cosmic_term.ftl @@ -1,7 +1,14 @@ -settings = Paramètres +settings = Configuracion appearance = Aparéncia theme = Tèma match-desktop = Assortir al burèu -dark = Fosc +dark = Escur light = Clar file = Fichièr +name = Nom +repository = Depaus +cancel = Anullar +menu-settings = Configuracion... +quit = Quitar +delete = Suprimir +replace = Remplaçar diff --git a/i18n/pl/cosmic_term.ftl b/i18n/pl/cosmic_term.ftl index 6af669e..25c3027 100644 --- a/i18n/pl/cosmic_term.ftl +++ b/i18n/pl/cosmic_term.ftl @@ -1,5 +1,5 @@ cosmic-terminal = Terminal COSMIC -comment = Emulator terminala dla pulpitu COSMIC +comment = Emulator terminala dla środowiska COSMIC keywords = Cli;WierszPoleceń;Powłoka;Terminal; new-terminal = Nowy terminal @@ -73,7 +73,7 @@ advanced = Zaawansowane show-headerbar = Pokaż pasek nagłówka show-header-description = Ukazuje pasek nagłówka z menu wybieranego prawym przyciskiem myszki # Find -find-placeholder = Szukaj… +find-placeholder = Wyszukaj… find-previous = Znajdź poprzedni find-next = Znajdź następny @@ -96,7 +96,7 @@ edit = Edytuj copy = Kopiuj paste = Wklej select-all = Zaznacz wszystko -find = Szukaj +find = Wyszukaj clear-scrollback = Wyczyść przewijanie ## View diff --git a/i18n/th/cosmic_term.ftl b/i18n/th/cosmic_term.ftl index 32ec77d..f95e682 100644 --- a/i18n/th/cosmic_term.ftl +++ b/i18n/th/cosmic_term.ftl @@ -39,8 +39,8 @@ settings = การตั้งค่า appearance = ลักษณะ theme = ธีม match-desktop = ใช้ตามธีมหน้าจอหลัก -dark = ธีมมืด -light = ธีมสว่าง +dark = มืด +light = สว่าง syntax-dark = โทนสีมืด syntax-light = โทนสีสว่าง default-zoom-step = ระยะซูม @@ -109,3 +109,8 @@ pane-toggle-maximize = ขยายให้ใหญ่สุด menu-color-schemes = โทนสี... menu-settings = การตั้งค่า... menu-about = เกี่ยวกับ เทอร์มินัล COSMIC... +cancel = ยกเลิก +reset-to-default = รีเซ็ตเป็นค่าเริ่มต้น +type-to-search = พิมพ์เพื่อค้นหา +add-another-keybinding = เพิ่มคีย์ลัดเพิ่มเติม +replace = แทนที่ diff --git a/i18n/zh-TW/cosmic_term.ftl b/i18n/zh-TW/cosmic_term.ftl index 3fa61a6..7cebc95 100644 --- a/i18n/zh-TW/cosmic_term.ftl +++ b/i18n/zh-TW/cosmic_term.ftl @@ -10,7 +10,7 @@ new-terminal = 新建終端機 ## Color schemes color-schemes = 配色方案 -rename = 重命名 +rename = 重新命名 export = 匯出 delete = 刪除 import = 匯入 From 4cd8f8d6058c6585b6ce7297d27a4c6b26a43e01 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Mon, 14 Sep 2026 19:51:03 +0200 Subject: [PATCH 04/14] Epoch 1.9.0 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 505 ++++++++++++++++++++---------------------- Cargo.toml | 2 +- debian/changelog | 6 + debian/source/options | 6 +- 4 files changed, 247 insertions(+), 272 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fa7b10..16d5908 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -147,7 +147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46319972e74179d707445f64aaa2893bbf6a111de3a9af29b7eb382f8b39e282" dependencies = [ "base64", - "bitflags 2.13.1", + "bitflags 2.13.2", "home", "libc", "log", @@ -223,7 +223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.13.1", + "bitflags 2.13.2", "cc", "jni", "libc", @@ -499,7 +499,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -570,7 +570,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -666,9 +666,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" dependencies = [ "serde_core", ] @@ -790,7 +790,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "cfg_aliases", ] @@ -824,13 +824,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -876,7 +876,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "polling", "rustix 1.1.4", "slab", @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.4" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" dependencies = [ "find-msvc-tools", "jobserver", @@ -1205,9 +1205,9 @@ dependencies = [ [[package]] name = "configparser" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46dec724fd22199ebde05033a0cbae453bc3b1ecff11eb6a6bb3eec4b90c6a4" +checksum = "031ad3d167622974ed636505ae4556267ed4aa2aea0464122fa6bc9698a32825" [[package]] name = "const-oid" @@ -1277,7 +1277,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "core-foundation 0.10.1", "libc", ] @@ -1307,8 +1307,21 @@ name = "cosmic-client-toolkit" version = "0.2.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ - "bitflags 2.13.1", - "cosmic-protocols", + "bitflags 2.13.2", + "cosmic-protocols 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", + "libc", + "smithay-client-toolkit", + "wayland-client", + "wayland-protocols", +] + +[[package]] +name = "cosmic-client-toolkit" +version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" +dependencies = [ + "bitflags 2.13.2", + "cosmic-protocols 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "libc", "smithay-client-toolkit", "wayland-client", @@ -1318,7 +1331,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1339,7 +1352,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "quote", "syn 2.0.119", @@ -1347,14 +1360,14 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.7.0" -source = "git+https://github.com/pop-os/cosmic-files.git#06278ee7f178a974d79e9603264fefaab1756882" +version = "1.8.0" +source = "git+https://github.com/pop-os/cosmic-files.git#089ad2b417edded26385029166e5b49c13432bf8" dependencies = [ "anyhow", "atomic_float", "bstr", "compio", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", "dirs 6.0.0", "filetime", "flate2", @@ -1424,7 +1437,21 @@ name = "cosmic-protocols" version = "0.2.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "cosmic-protocols" +version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" +dependencies = [ + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1443,7 +1470,7 @@ dependencies = [ [[package]] name = "cosmic-term" -version = "1.8.0" +version = "1.9.0" dependencies = [ "alacritty_terminal", "clap_lex", @@ -1478,7 +1505,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "fontdb", "harfrust", "linebender_resource_handle", @@ -1499,7 +1526,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "almost", "configparser", @@ -1540,18 +1567,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1559,27 +1586,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crunchy" @@ -1764,7 +1791,7 @@ checksum = "dc05a5d33db20c784f873e84934ad94bb209a090987ac5f62fede2c178234f23" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -1859,7 +1886,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -1873,7 +1900,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -1890,7 +1917,7 @@ name = "dnd" version = "0.1.0" source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit", @@ -1923,7 +1950,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "drm-ffi", "drm-fourcc", @@ -2144,9 +2171,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "fixed_decimal" @@ -2274,9 +2301,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64eb721ca85a34323425f4041adc5d82704d3782d5f8f03793bc012419dce23" +checksum = "b8eb065f3251655b3c90e22e5e363f310fc5332fb3402e37bbc94752283248f6" dependencies = [ "bytemuck", ] @@ -2322,7 +2349,7 @@ checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -2446,7 +2473,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -2646,7 +2673,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2657,7 +2684,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -2694,7 +2721,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "core_maths", "read-fonts 0.37.0", @@ -2791,9 +2818,9 @@ dependencies = [ [[package]] name = "hybrid-array" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" dependencies = [ "typenum", ] @@ -2892,7 +2919,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "build_helpers", "dnd", @@ -2914,7 +2941,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "accesskit", "accesskit_winit", @@ -2923,12 +2950,12 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "build_helpers", "bytes", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "dnd", "glam", "lilt", @@ -2949,7 +2976,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "iced_core", "iced_futures", @@ -2959,7 +2986,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "futures", "iced_core", @@ -2973,9 +3000,9 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cosmic-text", "half", @@ -2994,7 +3021,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "iced_graphics", "iced_runtime", @@ -3003,7 +3030,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3015,11 +3042,11 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "build_helpers", "bytes", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "dnd", "iced_core", "iced_futures", @@ -3031,7 +3058,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "bytemuck", "cosmic-text", @@ -3048,13 +3075,13 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "as-raw-xcb-connection", - "bitflags 2.13.1", + "bitflags 2.13.2", "build_helpers", "bytemuck", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "cryoglyph", "futures", "glam", @@ -3080,10 +3107,10 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "build_helpers", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "dnd", "iced_renderer", "iced_runtime", @@ -3099,10 +3126,10 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "build_helpers", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", "cursor-icon", "dnd", "iced_debug", @@ -3642,9 +3669,9 @@ checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" [[package]] name = "indexmap" -version = "2.14.1" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -3667,7 +3694,7 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "inotify-sys", "libc", ] @@ -3763,9 +3790,9 @@ checksum = "4d3667095d64c3ecffc96463a21157b04bf3e252f6e8d5750b20c02e33c194e3" [[package]] name = "jiff" -version = "0.2.35" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" dependencies = [ "defmt", "jiff-core", @@ -3780,11 +3807,12 @@ dependencies = [ [[package]] name = "jiff-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" dependencies = [ "defmt", + "log", ] [[package]] @@ -3800,9 +3828,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.35" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" dependencies = [ "jiff-core", "proc-macro2", @@ -3895,9 +3923,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -4099,7 +4127,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "serde", ] @@ -4145,7 +4173,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libc", ] @@ -4197,13 +4225,13 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" dependencies = [ "apply", "ashpd 0.12.3", "auto_enums", "build_helpers", - "cosmic-client-toolkit", + "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", "cosmic-config", "cosmic-freedesktop-icons", "cosmic-settings-daemon", @@ -4230,6 +4258,7 @@ dependencies = [ "palette", "phf", "rfd", + "roxmltree", "rust-embed", "serde", "slotmap", @@ -4270,14 +4299,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" +checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libc", "plain", - "redox_syscall 0.9.3", + "redox_syscall 0.9.4", ] [[package]] @@ -4412,9 +4441,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" +checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" dependencies = [ "float_next_after", "lyon_path", @@ -4507,7 +4536,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -4611,7 +4640,7 @@ checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -4635,7 +4664,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "jni-sys 0.3.1", "log", "ndk-sys", @@ -4705,7 +4734,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "fsevent-sys", "inotify", "kqueue", @@ -4736,7 +4765,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -4922,7 +4951,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4938,7 +4967,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -4951,7 +4980,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4963,7 +4992,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "dispatch2", "objc2 0.6.4", @@ -4975,7 +5004,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libc", "objc2-core-foundation", ] @@ -4998,7 +5027,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "objc2-core-foundation", "objc2-core-graphics", ] @@ -5015,7 +5044,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -5027,7 +5056,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -5039,7 +5068,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5051,7 +5080,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5064,7 +5093,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -5087,9 +5116,9 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" -version = "5.4.3" +version = "5.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c603ab8300cf18bc3b14146b19fe3dfcc4843ae5a400cd0e7a30b95aa366634" +checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" dependencies = [ "is-wsl", "libc", @@ -5132,9 +5161,9 @@ dependencies = [ [[package]] name = "ordermap" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1288aecc871a8edf4d48083fb911efe2716700ba47bee1854c03466ff3627de" +checksum = "16a756ddcdeb6c0efc8927bdf0ed112885815a35ba350472a467be5104f01ca1" dependencies = [ "indexmap", "serde", @@ -5397,7 +5426,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "crc32fast", "fdeflate", "flate2", @@ -5432,9 +5461,9 @@ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" dependencies = [ "portable-atomic", ] @@ -5458,9 +5487,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9219bcb9d7aca6b2f63c83cf100cf78bcd619ac46e6ecbd0dd90869a39345d" +checksum = "196a7c80b9a7652aba7cc070827516c2abe4ccdf53d128e1944003cf5726cff1" [[package]] name = "ppv-lite86" @@ -5505,7 +5534,7 @@ dependencies = [ "proc-macro-error-attr3", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -5536,7 +5565,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "chrono", "flate2", "procfs-core", @@ -5549,7 +5578,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "chrono", "hex", ] @@ -5784,7 +5813,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -5831,7 +5860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ "bytemuck", - "font-types 0.12.4", + "font-types 0.12.5", "once_cell", ] @@ -5863,7 +5892,7 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5018d583d6d2f5499352aea8d177e9067d1eb03ab17c78169d5ba7a30001b15" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libredox", ] @@ -5873,16 +5902,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] name = "redox_syscall" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d678d17679829e73d371e96880897e98fee2ded7acc0a50bdf8af2affa4b2fe5" +checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -5999,7 +6028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ "base64", - "bitflags 2.13.1", + "bitflags 2.13.2", "serde", "serde_derive", "unicode-ident", @@ -6011,7 +6040,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "once_cell", "serde", "serde_derive", @@ -6087,7 +6116,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6100,7 +6129,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.12.1", @@ -6130,7 +6159,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "core_maths", "log", @@ -6243,7 +6272,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -6268,7 +6297,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -6428,9 +6457,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.16.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" [[package]] name = "smithay-client-toolkit" @@ -6438,7 +6467,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "calloop", "calloop-wayland-source", @@ -6538,7 +6567,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.1", + "bitflags 2.13.2", ] [[package]] @@ -6608,9 +6637,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -6735,7 +6764,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -6858,18 +6887,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" @@ -6896,7 +6916,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -6930,9 +6950,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.13+spec-1.1.0" +version = "0.25.15+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" dependencies = [ "indexmap", "toml_datetime", @@ -7013,9 +7033,9 @@ dependencies = [ [[package]] name = "trash" -version = "5.2.6" +version = "5.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7602e0c7d66ec2d92a8c917219fbc7894039efa2063b9064260110828a356f46" +checksum = "be89b3fe156965d29ac4f8522f3a640c655affdd9f21cb4f36857f0c92c00317" dependencies = [ "chrono", "libc", @@ -7026,7 +7046,7 @@ dependencies = [ "percent-encoding", "scopeguard", "urlencoding", - "windows 0.56.0", + "windows 0.62.2", ] [[package]] @@ -7230,9 +7250,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.26.0" +version = "1.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" +checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ "js-sys", "serde_core", @@ -7279,7 +7299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" dependencies = [ "arrayvec", - "bitflags 2.13.1", + "bitflags 2.13.2", "cursor-icon", "log", "memchr", @@ -7313,9 +7333,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -7326,9 +7346,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.77" +version = "0.4.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" dependencies = [ "js-sys", "wasm-bindgen", @@ -7336,9 +7356,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7346,22 +7366,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.5", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] @@ -7400,7 +7420,7 @@ version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -7412,7 +7432,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cursor-icon", "wayland-backend", ] @@ -7434,7 +7454,7 @@ version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7447,7 +7467,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7460,7 +7480,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7473,7 +7493,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7486,7 +7506,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7511,7 +7531,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "downcast-rs", "rustix 1.1.4", "wayland-backend", @@ -7532,9 +7552,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -7563,7 +7583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" dependencies = [ "arrayvec", - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cfg-if", "cfg_aliases", @@ -7595,7 +7615,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cfg_aliases", "document-features", @@ -7655,7 +7675,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.13.1", + "bitflags 2.13.2", "block", "bytemuck", "cfg-if", @@ -7699,7 +7719,7 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "js-sys", "log", @@ -7758,16 +7778,6 @@ 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" @@ -7811,26 +7821,14 @@ 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 0.60.2", - "windows-interface 0.59.3", + "windows-implement", + "windows-interface", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -7842,8 +7840,8 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", + "windows-implement", + "windows-interface", "windows-link 0.2.1", "windows-result 0.4.1", "windows-strings 0.5.1", @@ -7871,17 +7869,6 @@ 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" @@ -7893,17 +7880,6 @@ 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" @@ -7947,15 +7923,6 @@ 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" @@ -8246,7 +8213,7 @@ name = "winit" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg_aliases", "cursor-icon", "dpi", @@ -8273,7 +8240,7 @@ version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "android-activity", - "bitflags 2.13.1", + "bitflags 2.13.2", "dpi", "ndk", "raw-window-handle", @@ -8287,7 +8254,7 @@ name = "winit-appkit" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "dispatch2", "dpi", @@ -8324,7 +8291,7 @@ name = "winit-core" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cursor-icon", "dpi", "keyboard-types", @@ -8338,7 +8305,7 @@ name = "winit-orbital" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "dpi", "libredox", "orbclient", @@ -8354,7 +8321,7 @@ name = "winit-uikit" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "dispatch2", "dpi", @@ -8375,7 +8342,7 @@ version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "ahash", - "bitflags 2.13.1", + "bitflags 2.13.2", "calloop", "cursor-icon", "dpi", @@ -8401,7 +8368,7 @@ version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ "atomic-waker", - "bitflags 2.13.1", + "bitflags 2.13.2", "concurrent-queue", "cursor-icon", "dpi", @@ -8422,7 +8389,7 @@ name = "winit-win32" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cursor-icon", "dpi", "raw-window-handle", @@ -8438,7 +8405,7 @@ name = "winit-x11" version = "0.31.0-beta.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "calloop", "cursor-icon", @@ -8593,7 +8560,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "dlib", "log", "once_cell", @@ -8746,7 +8713,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", "zbus_names", "zvariant", "zvariant_utils", @@ -8792,18 +8759,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", @@ -8869,7 +8836,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -8934,18 +8901,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" dependencies = [ "cc", "pkg-config", @@ -9015,7 +8982,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", "zvariant_utils", ] @@ -9028,6 +8995,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 3.0.4", + "syn 3.0.5", "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 28c15de..da27e0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "1.8.0" +version = "1.9.0" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" diff --git a/debian/changelog b/debian/changelog index dae75ae..0da2a95 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-term (1.9.0) noble; urgency=medium + + * Epoch 1.9.0 version update + + -- Michael Murphy Mon, 14 Sep 2026 19:50:47 +0200 + cosmic-term (1.8.0) noble; urgency=medium * Epoch 1.8.0 version update diff --git a/debian/source/options b/debian/source/options index 5d4ff73..2f8c4a1 100644 --- a/debian/source/options +++ b/debian/source/options @@ -1,4 +1,6 @@ tar-ignore=.github -tar-ignore=.vscode +tar-ignore=target/.rustc_info.json +tar-ignore=target/CACHEDIR.TAG +tar-ignore=target/debug +tar-ignore=target/release tar-ignore=vendor -tar-ignore=target \ No newline at end of file From 120b4fdb1220afab7f98b53e7adc1ad1195f050b Mon Sep 17 00:00:00 2001 From: Hojjat Date: Tue, 8 Sep 2026 13:49:17 -0600 Subject: [PATCH 05/14] feat: use libcosmic's context_menu widget for the terminal context menu --- src/main.rs | 228 ++++++++------------------------------------ src/menu.rs | 157 ++++++++++-------------------- src/terminal_box.rs | 26 ++--- 3 files changed, 95 insertions(+), 316 deletions(-) diff --git a/src/main.rs b/src/main.rs index 19ff49e..7aa65fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -425,7 +425,7 @@ pub enum Message { ProfileSyntaxTheme(ProfileId, ColorSchemeKind, usize), ProfileTabTitle(ProfileId, String), ReorderTab(Pane, ReorderEvent), - Surface(surface::Action), + Surface(surface::Action), SelectAll(Option), ShowAdvancedFontSettings(bool), ShowHeaderBar(bool), @@ -455,7 +455,6 @@ pub enum Message { ZoomIn, ZoomOut, ZoomReset, - ContextMenuPopupClosed(window::Id), } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -526,14 +525,6 @@ pub struct App { shortcut_search_regex: Option, shortcut_search_value: String, modifiers: Modifiers, - context_menu_popup: Option<( - window::Id, - pane_grid::Pane, - segmented_button::Entity, - Option, - widget::Id, - cosmic::iced::Point, - )>, #[cfg(feature = "password_manager")] password_mgr: password_manager::PasswordManager, } @@ -1903,7 +1894,6 @@ impl Application for App { shortcut_search_regex: None, shortcut_search_value: String::new(), modifiers: Modifiers::empty(), - context_menu_popup: None, #[cfg(feature = "password_manager")] password_mgr: Default::default(), }; @@ -2884,16 +2874,7 @@ impl Application for App { return self.update_title(None); } Message::TabContextAction(entity, action) => { - // Close context menu popup let mut tasks = Vec::new(); - if let Some((_popup_id, _, _, _, _, _)) = self.context_menu_popup.take() { - #[cfg(feature = "wayland")] - if is_wayland() { - tasks.push(cosmic::task::message(Message::Surface( - cosmic::surface::action::destroy_popup(_popup_id), - ))); - } - } // Close terminal context menu state if let Some(tab_model) = self.pane_model.active() && let Some(terminal) = tab_model.data::>(entity) @@ -2902,11 +2883,8 @@ impl Application for App { //Some actions need the menu_state, //so only clear the position for them. match action { - Action::LaunchUrlByMenu | Action::CopyUrlByMenu => { - if let Some(context_menu) = terminal.context_menu.as_mut() { - context_menu.position = None; - } - } + // these read the link from the menu state and clear it themselves + Action::LaunchUrlByMenu | Action::CopyUrlByMenu => {} _ => { terminal.context_menu = None; } @@ -2916,94 +2894,29 @@ impl Application for App { return cosmic::Task::batch(tasks); } Message::TabContextMenu(pane, menu_state) => { - #[allow(unused_mut)] - let mut tasks = Vec::new(); - - // Close existing context menu popup if any - if let Some((_popup_id, _, _, _, _, _)) = self.context_menu_popup.take() { - #[cfg(feature = "wayland")] - if is_wayland() { - tasks.push(cosmic::task::message(Message::Surface( - cosmic::surface::action::destroy_popup(_popup_id), - ))); - } - } - // Clear all terminal context_menu state for (_, tab_model) in self.pane_model.panes.iter() { for entity in tab_model.iter() { if let Some(terminal) = tab_model.data::>(entity) { let mut terminal = terminal.lock().unwrap(); - terminal.context_menu = None; + if terminal.context_menu.take().is_some() { + terminal.active_regex_match = None; + terminal.needs_update = true; + } } } } - if let Some(menu_state) = menu_state { - if let Some(_position) = menu_state.position { - let local_position = menu_state.local_position.unwrap_or(_position); - if let Some(tab_model) = self.pane_model.panes.get(pane) { - let entity = tab_model.active(); - let link = menu_state.link.clone(); - let popup_id = window::Id::unique(); - - if let Some(terminal) = tab_model.data::>(entity) { - let mut terminal = terminal.lock().unwrap(); - terminal.context_menu = Some(menu_state); - } - - self.context_menu_popup = Some(( - popup_id, - pane, - entity, - link, - widget::Id::unique(), - local_position, - )); - - #[cfg(feature = "wayland")] - if is_wayland() { - let main_window = self.core.main_window_id().unwrap(); - let pos_x = _position.x as i32; - let pos_y = _position.y as i32; - - tasks.push(cosmic::task::message(Message::Surface( - cosmic::surface::action::app_popup( - |_| Default::default(), - move |_app: &mut Self| { - use cosmic::cctk::wayland_protocols::xdg::shell::client::xdg_positioner::{Anchor, Gravity}; - use cosmic::iced::runtime::platform_specific::wayland::popup::{SctkPopupSettings, SctkPositioner}; - - SctkPopupSettings { - parent: main_window, - id: popup_id, - positioner: SctkPositioner { - size: None, - anchor_rect: cosmic::iced::Rectangle { - x: pos_x, - y: pos_y, - width: 1, - height: 1, - }, - anchor: Anchor::None, - gravity: Gravity::BottomRight, - reactive: true, - ..Default::default() - }, - parent_size: None, - grab: true, - close_with_children: false, - input_zone: None, - } - }, None), - ))); - } - } + // A right press records what is under the cursor + if let Some(menu_state) = menu_state + && let Some(tab_model) = self.pane_model.panes.get(pane) + { + let entity = tab_model.active(); + if let Some(terminal) = tab_model.data::>(entity) { + terminal.lock().unwrap().context_menu = Some(menu_state); } self.pane_model.set_focus(pane); } - - return cosmic::Task::batch(tasks); } Message::TabNew => { return self.create_and_focus_new_terminal( @@ -3291,26 +3204,8 @@ impl Application for App { self.reset_active_pane_zoom(); return self.update_config(); } - Message::ContextMenuPopupClosed(id) => { - if let Some((popup_id, pane, entity, _, _, _)) = &self.context_menu_popup - && id == *popup_id - { - // Clear link underline on the terminal - if let Some(tab_model) = self.pane_model.panes.get(*pane) - && let Some(terminal) = tab_model.data::>(*entity) - { - let mut terminal = terminal.lock().unwrap(); - terminal.context_menu = None; - terminal.active_regex_match = None; - terminal.needs_update = true; - } - self.context_menu_popup = None; - } - } Message::Surface(a) => { - return cosmic::task::message(cosmic::Action::Cosmic( - cosmic::app::Action::Surface(a), - )); + return cosmic::task::message(cosmic::Action::Surface(a)); } Message::ReorderTab( pane, @@ -3413,26 +3308,7 @@ impl Application for App { ] } - fn on_close_requested(&self, id: window::Id) -> Option { - if let Some((popup_id, _, _, _, _, _)) = &self.context_menu_popup - && id == *popup_id - { - return Some(Message::ContextMenuPopupClosed(id)); - } - None - } - fn view_window(&self, window_id: window::Id) -> Element<'_, Message> { - if let Some((popup_id, _pane, entity, ref link, ref autosize_id, _)) = - self.context_menu_popup - && window_id == popup_id - { - return widget::autosize::autosize( - menu::context_menu(&self.config, &self.key_binds, entity, link.clone()), - autosize_id.clone(), - ) - .into(); - } match &self.dialog_opt { Some(dialog) => dialog.view(window_id), None => widget::text("Unknown window ID").into(), @@ -3521,50 +3397,30 @@ impl Application for App { terminal_box = terminal_box.on_mouse_enter(move || Message::MouseEnter(pane)); } - // If a context menu popup is active for this pane, inform the - // terminal_box so it will emit on_context_menu(None) on click - // to dismiss the popup. - if self.context_menu_popup.is_some() { - terminal_box = terminal_box.context_menu(cosmic::iced::Point::ORIGIN); + // The terminal records what was under the right press; the widget opens the + // menu on release, so build it from that state + let context_link = terminal + .lock() + .unwrap() + .context_menu + .as_ref() + .map(|menu_state| menu_state.link.clone()); + if context_link.is_some() { + terminal_box = terminal_box.context_menu_open(true); } - - let use_wayland_popup = { - #[cfg(feature = "wayland")] - { - is_wayland() - } - #[cfg(not(feature = "wayland"))] - { - false - } - }; - - let tab_element: Element<'_, Message> = if !use_wayland_popup { - // Fallback: render context menu as an inline popover - if let Some((_, popup_pane, popup_entity, ref link, _, point)) = - self.context_menu_popup - { - if pane == popup_pane { - let mut popover = widget::popover(terminal_box.context_menu(point)); - popover = popover - .popup(menu::context_menu( - &self.config, - &self.key_binds, - popup_entity, - link.clone(), - )) - .position(widget::popover::Position::Point(point)); - popover.into() - } else { - terminal_box.into() - } - } else { - terminal_box.into() - } - } else { - terminal_box.into() - }; - tab_column = tab_column.push(tab_element); + let mut context_menu = widget::context_menu( + terminal_box, + context_link.map(|link| { + menu::context_menu(&self.config, &self.key_binds, entity, link) + }), + ) + .item_width(widget::menu::ItemWidth::Uniform(360)) + .on_close(Message::TabContextMenu(pane, None)) + .on_surface_action(Message::Surface); + if let Some(window_id) = self.core.main_window_id() { + context_menu = context_menu.window_id(window_id); + } + tab_column = tab_column.push(context_menu); } //Only draw find in the currently focused pane @@ -3728,14 +3584,6 @@ impl Application for App { } } -#[cfg(feature = "wayland")] -fn is_wayland() -> bool { - matches!( - cosmic::app::cosmic::windowing_system(), - Some(cosmic::app::cosmic::WindowingSystem::Wayland) - ) -} - /// Divider color painted behind the pane grid to form pane borders. /// /// When blur is active the transparent container must be used, otherwise the diff --git a/src/menu.rs b/src/menu.rs index 1383436..5cebe50 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,17 +1,15 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::iced::Point; +use cosmic::widget::menu::action::MenuAction; use cosmic::widget::menu::key_bind::KeyBind; use cosmic::widget::menu::{Item as MenuItem, menu_button}; -use cosmic::widget::space; use cosmic::{ Element, app::Core, iced::core::Border, - iced::{Background, Length, advanced::widget::text::Style as TextStyle}, - theme, + iced::{Background, Length}, widget::{ - self, divider, + self, menu::{ItemHeight, ItemWidth}, responsive_menu_bar, segmented_button, }, @@ -23,127 +21,68 @@ use crate::{Action, ColorSchemeId, ColorSchemeKind, Config, Message, fl}; static MENU_ID: LazyLock = LazyLock::new(|| cosmic::widget::Id::new("responsive-menu")); +/// What the terminal found under the right-click #[derive(Debug, Clone)] pub struct MenuState { - pub position: Option, - pub local_position: Option, pub link: Option, } -pub fn context_menu<'a>( +/// A context menu action dispatched to the tab the menu was opened on. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct TabAction(pub segmented_button::Entity, pub Action); + +impl MenuAction for TabAction { + type Message = Message; + + fn message(&self) -> Message { + Message::TabContextAction(self.0, self.1) + } +} + +pub fn context_menu( config: &Config, key_binds: &HashMap, entity: segmented_button::Entity, link: Option, -) -> Element<'a, 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() - } - } +) -> Vec> { + let item = + |label: String, action: Action| MenuItem::Button(label, None, TabAction(entity, action)); - let menu_item = |label, action| { - let key = find_key(&action); - menu_button(vec![ - widget::text(label).into(), - space::horizontal().into(), - widget::text(key) - .class(theme::Text::Custom(key_style)) - .into(), - ]) - .on_press(Message::TabContextAction(entity, action)) - }; - - let menu_checkbox = |label, value, action| { - menu_button(vec![ - widget::text(label).into(), - widget::space::horizontal().into(), - widget::toggler(value) - .on_toggle(move |_| Message::TabContextAction(entity, action)) - .size(16.0) - .into(), - ]) - .on_press(Message::TabContextAction(entity, action)) - }; - - let mut rows = vec![ - Element::from(menu_item(fl!("copy"), Action::Copy)), - Element::from(menu_item(fl!("paste"), Action::Paste)), - Element::from(menu_item(fl!("select-all"), Action::SelectAll)), - Element::from(divider::horizontal::light()), - Element::from(menu_item(fl!("clear-scrollback"), Action::ClearScrollback)), - Element::from(divider::horizontal::light()), - Element::from(menu_item( - fl!("split-horizontal"), - Action::PaneSplitHorizontal, - )), - Element::from(menu_item(fl!("split-vertical"), Action::PaneSplitVertical)), - Element::from(menu_item( - fl!("pane-toggle-maximize"), - Action::PaneToggleMaximized, - )), - Element::from(divider::horizontal::light()), - Element::from(menu_item(fl!("new-tab"), Action::TabNew)), - Element::from(menu_item(fl!("menu-settings"), Action::Settings)), + let mut items = vec![ + item(fl!("copy"), Action::Copy), + item(fl!("paste"), Action::Paste), + item(fl!("select-all"), Action::SelectAll), + MenuItem::Divider, + item(fl!("clear-scrollback"), Action::ClearScrollback), + MenuItem::Divider, + item(fl!("split-horizontal"), Action::PaneSplitHorizontal), + item(fl!("split-vertical"), Action::PaneSplitVertical), + item(fl!("pane-toggle-maximize"), Action::PaneToggleMaximized), + MenuItem::Divider, + item(fl!("new-tab"), Action::TabNew), + item(fl!("menu-settings"), Action::Settings), ]; #[cfg(feature = "password_manager")] - { - rows.push(Element::from(menu_item( - fl!("menu-password-manager"), - Action::PasswordManager, - ))); - } - rows.push(Element::from(menu_checkbox( + items.push(item(fl!("menu-password-manager"), Action::PasswordManager)); + items.push(MenuItem::CheckBox( fl!("show-headerbar"), + None, config.show_headerbar, - Action::ShowHeaderBar(!config.show_headerbar), - ))); + TabAction(entity, Action::ShowHeaderBar(!config.show_headerbar)), + )); - //If we have a link - //prepend the Open Link item + // If we have a link, prepend the link items if link.is_some() { - rows.insert( - 0, - Element::from(menu_item(fl!("open-link"), Action::LaunchUrlByMenu)), - ); - rows.insert( - 1, - Element::from(menu_item(fl!("copy-link"), Action::CopyUrlByMenu)), - ); - rows.insert(2, Element::from(divider::horizontal::light())); + items.insert(0, item(fl!("open-link"), Action::LaunchUrlByMenu)); + items.insert(1, item(fl!("copy-link"), Action::CopyUrlByMenu)); + items.insert(2, MenuItem::Divider); } - let content = widget::menu::menu_column::MenuColumn::with_children(rows); - widget::container(content) - .padding(1) - //TODO: move style to libcosmic - .style(|theme| { - let cosmic = theme.cosmic(); - let component = &cosmic.background(theme.transparent).component; - widget::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() + + let key_binds: HashMap = key_binds + .iter() + .map(|(key_bind, action)| (key_bind.clone(), TabAction(entity, *action))) + .collect(); + widget::menu::items(&key_binds, items) } pub fn color_scheme_menu<'a>( diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 64b9490..d3b743a 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -112,7 +112,7 @@ pub struct TerminalBox<'a, Message> { show_headerbar: bool, pane_border_radius: Option, click_timing: Duration, - context_menu: Option, + context_menu_open: bool, on_context_menu: Option) -> Message + 'a>>, on_mouse_enter: Option Message + 'a>>, opacity: Option, @@ -139,7 +139,7 @@ where show_headerbar: true, pane_border_radius: None, click_timing: Duration::from_millis(500), - context_menu: None, + context_menu_open: false, on_context_menu: None, on_mouse_enter: None, opacity: None, @@ -184,8 +184,8 @@ where self } - pub fn context_menu(mut self, position: Point) -> Self { - self.context_menu = Some(position); + pub fn context_menu_open(mut self, open: bool) -> Self { + self.context_menu_open = open; self } @@ -249,7 +249,7 @@ where if !state.is_focused { return InputMethod::Disabled; } - if self.context_menu.is_some() { + if self.context_menu_open { return InputMethod::Disabled; } @@ -1353,11 +1353,11 @@ where } // Update context menu state if let Some(on_context_menu) = &self.on_context_menu { - match self.context_menu { - Some(_) => { + match self.context_menu_open { + true => { shell.publish(on_context_menu(None)); } - None => { + false => { if *button == Button::Right { let x = p.x - self.padding.left; let y = p.y - self.padding.top; @@ -1375,15 +1375,7 @@ where None, ); let link = get_hyperlink(&terminal, location); - let abs = cosmic::iced::Point::new( - layout.bounds().x + p.x, - layout.bounds().y + p.y, - ); - shell.publish(on_context_menu(Some(MenuState { - position: Some(abs), - local_position: Some(p), - link, - }))); + shell.publish(on_context_menu(Some(MenuState { link }))); } } } From d25c2108c08549a343bf946297e4bcb368e81dbb Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Tue, 15 Sep 2026 18:36:50 +0200 Subject: [PATCH 06/14] chore: update cosmic-files --- Cargo.lock | 87 +++++++++++++++++++----------------------------------- 1 file changed, 30 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16d5908..1cac21b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -790,7 +790,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "cfg_aliases", ] @@ -1302,26 +1302,13 @@ dependencies = [ "libm", ] -[[package]] -name = "cosmic-client-toolkit" -version = "0.2.0" -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=32283d7)", - "libc", - "smithay-client-toolkit", - "wayland-client", - "wayland-protocols", -] - [[package]] name = "cosmic-client-toolkit" version = "0.2.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" dependencies = [ "bitflags 2.13.2", - "cosmic-protocols 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-protocols", "libc", "smithay-client-toolkit", "wayland-client", @@ -1331,7 +1318,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1352,7 +1339,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "quote", "syn 2.0.119", @@ -1360,14 +1347,14 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.8.0" -source = "git+https://github.com/pop-os/cosmic-files.git#089ad2b417edded26385029166e5b49c13432bf8" +version = "1.9.0" +source = "git+https://github.com/pop-os/cosmic-files.git#d6e7618b76e52a12bccc3c2adf5cad0820ff7101" dependencies = [ "anyhow", "atomic_float", "bstr", "compio", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", + "cosmic-client-toolkit", "dirs 6.0.0", "filetime", "flate2", @@ -1432,20 +1419,6 @@ dependencies = [ "xdg", ] -[[package]] -name = "cosmic-protocols" -version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=32283d7#32283d76a8d0342da74c4cc022a533c52dcf378f" -dependencies = [ - "bitflags 2.13.2", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "wayland-server", -] - [[package]] name = "cosmic-protocols" version = "0.2.0" @@ -1526,7 +1499,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "almost", "configparser", @@ -2919,7 +2892,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "build_helpers", "dnd", @@ -2941,7 +2914,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "accesskit", "accesskit_winit", @@ -2950,12 +2923,12 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "bitflags 2.13.2", "build_helpers", "bytes", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit", "dnd", "glam", "lilt", @@ -2976,7 +2949,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "iced_core", "iced_futures", @@ -2986,7 +2959,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "futures", "iced_core", @@ -3000,7 +2973,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "bitflags 2.13.2", "bytemuck", @@ -3021,7 +2994,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "iced_graphics", "iced_runtime", @@ -3030,7 +3003,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3042,11 +3015,11 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "build_helpers", "bytes", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit", "dnd", "iced_core", "iced_futures", @@ -3058,7 +3031,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "bytemuck", "cosmic-text", @@ -3075,13 +3048,13 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "as-raw-xcb-connection", "bitflags 2.13.2", "build_helpers", "bytemuck", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit", "cryoglyph", "futures", "glam", @@ -3107,10 +3080,10 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "build_helpers", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit", "dnd", "iced_renderer", "iced_runtime", @@ -3126,10 +3099,10 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "build_helpers", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d)", + "cosmic-client-toolkit", "cursor-icon", "dnd", "iced_debug", @@ -4225,13 +4198,13 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#7e82198ab1aba712640b0167e58ad37bf03012ca" +source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" dependencies = [ "apply", "ashpd 0.12.3", "auto_enums", "build_helpers", - "cosmic-client-toolkit 0.2.0 (git+https://github.com/pop-os/cosmic-protocols?rev=32283d7)", + "cosmic-client-toolkit", "cosmic-config", "cosmic-freedesktop-icons", "cosmic-settings-daemon", @@ -8868,9 +8841,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" [[package]] name = "zmij" From 78eaba9db1df42b62f3afd02065ad45a1cb7011e Mon Sep 17 00:00:00 2001 From: Hojjat Date: Tue, 15 Sep 2026 15:03:20 -0600 Subject: [PATCH 07/14] chore: tweak context menu items order and wording --- i18n/en/cosmic_term.ftl | 3 ++- src/menu.rs | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index c2b0f15..38a0b13 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -63,6 +63,7 @@ show-pane-borders = Show pane borders ### Advanced advanced = Advanced show-headerbar = Show header +window-header = Window header show-header-description = Reveal the header from the right-click menu tab-new-inherit-working-directory = New tabs and windows use current directory tab-new-inherit-working-directory-description = Open new tabs and windows in the active tab's working directory @@ -133,7 +134,7 @@ next-tab = Next tab previous-tab = Previous tab split-horizontal = Split horizontal split-vertical = Split vertical -pane-toggle-maximize = Toggle maximized +pane-toggle-maximize = Maximize or restore pane menu-color-schemes = Color schemes... menu-settings = Settings... menu-about = About COSMIC Terminal... diff --git a/src/menu.rs b/src/menu.rs index 5cebe50..bc66cac 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -49,6 +49,8 @@ pub fn context_menu( |label: String, action: Action| MenuItem::Button(label, None, TabAction(entity, action)); let mut items = vec![ + item(fl!("new-tab"), Action::TabNew), + MenuItem::Divider, item(fl!("copy"), Action::Copy), item(fl!("paste"), Action::Paste), item(fl!("select-all"), Action::SelectAll), @@ -59,18 +61,17 @@ pub fn context_menu( item(fl!("split-vertical"), Action::PaneSplitVertical), item(fl!("pane-toggle-maximize"), Action::PaneToggleMaximized), MenuItem::Divider, - item(fl!("new-tab"), Action::TabNew), - item(fl!("menu-settings"), Action::Settings), + MenuItem::CheckBox( + fl!("window-header"), + None, + config.show_headerbar, + TabAction(entity, Action::ShowHeaderBar(!config.show_headerbar)), + ), + MenuItem::Divider, ]; #[cfg(feature = "password_manager")] items.push(item(fl!("menu-password-manager"), Action::PasswordManager)); - items.push(MenuItem::CheckBox( - fl!("show-headerbar"), - None, - config.show_headerbar, - TabAction(entity, Action::ShowHeaderBar(!config.show_headerbar)), - )); - + items.push(item(fl!("menu-settings"), Action::Settings)); // If we have a link, prepend the link items if link.is_some() { items.insert(0, item(fl!("open-link"), Action::LaunchUrlByMenu)); From 9129277bed1e810418a3138d683c1bc15656234f Mon Sep 17 00:00:00 2001 From: Hojjat Date: Tue, 22 Sep 2026 14:25:20 -0600 Subject: [PATCH 08/14] chore: update libcosmic to fix esc handling in menus --- Cargo.lock | 74 +++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1cac21b..20de1e2 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?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" dependencies = [ "uuid", ] @@ -29,7 +29,7 @@ dependencies = [ [[package]] name = "accesskit_atspi_common" version = "0.15.0" -source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" dependencies = [ "accesskit", "accesskit_consumer", @@ -41,7 +41,7 @@ dependencies = [ [[package]] name = "accesskit_consumer" version = "0.32.0" -source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" 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?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" dependencies = [ "accesskit", "accesskit_consumer", @@ -63,7 +63,7 @@ dependencies = [ [[package]] name = "accesskit_unix" version = "0.18.0" -source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" 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?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" dependencies = [ "accesskit", "accesskit_consumer", @@ -91,7 +91,7 @@ dependencies = [ [[package]] name = "accesskit_winit" version = "0.30.0" -source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" +source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" dependencies = [ "accesskit", "accesskit_macos", @@ -790,7 +790,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "cfg_aliases", ] @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "quote", "syn 2.0.119", @@ -1499,7 +1499,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "almost", "configparser", @@ -1915,7 +1915,7 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" [[package]] name = "drm" @@ -2892,7 +2892,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "dnd", @@ -2914,7 +2914,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "accesskit", "accesskit_winit", @@ -2923,7 +2923,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bitflags 2.13.2", "build_helpers", @@ -2949,7 +2949,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_core", "iced_futures", @@ -2959,7 +2959,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "futures", "iced_core", @@ -2973,7 +2973,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bitflags 2.13.2", "bytemuck", @@ -2994,7 +2994,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_graphics", "iced_runtime", @@ -3003,7 +3003,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3015,7 +3015,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "bytes", @@ -3031,7 +3031,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bytemuck", "cosmic-text", @@ -3048,7 +3048,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "as-raw-xcb-connection", "bitflags 2.13.2", @@ -3080,7 +3080,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3099,7 +3099,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -4198,7 +4198,7 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#d921602cde8248c070b493ce43b0edd388e19b9a" +source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "apply", "ashpd 0.12.3", @@ -8184,7 +8184,7 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cfg_aliases", @@ -8210,7 +8210,7 @@ dependencies = [ [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "android-activity", "bitflags 2.13.2", @@ -8225,7 +8225,7 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "block2 0.6.2", @@ -8247,7 +8247,7 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "memmap2 0.9.11", "objc2 0.6.4", @@ -8262,7 +8262,7 @@ dependencies = [ [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cursor-icon", @@ -8276,7 +8276,7 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "dpi", @@ -8292,7 +8292,7 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "block2 0.6.2", @@ -8312,7 +8312,7 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "ahash", "bitflags 2.13.2", @@ -8338,7 +8338,7 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "atomic-waker", "bitflags 2.13.2", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cursor-icon", @@ -8376,7 +8376,7 @@ dependencies = [ [[package]] name = "winit-x11" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" +source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "bytemuck", From 81dc7d3eebb9bccc2ed5f603fb0a3721a3bed298 Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 24 Sep 2026 21:03:54 +0200 Subject: [PATCH 09/14] chore: fige Cargo.lock (epoch-1.9.0, [patch] locaux) Co-Authored-By: Claude Opus 5.5 (1M context) --- Cargo.lock | 798 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 576 insertions(+), 222 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20de1e2..a8eed3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,7 +146,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46319972e74179d707445f64aaa2893bbf6a111de3a9af29b7eb382f8b39e282" dependencies = [ - "base64", + "base64 0.22.1", "bitflags 2.13.2", "home", "libc", @@ -309,12 +309,6 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - [[package]] name = "as-slice" version = "0.2.1" @@ -628,6 +622,12 @@ 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" @@ -790,7 +790,6 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "cfg_aliases", ] @@ -980,7 +979,6 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "objc", "objc-foundation", @@ -990,22 +988,12 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "dnd", "mime 0.1.0", "smithay-clipboard", ] -[[package]] -name = "clipboard_x11" -version = "0.4.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" -dependencies = [ - "thiserror 1.0.69", - "x11rb", -] - [[package]] name = "cmov" version = "0.5.4" @@ -1023,7 +1011,7 @@ dependencies = [ "cocoa-foundation", "core-foundation 0.9.4", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] @@ -1256,7 +1244,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1293,6 +1281,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + [[package]] name = "core_maths" version = "0.1.1" @@ -1305,7 +1299,6 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" dependencies = [ "bitflags 2.13.2", "cosmic-protocols", @@ -1318,7 +1311,6 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1339,7 +1331,6 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "quote", "syn 2.0.119", @@ -1348,7 +1339,6 @@ dependencies = [ [[package]] name = "cosmic-files" version = "1.9.0" -source = "git+https://github.com/pop-os/cosmic-files.git#d6e7618b76e52a12bccc3c2adf5cad0820ff7101" dependencies = [ "anyhow", "atomic_float", @@ -1369,7 +1359,7 @@ dependencies = [ "jiff-icu", "jxl-oxide", "libc", - "libcosmic", + "libcosmic-yoda", "log", "md-5", "mime_guess", @@ -1408,7 +1398,6 @@ dependencies = [ [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" -source = "git+https://github.com/pop-os/freedesktop-icons#ab4c57b8e416c6af9297cb04d101889896fd9a92" dependencies = [ "bstr", "btoi", @@ -1422,7 +1411,6 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" -source = "git+https://github.com/pop-os/cosmic-protocols?rev=c0cff4d#c0cff4db14c37ed954983158e4055aa94c7741d9" dependencies = [ "bitflags 2.13.2", "wayland-backend", @@ -1435,8 +1423,7 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" -version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings#eed01dd3609e90e3c8cd043656734c500956c793" +version = "0.1.1-yoda.1" dependencies = [ "zbus", ] @@ -1455,16 +1442,18 @@ dependencies = [ "i18n-embed-fl", "icu", "indexmap", - "libcosmic", + "libcosmic-yoda", "log", "open", "paste", "regex", + "reqwest", "ron 0.11.0", "rust-embed", "secret-service", "secstr", "serde", + "serde_json", "shlex 1.3.0", "thiserror 2.0.20", "tokio", @@ -1475,8 +1464,6 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ "bitflags 2.13.2", "fontdb", @@ -1494,12 +1481,12 @@ dependencies = [ "unicode-linebreak", "unicode-script", "unicode-segmentation", + "unicode-width", ] [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "almost", "configparser", @@ -1590,7 +1577,6 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" -source = "git+https://github.com/iced-rs/cryoglyph.git?rev=e429a025df36ab8145708acb309080ae3deec17a#e429a025df36ab8145708acb309080ae3deec17a" dependencies = [ "cosmic-text", "etagere", @@ -1636,15 +1622,6 @@ dependencies = [ "uncased", ] -[[package]] -name = "ctor" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" -dependencies = [ - "dtor", -] - [[package]] name = "ctutils" version = "0.4.2" @@ -1888,7 +1865,6 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "bitflags 2.13.2", "mime 0.1.0", @@ -1915,52 +1891,6 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" - -[[package]] -name = "drm" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" -dependencies = [ - "bitflags 2.13.2", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" -dependencies = [ - "drm-sys", - "rustix 0.38.44", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - -[[package]] -name = "dtor" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" [[package]] name = "either" @@ -1968,6 +1898,20 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" +[[package]] +name = "encoding_rs" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" +dependencies = [ + "cfg-if", + "core_detect", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", +] + [[package]] name = "endi" version = "1.1.1" @@ -2304,6 +2248,15 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -2311,7 +2264,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -2325,6 +2278,12 @@ dependencies = [ "syn 3.0.5", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -2503,16 +2462,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link 0.2.1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -2676,6 +2625,25 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" @@ -2789,6 +2757,45 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "hybrid-array" version = "0.4.15" @@ -2798,6 +2805,84 @@ dependencies = [ "typenum", ] +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + [[package]] name = "i18n-config" version = "0.4.8" @@ -2892,7 +2977,6 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "dnd", @@ -2914,7 +2998,6 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "accesskit", "accesskit_winit", @@ -2923,7 +3006,6 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bitflags 2.13.2", "build_helpers", @@ -2949,7 +3031,6 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_core", "iced_futures", @@ -2959,7 +3040,6 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "futures", "iced_core", @@ -2973,7 +3053,6 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bitflags 2.13.2", "bytemuck", @@ -2994,7 +3073,6 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_graphics", "iced_runtime", @@ -3003,7 +3081,6 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3015,7 +3092,6 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "bytes", @@ -3031,7 +3107,6 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "bytemuck", "cosmic-text", @@ -3048,9 +3123,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ - "as-raw-xcb-connection", "bitflags 2.13.2", "build_helpers", "bytemuck", @@ -3068,19 +3141,16 @@ dependencies = [ "rustc-hash 2.1.3", "rustix 0.38.44", "thiserror 2.0.20", - "tiny-xlib", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-sys", "wgpu", - "x11rb", ] [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3099,7 +3169,6 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3721,6 +3790,12 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + [[package]] name = "is-docker" version = "0.2.0" @@ -4196,9 +4271,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] -name = "libcosmic" -version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#08a09e3dfa1f729d52585fcedd6e731130235363" +name = "libcosmic-yoda" +version = "0.1.0-yoda.2" dependencies = [ "apply", "ashpd 0.12.3", @@ -4303,12 +4377,6 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -4512,7 +4580,7 @@ dependencies = [ "bitflags 2.13.2", "block", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -4521,7 +4589,6 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "smithay-clipboard", ] @@ -4599,6 +4666,12 @@ dependencies = [ "pxfm", ] +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "mutate_once" version = "0.1.2" @@ -4631,6 +4704,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.9.0" @@ -5097,6 +5187,49 @@ dependencies = [ "libc", ] +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -5944,6 +6077,49 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime 0.3.17", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + [[package]] name = "resvg" version = "0.45.1" @@ -5994,13 +6170,27 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "ron" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ - "base64", + "base64 0.22.1", "bitflags 2.13.2", "serde", "serde_derive", @@ -6120,6 +6310,39 @@ dependencies = [ "rustix 1.1.4", ] +[[package]] +name = "rustls" +version = "0.23.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.23" @@ -6144,6 +6367,12 @@ dependencies = [ "unicode-script", ] +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "same-file" version = "1.0.6" @@ -6153,6 +6382,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -6206,6 +6444,29 @@ dependencies = [ "libc", ] +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.3.0" @@ -6273,6 +6534,18 @@ dependencies = [ "syn 3.0.5", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha1" version = "0.11.0" @@ -6467,7 +6740,6 @@ dependencies = [ [[package]] name = "smithay-clipboard" version = "0.8.0" -source = "git+https://github.com/pop-os/smithay-clipboard?tag=sctk-0.20#859b02c88f45c554049a67c6ddeec1692ce0e20b" dependencies = [ "libc", "raw-window-handle", @@ -6498,31 +6770,26 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" dependencies = [ - "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", - "drm", "fastrand", - "foreign-types", + "foreign-types 0.5.0", "js-sys", + "libredox", "log", "memmap2 0.9.11", "objc", "raw-window-handle", - "redox_syscall 0.5.18", "rustix 0.38.44", - "tiny-xlib", "wasm-bindgen", "wayland-backend", "wayland-client", "wayland-sys", "web-sys", "windows-sys 0.52.0", - "x11rb", ] [[package]] @@ -6570,6 +6837,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -6619,6 +6892,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synchrony" version = "0.1.9" @@ -6649,6 +6931,27 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "taffy" version = "0.9.2" @@ -6834,19 +7137,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tiny-xlib" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" -dependencies = [ - "as-raw-xcb-connection", - "ctor", - "libloading", - "pkg-config", - "tracing", -] - [[package]] name = "tinystr" version = "0.8.4" @@ -6892,6 +7182,26 @@ dependencies = [ "syn 3.0.5", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.19" @@ -6903,6 +7213,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.11" @@ -6942,6 +7266,51 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.2", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.44" @@ -7022,6 +7391,12 @@ dependencies = [ "windows 0.62.2", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "ttf-parser" version = "0.25.1" @@ -7163,6 +7538,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.8" @@ -7188,7 +7569,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ - "base64", + "base64 0.22.1", "data-url", "flate2", "fontdb", @@ -7259,6 +7640,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -7289,6 +7676,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -7359,6 +7755,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmtimer" version = "0.4.3" @@ -7739,12 +8148,10 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", - "clipboard_x11", "dnd", "mime 0.1.0", "raw-window-handle", @@ -7896,6 +8303,17 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -8184,7 +8602,6 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cfg_aliases", @@ -8204,13 +8621,11 @@ dependencies = [ "winit-wayland", "winit-web", "winit-win32", - "winit-x11", ] [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "android-activity", "bitflags 2.13.2", @@ -8225,7 +8640,6 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "block2 0.6.2", @@ -8247,7 +8661,6 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "memmap2 0.9.11", "objc2 0.6.4", @@ -8255,14 +8668,12 @@ dependencies = [ "smol_str", "tracing", "winit-core", - "x11-dl", "xkbcommon-dl", ] [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cursor-icon", @@ -8276,7 +8687,6 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "dpi", @@ -8292,7 +8702,6 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "block2 0.6.2", @@ -8312,7 +8721,6 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "ahash", "bitflags 2.13.2", @@ -8338,7 +8746,6 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "atomic-waker", "bitflags 2.13.2", @@ -8360,7 +8767,6 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" dependencies = [ "bitflags 2.13.2", "cursor-icon", @@ -8373,29 +8779,6 @@ dependencies = [ "winit-core", ] -[[package]] -name = "winit-x11" -version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?rev=9567503#9567503d34130113e36b0167a2b8829c3756e429" -dependencies = [ - "bitflags 2.13.2", - "bytemuck", - "calloop", - "cursor-icon", - "dpi", - "libc", - "percent-encoding", - "raw-window-handle", - "rustix 1.1.4", - "smol_str", - "tracing", - "winit-common", - "winit-core", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - [[package]] name = "winnow" version = "1.0.4" @@ -8426,39 +8809,6 @@ dependencies = [ "either", ] -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 1.1.4", - "x11rb-protocol", - "xcursor", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - [[package]] name = "xattr" version = "1.6.1" @@ -8971,3 +9321,7 @@ dependencies = [ "syn 3.0.5", "winnow", ] + +[[patch.unused]] +name = "winit-x11" +version = "0.31.0-beta.2" From 2414aaece3b1b5360ac6dfd1548adea9f279226b Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 1 Oct 2026 13:12:28 +0200 Subject: [PATCH 10/14] yoda: notifications de bureau OSC 9/777 et cloche utile, a la Ghostty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vte 0.15 jette les OSC 9 et 777 : Claude Code (canal « ghostty ») ou tout programme qui veut signaler « j'attends » ne pouvait rien faire remonter, et la cloche etait un TODO. Avec plusieurs sessions en onglets, rien ne disait laquelle attendait une reponse. - osc_tap : le Pty est enveloppe, son lecteur passe chaque lecture a un petit automate qui repere OSC 777;notify;titre;corps et OSC 9;texte (les commandes ConEmu 9;N, dont la progression 9;4, sont ecartees comme dans Ghostty). Ni alacritty_terminal ni vte ne sont forkes. - desktop_notify : org.freedesktop.Notifications en direct (zbus), pour recuperer le jeton ActivationToken au clic : la notification ramene la fenetre au premier plan, sur le bon panneau et le bon onglet. Une notification par onglet au plus (replaces_id), anti-rafale de Ghostty (1/s, identique toutes les 5 s), titre suivi du nom de l'onglet. - Rien n'est envoye pour l'onglet qu'on a sous les yeux. Sinon l'onglet porte une icone d'attention (cloche ou notification), eteinte quand il reprend le focus. - Cloche : indicateur d'onglet seulement. Pas de demande d'attention xdg-activation : cosmic-comp donne un jeton valide a toute application non sandboxee, la fenetre volerait le focus. - Focus 1004 : l'onglet quitte recoit enfin son focus-out (seul l'onglet actif de chaque panneau etait mis a jour) ; un agent en arriere-plan ne croit plus qu'on le regarde. - Chevrons du corps remplaces par ‹ › : cosmic-notifications lit le corps en HTML sans decoder les entites. 7 tests, dont un de bout en bout dans un vrai PTY. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 2 + Cargo.toml | 3 + i18n/en/cosmic_term.ftl | 3 + i18n/fr/cosmic_term.ftl | 3 + src/desktop_notify.rs | 185 ++++++++++++++++++ src/main.rs | 164 +++++++++++++++- src/osc_tap.rs | 407 ++++++++++++++++++++++++++++++++++++++++ src/terminal.rs | 117 ++++++++++-- 8 files changed, 859 insertions(+), 25 deletions(-) create mode 100644 src/desktop_notify.rs create mode 100644 src/osc_tap.rs diff --git a/Cargo.lock b/Cargo.lock index a8eed3d..fb67632 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1446,6 +1446,7 @@ dependencies = [ "log", "open", "paste", + "polling", "regex", "reqwest", "ron 0.11.0", @@ -1459,6 +1460,7 @@ dependencies = [ "tokio", "url", "xdgen", + "zbus", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index b796364..c95c38f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,9 @@ ron = "0.11" serde = { version = "1", features = ["serde_derive"] } shlex = "1" tokio = { version = "1", features = ["sync", "rt", "macros", "time"] } +# Notifications de bureau (OSC 9 / 777) et enveloppe du PTY (yoda) +polling = "3.11" +zbus = "5.19" # HTTP client for Modjo AI integration reqwest = { version = "0.12", features = ["json", "stream"], optional = true } serde_json = { version = "1", optional = true } diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index 2ff6c3c..d4a8c90 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -140,6 +140,9 @@ monitor-activity = Monitor for activity monitor-silence = Monitor for silence monitor-process-finished = Monitor for process finishing +## Notifications +notification-show = Show tab + ## Open open-link = Open Link copy-link = Copy Link diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index 834c800..350158b 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -109,6 +109,9 @@ monitor-activity = Surveiller l'activité monitor-silence = Surveiller le silence monitor-process-finished = Surveiller la fin du processus +## Notifications +notification-show = Afficher l'onglet + ## View view = Affichage diff --git a/src/desktop_notify.rs b/src/desktop_notify.rs new file mode 100644 index 0000000..4ad9821 --- /dev/null +++ b/src/desktop_notify.rs @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: GPL-3.0-only + +//! Notifications de bureau des OSC 9 / 777 (yoda). +//! +//! On parle directement à `org.freedesktop.Notifications` plutôt que de passer +//! par notify-rust : au clic, cosmic-notifications émet `ActivationToken` puis +//! `ActionInvoked`, et c'est ce jeton xdg-activation qui permet de ramener la +//! fenêtre au premier plan sur le bon onglet. +//! +//! Une notification par onglet au plus : la suivante remplace la précédente +//! (`replaces_id`). + +use cosmic::{ + Application, + iced::{ + Subscription, + futures::{SinkExt, channel::mpsc::Sender}, + stream, + }, + widget::{pane_grid, segmented_button}, +}; +use std::{any::TypeId, collections::HashMap}; +use tokio::sync::mpsc; + +use crate::fl; + +/// Onglet à l'origine d'une notification. +pub type TabKey = (pane_grid::Pane, segmented_button::Entity); + +/// Demande envoyée par l'application à la tâche D-Bus. +#[derive(Debug)] +pub enum Request { + Show { + tab: TabKey, + summary: String, + body: String, + }, +} + +/// Événement renvoyé par la tâche D-Bus à l'application. +#[derive(Clone, Debug)] +pub enum Event { + /// Canal prêt : l'application peut envoyer ses demandes. + Ready(mpsc::UnboundedSender), + /// L'utilisateur a cliqué la notification de cet onglet. + Activated { tab: TabKey, token: Option }, +} + +#[zbus::proxy( + interface = "org.freedesktop.Notifications", + default_service = "org.freedesktop.Notifications", + default_path = "/org/freedesktop/Notifications" +)] +trait Notifications { + #[allow(clippy::too_many_arguments)] + fn notify( + &self, + app_name: &str, + replaces_id: u32, + app_icon: &str, + summary: &str, + body: &str, + actions: &[&str], + hints: HashMap<&str, zbus::zvariant::Value<'_>>, + expire_timeout: i32, + ) -> zbus::Result; + + #[zbus(signal)] + fn action_invoked(&self, id: u32, action_key: String) -> zbus::Result<()>; + + #[zbus(signal)] + fn activation_token(&self, id: u32, activation_token: String) -> zbus::Result<()>; + + #[zbus(signal)] + fn notification_closed(&self, id: u32, reason: u32) -> zbus::Result<()>; +} + +struct DesktopNotifySubscription; + +pub fn subscription() -> Subscription { + Subscription::run_with(TypeId::of::(), |_| { + stream::channel(16, |mut output: Sender| async move { + let (request_tx, request_rx) = mpsc::unbounded_channel(); + if output.send(Event::Ready(request_tx)).await.is_err() { + return; + } + if let Err(err) = run(request_rx, output).await { + log::warn!("desktop notifications unavailable: {err}"); + } + }) + }) +} + +async fn run( + mut request_rx: mpsc::UnboundedReceiver, + mut output: Sender, +) -> zbus::Result<()> { + use cosmic::iced::futures::StreamExt; + + let connection = zbus::Connection::session().await?; + let proxy = NotificationsProxy::new(&connection).await?; + let mut tokens = proxy.receive_activation_token().await?; + let mut invoked = proxy.receive_action_invoked().await?; + let mut closed = proxy.receive_notification_closed().await?; + + let app_name = fl!("cosmic-terminal"); + let show_label = fl!("notification-show"); + let mut tab_by_id: HashMap = HashMap::new(); + let mut id_by_tab: HashMap = HashMap::new(); + let mut pending_tokens: HashMap = HashMap::new(); + + loop { + tokio::select! { + request = request_rx.recv() => { + let Some(Request::Show { tab, summary, body }) = request else { + return Ok(()); + }; + let replaces_id = id_by_tab.get(&tab).copied().unwrap_or(0); + let body = neutralize_markup(&body); + let hints = HashMap::from([ + ("desktop-entry", zbus::zvariant::Value::from(crate::App::APP_ID)), + ("urgency", zbus::zvariant::Value::U8(1)), + ]); + match proxy + .notify( + &app_name, + replaces_id, + crate::App::APP_ID, + &summary, + &body, + &["default", &show_label], + hints, + -1, + ) + .await + { + Ok(id) => { + if replaces_id != 0 && replaces_id != id { + tab_by_id.remove(&replaces_id); + } + tab_by_id.insert(id, tab); + id_by_tab.insert(tab, id); + } + Err(err) => log::warn!("failed to send desktop notification: {err}"), + } + } + Some(signal) = tokens.next() => { + if let Ok(args) = signal.args() + && tab_by_id.contains_key(args.id()) + { + pending_tokens.insert(*args.id(), args.activation_token().clone()); + } + } + Some(signal) = invoked.next() => { + if let Ok(args) = signal.args() + && let Some(tab) = tab_by_id.get(args.id()).copied() + { + let token = pending_tokens.remove(args.id()); + if output.send(Event::Activated { tab, token }).await.is_err() { + return Ok(()); + } + } + } + Some(signal) = closed.next() => { + if let Ok(args) = signal.args() + && let Some(tab) = tab_by_id.remove(args.id()) + { + if id_by_tab.get(&tab) == Some(args.id()) { + id_by_tab.remove(&tab); + } + pending_tokens.remove(args.id()); + } + } + } + } +} + +/// Le corps d'une notification est du balisage (`body-markup`). Échapper `<` +/// en `<` serait conforme à la spécification, mais cosmic-notifications ne +/// décode pas les entités (il afficherait `<`), et un `<` brut y avale le +/// texte qui suit. Les chevrons deviennent donc des guillemets simples +/// d'aspect voisin, lisibles sur tous les serveurs. +fn neutralize_markup(body: &str) -> String { + body.replace('<', "‹").replace('>', "›") +} diff --git a/src/main.rs b/src/main.rs index 1a72235..06cc965 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,9 +68,17 @@ mod localize; use menu::menu_bar; mod menu; -use terminal::{MONITOR_SILENCE_SECONDS, MonitorKind, Terminal, TerminalPaneGrid, TerminalScroll}; +use terminal::{ + AttentionKind, MONITOR_SILENCE_SECONDS, MonitorKind, PtyEvent, Terminal, TerminalPaneGrid, + TerminalScroll, +}; mod terminal; +mod desktop_notify; + +use osc_tap::OscEvent; +mod osc_tap; + use terminal_box::terminal_box; use crate::dnd::DndDrop; @@ -94,7 +102,13 @@ pub fn icon_cache_get(name: &'static str, size: u16) -> widget::icon::Icon { /// Tab bar indicator for the monitor state of a terminal: /// an alert icon if one fired, an "armed" icon while monitoring, else none. +/// Un appel d'attention (cloche, notification) passe avant les moniteurs. fn monitor_icon_name(terminal: &Terminal) -> Option<&'static str> { + match terminal.attention { + Some(AttentionKind::Bell) => return Some("notification-alert-symbolic"), + Some(AttentionKind::Notification) => return Some("notification-new-symbolic"), + None => {} + } match terminal.monitor_alert { Some(MonitorKind::Activity) => Some("dialog-information-symbolic"), Some(MonitorKind::Silence) => Some("alarm-symbolic"), @@ -592,7 +606,9 @@ pub enum Message { TabRenameCancel, TabRenameResetToDefault, TermEvent(pane_grid::Pane, segmented_button::Entity, TermEvent), - TermEventTx(mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, TermEvent)>), + TermEventTx(mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, PtyEvent)>), + TermOsc(pane_grid::Pane, segmented_button::Entity, OscEvent), + DesktopNotify(desktop_notify::Event), ToggleFullscreen, ToggleContextPage(ContextPage), UpdateDefaultProfile((bool, ProfileId)), @@ -658,7 +674,9 @@ pub struct App { find_search_id: widget::Id, find_search_value: String, term_event_tx_opt: - Option>, + Option>, + notify_tx_opt: Option>, + window_focused: bool, startup_options: Option, startup_profile_id: Option, term_config: term::Config, @@ -686,6 +704,51 @@ pub struct App { } impl App { + /// L'onglet est-il sous les yeux de l'utilisateur : onglet actif du panneau + /// focalisé, dans une fenêtre qui a le focus. + fn tab_in_view(&self, pane: pane_grid::Pane, entity: segmented_button::Entity) -> bool { + self.window_focused + && self.pane_model.focused() == pane + && self + .pane_model + .panes + .get(pane) + .is_some_and(|tab_model| tab_model.active() == entity) + } + + /// Allume l'indicateur d'attention d'un onglet ; il s'éteint quand + /// l'onglet reprend le focus (voir `TerminalPaneGrid::update_terminal_focus`). + fn set_tab_attention( + &mut self, + pane: pane_grid::Pane, + entity: segmented_button::Entity, + kind: AttentionKind, + ) { + let Some(tab_model) = self.pane_model.panes.get_mut(pane) else { + return; + }; + let mut icon_update = None; + if let Some(terminal) = tab_model.data::>(entity) { + let mut terminal = terminal.lock().unwrap(); + // Une notification n'est pas rétrogradée en simple cloche + if terminal.attention != Some(AttentionKind::Notification) { + terminal.attention = Some(kind); + icon_update = Some(monitor_icon_name(&terminal)); + } + } + if let Some(icon_name) = icon_update { + monitor_update_tab_icon(tab_model, entity, icon_name); + } + } + + /// Recale le focus des terminaux après un changement d'onglet : l'onglet + /// quitté reçoit son focus-out (mode 1004), le nouvel onglet son focus-in. + fn sync_terminal_focus(&mut self) { + if self.window_focused && !self.core.window.show_context && self.rename_tab.is_none() { + self.pane_model.update_terminal_focus(); + } + } + fn theme_names(&self, color_scheme_kind: ColorSchemeKind) -> &Vec { match color_scheme_kind { ColorSchemeKind::Dark => &self.theme_names_dark, @@ -1990,6 +2053,7 @@ impl App { log::warn!("tried to create new tab before having event channel"); } } + self.sync_terminal_focus(); self.update_title(Some(pane)) } } @@ -2185,6 +2249,8 @@ impl Application for App { startup_profile_id: flags.startup_profile_id, term_config: flags.term_config, term_event_tx_opt: None, + notify_tx_opt: None, + window_focused: true, color_scheme_errors: Vec::new(), color_scheme_expanded: None, color_scheme_renaming: None, @@ -3367,6 +3433,7 @@ impl Application for App { monitor_update_tab_icon(tab_model, entity, icon_name); } } + self.sync_terminal_focus(); return self.update_title(None); } Message::TabActivateJump(pos) => { @@ -3420,6 +3487,7 @@ impl Application for App { } } + self.sync_terminal_focus(); return self.update_title(None); } Message::TabContextAction(entity, action) => { @@ -3589,7 +3657,13 @@ impl Application for App { Message::TermEvent(pane, entity, event) => { match event { TermEvent::Bell => { - //TODO: audible or visible bell options? + // Comme le défaut de Ghostty (`bell-features = attention,title`), + // sans la demande d'attention xdg-activation : cosmic-comp donne + // un jeton valide à toute application non sandboxée, la fenêtre + // volerait le focus. Il reste l'indicateur d'onglet. + if !self.tab_in_view(pane, entity) { + self.set_tab_attention(pane, entity, AttentionKind::Bell); + } } TermEvent::ClipboardLoad(kind, callback) => { match kind { @@ -3749,6 +3823,76 @@ impl Application for App { // Spawn first tab return self.update(Message::TabNew); } + Message::TermOsc(pane, entity, event) => match event { + OscEvent::Notify { title, body } => { + // Rien à signaler pour l'onglet qu'on a sous les yeux + if self.tab_in_view(pane, entity) { + return Task::none(); + } + self.set_tab_attention(pane, entity, AttentionKind::Notification); + + let Some(tab_model) = self.pane_model.panes.get(pane) else { + return Task::none(); + }; + let allowed = tab_model + .data::>(entity) + .is_some_and(|terminal| { + terminal + .lock() + .unwrap() + .notify_allowed(title.as_deref(), &body) + }); + if !allowed { + return Task::none(); + } + + // Titre de la séquence, suivi de l'onglet d'où elle vient : + // plusieurs sessions Claude Code se distinguent ainsi. + let tab_title = tab_model.text(entity).unwrap_or_default().to_string(); + let summary = match title { + Some(title) if !tab_title.is_empty() && title != tab_title => { + format!("{title} · {tab_title}") + } + Some(title) => title, + None if !tab_title.is_empty() => tab_title, + None => fl!("cosmic-terminal"), + }; + if let Some(notify_tx) = &self.notify_tx_opt { + let _ = notify_tx.send(desktop_notify::Request::Show { + tab: (pane, entity), + summary, + body, + }); + } + } + }, + Message::DesktopNotify(event) => match event { + desktop_notify::Event::Ready(notify_tx) => { + self.notify_tx_opt = Some(notify_tx); + } + desktop_notify::Event::Activated { + tab: (pane, entity), + token, + } => { + // Clic sur la notification : retour à l'onglet d'origine, + // puis la fenêtre au premier plan avec le jeton + // xdg-activation fourni par le serveur de notifications. + let mut tasks = Vec::new(); + if let Some(tab_model) = self.pane_model.panes.get_mut(pane) + && tab_model.contains_item(entity) + { + tab_model.activate(entity); + self.pane_model.set_focus(pane); + tasks.push(self.update(Message::TabActivate(entity))); + } + if let Some(token) = token { + tasks.push(Task::done(cosmic::Action::Cosmic( + cosmic::app::Action::Activate(token), + ))); + } + return Task::batch(tasks); + } + }, Message::ToggleContextPage(context_page) => { if self.context_page == context_page { self.core.window.show_context = !self.core.window.show_context; @@ -3839,12 +3983,14 @@ impl Application for App { } }, Message::WindowFocused => { + self.window_focused = true; if !self.core.window.show_context { self.pane_model.update_terminal_focus(); } return self.update_focus(); } Message::WindowUnfocused => { + self.window_focused = false; self.pane_model.unfocus_all_terminals(); } Message::ZoomIn => { @@ -4264,16 +4410,18 @@ impl Application for App { output.send(Message::TermEventTx(event_tx)).await.unwrap(); while let Some((pane, entity, event)) = event_rx.recv().await { - output - .send(Message::TermEvent(pane, entity, event)) - .await - .unwrap(); + let message = match event { + PtyEvent::Term(event) => Message::TermEvent(pane, entity, event), + PtyEvent::Osc(event) => Message::TermOsc(pane, entity, event), + }; + output.send(message).await.unwrap(); } panic!("terminal event channel closed"); }, ) }), + desktop_notify::subscription().map(Message::DesktopNotify), cosmic_config::config_subscription( TypeId::of::(), Self::APP_ID.into(), diff --git a/src/osc_tap.rs b/src/osc_tap.rs new file mode 100644 index 0000000..641fab1 --- /dev/null +++ b/src/osc_tap.rs @@ -0,0 +1,407 @@ +// SPDX-License-Identifier: GPL-3.0-only + +//! Séquences OSC que vte ignore, interceptées à la sortie du PTY (yoda). +//! +//! alacritty_terminal 0.25 / vte 0.15 jettent les OSC 9 et 777 (« unhandled +//! osc_dispatch ») : l'application ne les voit jamais. On les repère donc dans +//! les octets lus sur le PTY, juste avant que vte ne les analyse, en +//! enveloppant le `Pty` : ni alacritty_terminal ni vte ne sont forkés. +//! +//! Formes reconnues, comme dans Ghostty : +//! - `OSC 777 ; notify ; titre ; corps` (forme rxvt, canal « ghostty » de +//! Claude Code) ; +//! - `OSC 9 ; texte` (forme iTerm2), sauf les commandes ConEmu +//! `OSC 9 ; N [; …]` (barre de progression `9;4` comprise), qui ne sont pas +//! des notifications. + +/// Taille maximale retenue pour le contenu d'une séquence OSC ; au-delà, la +/// séquence est ignorée jusqu'à son terminateur. +const OSC_MAX_LEN: usize = 4096; +/// Longueur maximale (en caractères) du titre et du corps d'une notification. +const TITLE_MAX_CHARS: usize = 200; +const BODY_MAX_CHARS: usize = 1000; + +/// Événement extrait d'une séquence OSC. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum OscEvent { + /// Notification de bureau demandée par le programme (OSC 9 ou 777). + Notify { title: Option, body: String }, +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +enum State { + #[default] + Ground, + Escape, + Osc, +} + +/// Automate minimal qui suit le flux d'octets du PTY et ne retient que le +/// contenu des séquences OSC. Les séquences peuvent être coupées entre deux +/// lectures : l'état est conservé d'un appel à l'autre. +#[derive(Debug, Default)] +pub struct OscScanner { + state: State, + buf: Vec, + overflow: bool, +} + +impl OscScanner { + pub fn feed(&mut self, bytes: &[u8], emit: &mut dyn FnMut(OscEvent)) { + for &byte in bytes { + match self.state { + State::Ground => { + if byte == 0x1b { + self.state = State::Escape; + } + } + State::Escape => { + self.state = match byte { + b']' => { + self.buf.clear(); + self.overflow = false; + State::Osc + } + 0x1b => State::Escape, + _ => State::Ground, + }; + } + State::Osc => match byte { + // BEL termine la séquence. + 0x07 => { + self.dispatch(emit); + self.state = State::Ground; + } + // ESC termine aussi la séquence, comme dans vte : c'est le + // début de ST (`ESC \`) ou d'une nouvelle séquence. + 0x1b => { + self.dispatch(emit); + self.state = State::Escape; + } + // CAN et SUB annulent la séquence. + 0x18 | 0x1a => self.state = State::Ground, + _ => { + if self.buf.len() < OSC_MAX_LEN { + self.buf.push(byte); + } else { + self.overflow = true; + } + } + }, + } + } + } + + fn dispatch(&mut self, emit: &mut dyn FnMut(OscEvent)) { + if !self.overflow + && let Some(event) = parse_osc(&self.buf) + { + emit(event); + } + self.buf.clear(); + self.overflow = false; + } +} + +/// Interprète le contenu d'une séquence OSC (entre `ESC ]` et le terminateur). +pub fn parse_osc(payload: &[u8]) -> Option { + if let Some(rest) = payload.strip_prefix(b"777;notify;") { + match rest.iter().position(|&b| b == b';') { + Some(i) => notify(&rest[..i], &rest[i + 1..]), + None => notify(b"", rest), + } + } else if let Some(rest) = payload.strip_prefix(b"9;") { + if is_conemu_command(rest) { + None + } else { + notify(b"", rest) + } + } else { + None + } +} + +/// `OSC 9 ; N` ou `OSC 9 ; N ; …` avec N numérique : commande ConEmu +/// (progression, titre d'onglet, répertoire…), pas une notification. +fn is_conemu_command(rest: &[u8]) -> bool { + let digits = rest.iter().take_while(|b| b.is_ascii_digit()).count(); + digits > 0 && matches!(rest.get(digits), None | Some(b';')) +} + +fn notify(title: &[u8], body: &[u8]) -> Option { + let title = clean(title, TITLE_MAX_CHARS); + let body = clean(body, BODY_MAX_CHARS); + match (title.is_empty(), body.is_empty()) { + (true, true) => None, + // Un titre seul devient le corps. + (false, true) => Some(OscEvent::Notify { + title: None, + body: title, + }), + (true, false) => Some(OscEvent::Notify { title: None, body }), + (false, false) => Some(OscEvent::Notify { + title: Some(title), + body, + }), + } +} + +/// UTF-8 tolérant, caractères de contrôle remplacés par des espaces, longueur +/// bornée. +fn clean(bytes: &[u8], max_chars: usize) -> String { + String::from_utf8_lossy(bytes) + .chars() + .map(|c| if c.is_control() { ' ' } else { c }) + .take(max_chars) + .collect::() + .trim() + .to_string() +} + +#[cfg(unix)] +pub use self::unix::OscTapPty; + +#[cfg(unix)] +mod unix { + use super::{OscEvent, OscScanner}; + use alacritty_terminal::{ + event::{OnResize, WindowSize}, + tty::{ChildEvent, EventedPty, EventedReadWrite, Pty}, + }; + use polling::{Event, PollMode, Poller}; + use std::{ + fs::File, + io::{self, Read}, + sync::Arc, + }; + + /// Lecteur du PTY qui passe chaque lecture au [`OscScanner`] avant de la + /// rendre à la boucle d'alacritty_terminal. + pub struct TapReader { + file: File, + scanner: OscScanner, + sink: Box, + } + + impl Read for TapReader { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + let len = self.file.read(buf)?; + self.scanner.feed(&buf[..len], &mut *self.sink); + Ok(len) + } + } + + /// `Pty` d'alacritty_terminal dont la lecture est observée par un + /// [`TapReader`]. Le lecteur lit un duplicata du descripteur maître (même + /// description de fichier, donc même mode non bloquant) ; l'enregistrement + /// auprès du `Poller`, l'écriture, le redimensionnement et la fin du + /// processus restent ceux du `Pty`. + pub struct OscTapPty { + // Déclaré avant `pty` : le duplicata est fermé avant le maître. + reader: TapReader, + pty: Pty, + } + + impl OscTapPty { + pub fn new(pty: Pty, sink: Box) -> io::Result { + let file = pty.file().try_clone()?; + Ok(Self { + reader: TapReader { + file, + scanner: OscScanner::default(), + sink, + }, + pty, + }) + } + } + + impl EventedReadWrite for OscTapPty { + type Reader = TapReader; + type Writer = File; + + unsafe fn register( + &mut self, + poll: &Arc, + interest: Event, + mode: PollMode, + ) -> io::Result<()> { + unsafe { self.pty.register(poll, interest, mode) } + } + + fn reregister( + &mut self, + poll: &Arc, + interest: Event, + mode: PollMode, + ) -> io::Result<()> { + self.pty.reregister(poll, interest, mode) + } + + fn deregister(&mut self, poll: &Arc) -> io::Result<()> { + self.pty.deregister(poll) + } + + fn reader(&mut self) -> &mut TapReader { + &mut self.reader + } + + fn writer(&mut self) -> &mut File { + self.pty.writer() + } + } + + impl EventedPty for OscTapPty { + fn next_child_event(&mut self) -> Option { + self.pty.next_child_event() + } + } + + impl OnResize for OscTapPty { + fn on_resize(&mut self, window_size: WindowSize) { + self.pty.on_resize(window_size); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn scan(chunks: &[&[u8]]) -> Vec { + let mut scanner = OscScanner::default(); + let mut events = Vec::new(); + for chunk in chunks { + scanner.feed(chunk, &mut |event| events.push(event)); + } + events + } + + fn notify(title: Option<&str>, body: &str) -> OscEvent { + OscEvent::Notify { + title: title.map(str::to_string), + body: body.to_string(), + } + } + + #[test] + fn osc_777_with_bel_and_st() { + assert_eq!( + scan(&[b"x\x1b]777;notify;Claude Code;En attente\x07y"]), + [notify(Some("Claude Code"), "En attente")] + ); + assert_eq!( + scan(&[b"\x1b]777;notify;T;corps; avec point-virgule\x1b\\"]), + [notify(Some("T"), "corps; avec point-virgule")] + ); + } + + #[test] + fn osc_9_text_but_not_conemu() { + assert_eq!( + scan(&[b"\x1b]9;Claude Code: termine\x07"]), + [notify(None, "Claude Code: termine")] + ); + // Commandes ConEmu : progression, avec ou sans argument. + assert!(scan(&[b"\x1b]9;4;1;50\x07\x1b]9;4;0;\x07\x1b]9;12\x07"]).is_empty()); + // Un chiffre suivi d'autre chose qu'un `;` reste du texte. + assert_eq!( + scan(&[b"\x1b]9;3 tests en echec\x07"]), + [notify(None, "3 tests en echec")] + ); + } + + #[test] + fn sequence_split_across_reads() { + assert_eq!( + scan(&[b"\x1b", b"]777;no", b"tify;Ti", b"tre;Co", b"rps\x1b", b"\\"]), + [notify(Some("Titre"), "Corps")] + ); + } + + #[test] + fn other_osc_and_noise_are_ignored() { + assert!(scan(&[b"\x1b]0;titre\x07\x1b]8;;https://x\x1b\\lien\x1b]8;;\x1b\\"]).is_empty()); + assert!(scan(&[b"\x1b]777;notify;;\x07\x1b]9;\x07"]).is_empty()); + // CAN annule la séquence en cours. + assert!(scan(&[b"\x1b]9;annulee\x18\x07"]).is_empty()); + } + + #[test] + fn control_chars_cleaned_and_title_alone_becomes_body() { + assert_eq!( + scan(&[b"\x1b]777;notify;Seul\x07"]), + [notify(None, "Seul")] + ); + assert_eq!( + scan(&[b"\x1b]9;a\tb\x01c\x07"]), + [notify(None, "a b c")] + ); + } + + /// De bout en bout : un vrai processus écrit dans un vrai PTY, lu par la + /// boucle d'alacritty_terminal à travers l'enveloppe. + #[cfg(unix)] + #[test] + fn tap_sees_osc_written_by_child() { + use alacritty_terminal::{ + Term, + event::{Event, EventListener, WindowSize}, + event_loop::EventLoop, + sync::FairMutex, + term::{Config, test::TermSize}, + tty::{self, Options, Shell}, + }; + use std::{sync::Arc, sync::mpsc, time::Duration}; + + #[derive(Clone)] + struct Listener; + impl EventListener for Listener { + fn send_event(&self, _event: Event) {} + } + + let options = Options { + shell: Some(Shell::new( + "printf".into(), + vec!["avant\x1b]777;notify;Titre;Corps\x07apres".into()], + )), + drain_on_exit: true, + ..Default::default() + }; + let window_size = WindowSize { + num_lines: 24, + num_cols: 80, + cell_width: 8, + cell_height: 16, + }; + let pty = tty::new(&options, window_size, 0).unwrap(); + let (tx, rx) = mpsc::channel(); + let pty = OscTapPty::new( + pty, + Box::new(move |event| { + let _ = tx.send(event); + }), + ) + .unwrap(); + let term = Arc::new(FairMutex::new(Term::new( + Config::default(), + &TermSize::new(80, 24), + Listener, + ))); + let event_loop = EventLoop::new(term, Listener, pty, true, false).unwrap(); + let _join = event_loop.spawn(); + + assert_eq!( + rx.recv_timeout(Duration::from_secs(5)).unwrap(), + notify(Some("Titre"), "Corps") + ); + } + + #[test] + fn oversized_sequence_is_dropped() { + let mut long = b"\x1b]9;".to_vec(); + long.extend(std::iter::repeat_n(b'a', OSC_MAX_LEN + 10)); + long.extend(b"\x07\x1b]9;ensuite\x07"); + assert_eq!(scan(&[&long]), [notify(None, "ensuite")]); + } +} diff --git a/src/terminal.rs b/src/terminal.rs index 683ac9a..356e009 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -27,13 +27,15 @@ use indexmap::IndexSet; use std::{ borrow::Cow, collections::HashMap, - fs, io, mem, + fs, + hash::{DefaultHasher, Hash, Hasher}, + io, mem, path::PathBuf, sync::{ Arc, Mutex, Weak, atomic::{AtomicU32, Ordering}, }, - time::Instant, + time::{Duration, Instant}, }; use tokio::sync::mpsc; @@ -43,6 +45,7 @@ use crate::{ config::{ColorSchemeKind, Config as AppConfig, ProfileId}, menu::MenuState, mouse_reporter::MouseReporter, + osc_tap::OscEvent, }; /// Minimum contrast between a fixed cursor color and the cell's background. @@ -65,6 +68,28 @@ pub enum MonitorKind { /// Seconds without output before a silence alert fires (Konsole default). pub const MONITOR_SILENCE_SECONDS: u64 = 10; +/// Appel d'attention d'un onglet en arrière-plan (yoda). +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum AttentionKind { + /// Cloche (BEL). + Bell, + /// Notification de bureau (OSC 9 / 777). + Notification, +} + +/// Anti-rafale des notifications d'un onglet, aux valeurs de Ghostty : au plus +/// une par seconde, et une notification identique au plus toutes les 5 s. +const NOTIFY_MIN_INTERVAL: Duration = Duration::from_secs(1); +const NOTIFY_SAME_INTERVAL: Duration = Duration::from_secs(5); + +/// Événement remonté d'un terminal : celui d'alacritty_terminal, ou une +/// séquence OSC interceptée à la sortie du PTY (voir [`crate::osc_tap`]). +#[derive(Debug)] +pub enum PtyEvent { + Term(Event), + Osc(OscEvent), +} + /// https://github.com/alacritty/alacritty/blob/4a7728bf7fac06a35f27f6c4f31e0d9214e5152b/alacritty/src/config/ui_config.rs#L36-L39 fn url_regex_search() -> RegexSearch { let url_regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)\ @@ -109,13 +134,13 @@ impl From for WindowSize { pub struct EventProxy( pane_grid::Pane, segmented_button::Entity, - mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, + mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, PtyEvent)>, ); impl EventListener for EventProxy { fn send_event(&self, event: Event) { //TODO: handle error - let _ = self.2.send((self.0, self.1, event)); + let _ = self.2.send((self.0, self.1, PtyEvent::Term(event))); } } @@ -196,23 +221,47 @@ impl TerminalPaneGrid { self.focus } - pub fn update_terminal_focus(&self) { - for (pane, tab_model) in self.panes.panes.iter() { - let entity = tab_model.active(); - if let Some(terminal) = tab_model.data::>(entity) { - let mut terminal = terminal.lock().unwrap(); - terminal.set_focused(self.focus == *pane); - terminal.update(); + pub fn update_terminal_focus(&mut self) { + let focus = self.focus; + for (pane, tab_model) in self.panes.panes.iter_mut() { + let active = tab_model.active(); + let entities: Vec = tab_model.iter().collect(); + for entity in entities { + let mut icon_update = None; + if let Some(terminal) = tab_model.data::>(entity) { + let mut terminal = terminal.lock().unwrap(); + if entity == active { + let focused = focus == *pane; + terminal.set_focused(focused); + terminal.update(); + // Regarder l'onglet acquitte son appel d'attention + if focused && terminal.attention.take().is_some() { + icon_update = Some(crate::monitor_icon_name(&terminal)); + } + } else { + // Onglet en arrière-plan : il perd le focus (rapport + // 1004), sinon un agent qui s'y trouve croit encore + // qu'on le regarde. + terminal.set_focused(false); + } + } + if let Some(icon_name) = icon_update { + crate::monitor_update_tab_icon(tab_model, entity, icon_name); + } } } } pub fn unfocus_all_terminals(&self) { for tab_model in self.panes.panes.values() { - let entity = tab_model.active(); - if let Some(terminal) = tab_model.data::>(entity) { - let mut terminal = terminal.lock().unwrap(); - terminal.set_focused(false); - terminal.update(); + let active = tab_model.active(); + for entity in tab_model.iter() { + if let Some(terminal) = tab_model.data::>(entity) { + let mut terminal = terminal.lock().unwrap(); + terminal.set_focused(false); + if entity == active { + terminal.update(); + } + } } } } @@ -331,6 +380,8 @@ pub struct Terminal { pub monitor_alert: Option, pub monitor_last_output: Instant, pub monitor_job_running: bool, + pub attention: Option, + notify_last: Option<(Instant, u64)>, pub needs_update: bool, pub profile_id_opt: Option, pub tab_title_override: Option, @@ -361,7 +412,7 @@ impl Terminal { pub fn new( pane: pane_grid::Pane, entity: segmented_button::Entity, - event_tx: mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, + event_tx: mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, PtyEvent)>, config: Config, options: Options, app_config: &AppConfig, @@ -413,6 +464,8 @@ impl Terminal { cell_width, cell_height, }; + #[cfg(unix)] + let osc_tx = event_tx.clone(); let event_proxy = EventProxy(pane, entity, event_tx); let term = Arc::new(FairMutex::new(Term::new( config, @@ -427,6 +480,15 @@ impl Terminal { #[cfg(windows)] let shell_pid = pty.child_watcher().pid().map(|pid| pid.get()); + // OSC 9 / 777 : interceptés avant vte, qui les ignore + #[cfg(unix)] + let pty = crate::osc_tap::OscTapPty::new( + pty, + Box::new(move |event| { + let _ = osc_tx.send((pane, entity, PtyEvent::Osc(event))); + }), + )?; + let pty_event_loop = EventLoop::new(term.clone(), event_proxy, pty, options.drain_on_exit, false)?; let notifier = Notifier(pty_event_loop.channel()); @@ -450,6 +512,8 @@ impl Terminal { monitor_alert: None, monitor_last_output: Instant::now(), monitor_job_running: false, + attention: None, + notify_last: None, mouse_reporter: Default::default(), needs_update: true, notifier, @@ -513,6 +577,25 @@ impl Terminal { self.zoom_adj = value; } + /// Anti-rafale des notifications de bureau de cet onglet ; `true` si + /// celle-ci peut partir. + pub fn notify_allowed(&mut self, title: Option<&str>, body: &str) -> bool { + let mut hasher = DefaultHasher::new(); + (title, body).hash(&mut hasher); + let hash = hasher.finish(); + let now = Instant::now(); + if let Some((last, last_hash)) = self.notify_last { + let elapsed = now.duration_since(last); + if elapsed < NOTIFY_MIN_INTERVAL + || (hash == last_hash && elapsed < NOTIFY_SAME_INTERVAL) + { + return false; + } + } + self.notify_last = Some((now, hash)); + true + } + fn set_focused(&mut self, is_focused: bool) { let focus_changed = self.is_focused != is_focused; self.is_focused = is_focused; From 52b37cc2f80ddcffee481400f4e27501d8e26e07 Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 1 Oct 2026 13:32:23 +0200 Subject: [PATCH 11/14] yoda: protocole clavier kitty, Shift+Entree pour Claude Code et Modjo Claude Code (>= 2.1.269) n'active Shift+Entree que si le terminal repond a CSI ? u. alacritty_terminal sait tenir la pile des modes et repondre, mais seulement avec kitty_keyboard, et n'encode aucune touche : Shift+ Entree partait en \r, identique a Entree. - term::Config : kitty_keyboard active. - kitty_keyboard : encodeur du frontal (spec kitty, decoupe de l'encodeur d'Alacritty), utilise seulement quand l'application au premier plan a pousse le drapeau 1 ou 8 ; sinon l'encodage legacy reste seul. Gere desambiguisation, types d'evenements (repetition, relachement), touches alternatives, toutes les touches, texte associe, pave numerique, F1-F24, touches de modification. Shift+Entree -> CSI 13;2u. - terminal_box : raccourcis de l'appli toujours prioritaires ; Shift+PageUp/PageDown/Home/End et Echap sur selection gardent leur comportement local ; relachements envoyes si le drapeau 2 est pose. - Legacy : Shift+Entree envoie LF (comme Ctrl+J) au lieu de CR. rustyline le lit comme Ctrl+J, la touche de saut de ligne de Modjo/Goose ; pour un shell c'est toujours Entree. Connu, non corrige ici : alacritty_terminal 0.25.1 push_keyboard_mode vide title_stack au lieu de la pile des modes au-dela de 4096 empilements (panique du fil PTY de l'onglet seulement, panic=unwind). 10 tests, dont la reponse a CSI ? u et l'application de CSI > 5 u. Co-Authored-By: Claude Opus 5.5 --- src/kitty_keyboard.rs | 697 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 5 + src/terminal_box.rs | 108 ++++++- 3 files changed, 808 insertions(+), 2 deletions(-) create mode 100644 src/kitty_keyboard.rs diff --git a/src/kitty_keyboard.rs b/src/kitty_keyboard.rs new file mode 100644 index 0000000..df24628 --- /dev/null +++ b/src/kitty_keyboard.rs @@ -0,0 +1,697 @@ +// SPDX-License-Identifier: GPL-3.0-only + +//! Protocole clavier kitty (yoda). +//! +//! Avec `kitty_keyboard` actif, alacritty_terminal tient la pile des modes +//! (`CSI > n u`, `CSI < n u`, `CSI = n ; m u`) et répond à la requête +//! `CSI ? u`. Il n'encode en revanche aucune touche : c'est le rôle du frontal, +//! donc de ce module. Il ne sert que quand l'application au premier plan a +//! demandé le protocole ; sinon l'encodage legacy de `terminal_box` s'applique +//! seul. +//! +//! C'est ce qui donne Shift+Entrée (`CSI 13;2u`) à Claude Code, qui interroge +//! le terminal avec `CSI ? u` au démarrage. +//! +//! Spécification : . La +//! découpe suit l'encodeur du frontal Alacritty (`alacritty/src/input/keyboard.rs`). +//! +//! Limites : les drapeaux 2 (types d'événements), 4 (touches alternatives) et +//! 16 (texte associé) ne sont honorés qu'avec le drapeau 1 (désambiguïsation) +//! ou 8 (toutes les touches), ce que font toutes les applications connues. +//! La touche de la disposition de base (3e champ du drapeau 4) n'est pas +//! envoyée, et Caps Lock / Num Lock ne figurent pas dans les modificateurs +//! (iced ne les expose pas). + +use alacritty_terminal::term::TermMode; +use cosmic::iced::keyboard::{Key, Location, Modifiers, key::Named}; + +/// Nature de l'événement clavier. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum KeyAction { + Press, + Repeat, + Release, +} + +/// Événement clavier tel que livré par iced. +pub struct KeyInput<'a> { + /// Touche sans aucun modificateur (`key_without_modifiers` de winit). + pub key: &'a Key, + /// Touche avec Shift (et AltGr) appliqués, mais pas Ctrl (`logical_key`). + pub modified_key: &'a Key, + pub location: Location, + pub modifiers: Modifiers, + /// Texte produit, tous modificateurs appliqués. + pub text: Option<&'a str>, + pub action: KeyAction, +} + +const SHIFT: u8 = 1; +const ALT: u8 = 2; +const CTRL: u8 = 4; +const SUPER: u8 = 8; + +/// Le protocole kitty pilote-t-il l'encodage des touches ? +pub fn active(mode: TermMode) -> bool { + mode.intersects(TermMode::DISAMBIGUATE_ESC_CODES | TermMode::REPORT_ALL_KEYS_AS_ESC) +} + +/// Octets à envoyer au PTY quand [`active`] est vrai. Vide : rien à envoyer. +pub fn encode(input: &KeyInput, mode: TermMode) -> Vec { + let all = mode.contains(TermMode::REPORT_ALL_KEYS_AS_ESC); + let mods = modifier_bits(input); + let named = match input.modified_key { + Key::Named(named) => Some(*named), + _ => None, + }; + + if input.action == KeyAction::Release { + if !mode.contains(TermMode::REPORT_EVENT_TYPES) { + return Vec::new(); + } + // Pas de relâchement d'Entrée, Tab et Retour arrière hors « toutes les + // touches » : le shell qui reprend la main après un plantage les + // recevrait. + if !all && matches!(named, Some(Named::Enter | Named::Tab | Named::Backspace)) { + return Vec::new(); + } + return build_sequence(input, mode, mods).unwrap_or_default(); + } + + // Sans modificateur, Entrée, Tab et Retour arrière gardent leurs octets + // legacy (spécification : un `reset` doit rester tapable). L'Entrée du + // pavé numérique, elle, a son code dédié. + if !all && mods == 0 && input.location != Location::Numpad { + match named { + Some(Named::Enter) => return b"\r".to_vec(), + Some(Named::Tab) => return b"\t".to_vec(), + Some(Named::Backspace) => return b"\x7f".to_vec(), + _ => {} + } + } + + let text = printable_text(input); + let as_sequence = all + || text.is_none() + || named == Some(Named::Escape) + || (mods != 0 && mods != SHIFT) + || (mods == SHIFT && matches!(named, Some(Named::Enter | Named::Tab | Named::Backspace))); + + if as_sequence { + build_sequence(input, mode, mods).unwrap_or_default() + } else { + text.unwrap_or_default().as_bytes().to_vec() + } +} + +/// Texte imprimable produit par la touche, s'il y en a un. +fn printable_text<'a>(input: &KeyInput<'a>) -> Option<&'a str> { + input + .text + .filter(|text| !text.is_empty() && !text.chars().any(char::is_control)) +} + +fn modifier_bits(input: &KeyInput) -> u8 { + let mut bits = 0; + if input.modifiers.shift() { + bits |= SHIFT; + } + if input.modifiers.alt() { + bits |= ALT; + } + if input.modifiers.control() { + bits |= CTRL; + } + if input.modifiers.logo() { + bits |= SUPER; + } + // Pour une touche de modification, l'état rapporté est celui qui suit + // l'événement : le bit est posé à l'appui, retiré au relâchement. + let own = match input.modified_key { + Key::Named(Named::Shift) => SHIFT, + Key::Named(Named::Alt) => ALT, + Key::Named(Named::Control) => CTRL, + Key::Named(Named::Super) => SUPER, + _ => 0, + }; + if input.action == KeyAction::Release { + bits & !own + } else { + bits | own + } +} + +/// Terminateur d'une séquence : `u` pour les codes kitty, sinon le final +/// legacy (`A`, `~`…) que le protocole conserve pour les touches de fonction. +#[derive(Clone, Copy)] +enum Final { + Kitty, + Legacy(char), +} + +fn build_sequence(input: &KeyInput, mode: TermMode, mods: u8) -> Option> { + let event_type = mode.contains(TermMode::REPORT_EVENT_TYPES) + && matches!(input.action, KeyAction::Repeat | KeyAction::Release); + let associated_text = printable_text(input).filter(|_| { + mode.contains(TermMode::REPORT_ASSOCIATED_TEXT) && input.action != KeyAction::Release + }); + // Le paramètre par défaut vaut 1 : `CSI A` plutôt que `CSI 1 A`. + let explicit = mods != 0 || event_type || associated_text.is_some(); + + let (payload, terminator) = numpad(input) + .or_else(|| functional(input, explicit)) + .or_else(|| special(input, mode)) + .or_else(|| textual(input, mode, associated_text.is_some()))?; + + let mut sequence = format!("\x1b[{payload}"); + if explicit { + sequence.push_str(&format!(";{}", mods + 1)); + } + if event_type { + let kind = match input.action { + KeyAction::Press => '1', + KeyAction::Repeat => '2', + KeyAction::Release => '3', + }; + sequence.push(':'); + sequence.push(kind); + } + if let Some(text) = associated_text { + let codepoints: Vec = text.chars().map(|c| u32::from(c).to_string()).collect(); + sequence.push(';'); + sequence.push_str(&codepoints.join(":")); + } + sequence.push(match terminator { + Final::Kitty => 'u', + Final::Legacy(c) => c, + }); + Some(sequence.into_bytes()) +} + +/// Pavé numérique : codes kitty dédiés (57399 et suivants). +fn numpad(input: &KeyInput) -> Option<(String, Final)> { + if input.location != Location::Numpad { + return None; + } + let code = match input.modified_key { + Key::Character(c) => match c.as_str() { + "0" => 57399, + "1" => 57400, + "2" => 57401, + "3" => 57402, + "4" => 57403, + "5" => 57404, + "6" => 57405, + "7" => 57406, + "8" => 57407, + "9" => 57408, + "." | "," => 57409, + "/" => 57410, + "*" => 57411, + "-" => 57412, + "+" => 57413, + "=" => 57415, + _ => return None, + }, + Key::Named(named) => match named { + Named::Enter => 57414, + Named::ArrowLeft => 57417, + Named::ArrowRight => 57418, + Named::ArrowUp => 57419, + Named::ArrowDown => 57420, + Named::PageUp => 57421, + Named::PageDown => 57422, + Named::Home => 57423, + Named::End => 57424, + Named::Insert => 57425, + Named::Delete => 57426, + Named::Clear => 57427, + _ => return None, + }, + Key::Unidentified => return None, + }; + Some((code.to_string(), Final::Kitty)) +} + +/// Touches de fonction : finals legacy conservés par le protocole, sauf F3 +/// (`CSI R` serait pris pour un rapport de position du curseur) et F13+. +fn functional(input: &KeyInput, explicit: bool) -> Option<(String, Final)> { + let Key::Named(named) = input.modified_key else { + return None; + }; + let one = if explicit { "1" } else { "" }; + let (payload, terminator) = match named { + Named::ArrowUp => (one, Final::Legacy('A')), + Named::ArrowDown => (one, Final::Legacy('B')), + Named::ArrowRight => (one, Final::Legacy('C')), + Named::ArrowLeft => (one, Final::Legacy('D')), + Named::End => (one, Final::Legacy('F')), + Named::Home => (one, Final::Legacy('H')), + Named::F1 => (one, Final::Legacy('P')), + Named::F2 => (one, Final::Legacy('Q')), + Named::F3 => ("13", Final::Legacy('~')), + Named::F4 => (one, Final::Legacy('S')), + Named::Insert => ("2", Final::Legacy('~')), + Named::Delete => ("3", Final::Legacy('~')), + Named::PageUp => ("5", Final::Legacy('~')), + Named::PageDown => ("6", Final::Legacy('~')), + Named::F5 => ("15", Final::Legacy('~')), + Named::F6 => ("17", Final::Legacy('~')), + Named::F7 => ("18", Final::Legacy('~')), + Named::F8 => ("19", Final::Legacy('~')), + Named::F9 => ("20", Final::Legacy('~')), + Named::F10 => ("21", Final::Legacy('~')), + Named::F11 => ("23", Final::Legacy('~')), + Named::F12 => ("24", Final::Legacy('~')), + _ => { + let code = match named { + Named::F13 => 57376, + Named::F14 => 57377, + Named::F15 => 57378, + Named::F16 => 57379, + Named::F17 => 57380, + Named::F18 => 57381, + Named::F19 => 57382, + Named::F20 => 57383, + Named::F21 => 57384, + Named::F22 => 57385, + Named::F23 => 57386, + Named::F24 => 57387, + Named::CapsLock => 57358, + Named::ScrollLock => 57359, + Named::NumLock => 57360, + Named::PrintScreen => 57361, + Named::Pause => 57362, + Named::ContextMenu => 57363, + Named::MediaPlay => 57428, + Named::MediaPause => 57429, + Named::MediaPlayPause => 57430, + Named::MediaStop => 57432, + Named::MediaFastForward => 57433, + Named::MediaRewind => 57434, + Named::MediaTrackNext => 57435, + Named::MediaTrackPrevious => 57436, + Named::MediaRecord => 57437, + Named::AudioVolumeDown => 57438, + Named::AudioVolumeUp => 57439, + Named::AudioVolumeMute => 57440, + _ => return None, + }; + return Some((code.to_string(), Final::Kitty)); + } + }; + Some((payload.to_string(), terminator)) +} + +/// Touches de contrôle (Entrée, Tab, Échap, Retour arrière, Espace) et, avec +/// « toutes les touches », les touches de modification elles-mêmes. +fn special(input: &KeyInput, mode: TermMode) -> Option<(String, Final)> { + let code = match input.modified_key { + Key::Named(Named::Enter) => 13, + Key::Named(Named::Tab) => 9, + Key::Named(Named::Escape) => 27, + Key::Named(Named::Backspace) => 127, + Key::Character(c) if c == " " => 32, + Key::Named(modifier) if mode.contains(TermMode::REPORT_ALL_KEYS_AS_ESC) => { + let right = input.location == Location::Right; + match (modifier, right) { + (Named::Shift, false) => 57441, + (Named::Control, false) => 57442, + (Named::Alt, false) => 57443, + (Named::Super, false) => 57444, + (Named::Hyper, false) => 57445, + (Named::Meta, false) => 57446, + (Named::Shift, true) => 57447, + (Named::Control, true) => 57448, + (Named::Alt, true) => 57449, + (Named::Super, true) => 57450, + (Named::Hyper, true) => 57451, + (Named::Meta, true) => 57452, + (Named::AltGraph, _) => 57453, + _ => return None, + } + } + _ => return None, + }; + Some((code.to_string(), Final::Kitty)) +} + +/// Touches de caractère : code de la touche non décalée, suivi de la touche +/// décalée si le drapeau 4 le demande (`CSI 97:65;6u` pour Ctrl+Shift+A). +fn textual(input: &KeyInput, mode: TermMode, has_text: bool) -> Option<(String, Final)> { + let Key::Character(shifted) = input.modified_key else { + return None; + }; + let mut chars = shifted.chars(); + let (Some(shifted_char), None) = (chars.next(), chars.next()) else { + // Plusieurs caractères pour une touche : seul « toutes les touches » + // avec texte associé sait le dire, par le code 0. + return (mode.contains(TermMode::REPORT_ALL_KEYS_AS_ESC) && has_text) + .then(|| ("0".to_string(), Final::Kitty)); + }; + + let unshifted_char = if input.modifiers.shift() { + shifted_char.to_lowercase().next().unwrap_or(shifted_char) + } else { + shifted_char + }; + let mut code = u32::from(unshifted_char); + let alternate = u32::from(shifted_char); + // `!` n'a pas de minuscule : la touche de base est celle sans modificateur + // (`1` en QWERTY ; `&` pour le `1` de l'AZERTY). + if code == alternate + && let Key::Character(base) = input.key + && let Some(base_char) = base.chars().next() + { + code = u32::from(base_char); + } + + let payload = if mode.contains(TermMode::REPORT_ALTERNATE_KEYS) && alternate != code { + format!("{code}:{alternate}") + } else { + code.to_string() + }; + Some((payload, Final::Kitty)) +} + +#[cfg(test)] +mod tests { + use super::*; + + const DISAMBIGUATE: TermMode = TermMode::DISAMBIGUATE_ESC_CODES; + + fn ch(c: &str) -> Key { + Key::Character(c.into()) + } + + fn named(n: Named) -> Key { + Key::Named(n) + } + + fn press( + key: Key, + modified: Key, + modifiers: Modifiers, + text: Option<&str>, + mode: TermMode, + ) -> String { + event(key, modified, modifiers, text, KeyAction::Press, mode) + } + + fn event( + key: Key, + modified: Key, + modifiers: Modifiers, + text: Option<&str>, + action: KeyAction, + mode: TermMode, + ) -> String { + let input = KeyInput { + key: &key, + modified_key: &modified, + location: Location::Standard, + modifiers, + text, + action, + }; + String::from_utf8(encode(&input, mode)).unwrap() + } + + #[test] + fn shift_enter_for_claude_code() { + let enter = || named(Named::Enter); + assert_eq!( + press(enter(), enter(), Modifiers::SHIFT, Some("\r"), DISAMBIGUATE), + "\x1b[13;2u" + ); + assert_eq!( + press(enter(), enter(), Modifiers::CTRL, Some("\r"), DISAMBIGUATE), + "\x1b[13;5u" + ); + // Entrée seule reste `\r` + assert_eq!( + press(enter(), enter(), Modifiers::empty(), Some("\r"), DISAMBIGUATE), + "\r" + ); + } + + #[test] + fn escape_tab_backspace() { + let esc = || named(Named::Escape); + assert_eq!( + press(esc(), esc(), Modifiers::empty(), Some("\x1b"), DISAMBIGUATE), + "\x1b[27u" + ); + let tab = || named(Named::Tab); + assert_eq!( + press(tab(), tab(), Modifiers::empty(), Some("\t"), DISAMBIGUATE), + "\t" + ); + assert_eq!( + press(tab(), tab(), Modifiers::SHIFT, Some("\t"), DISAMBIGUATE), + "\x1b[9;2u" + ); + let bs = || named(Named::Backspace); + assert_eq!( + press(bs(), bs(), Modifiers::empty(), Some("\x08"), DISAMBIGUATE), + "\x7f" + ); + assert_eq!( + press(bs(), bs(), Modifiers::CTRL, Some("\x08"), DISAMBIGUATE), + "\x1b[127;5u" + ); + } + + #[test] + fn text_keys() { + // Texte simple ou décalé : envoyé tel quel + assert_eq!( + press(ch("a"), ch("a"), Modifiers::empty(), Some("a"), DISAMBIGUATE), + "a" + ); + assert_eq!( + press(ch("a"), ch("A"), Modifiers::SHIFT, Some("A"), DISAMBIGUATE), + "A" + ); + assert_eq!( + press(ch("é"), ch("é"), Modifiers::empty(), Some("é"), DISAMBIGUATE), + "é" + ); + // Ctrl et Alt : séquences + assert_eq!( + press(ch("c"), ch("c"), Modifiers::CTRL, Some("\x03"), DISAMBIGUATE), + "\x1b[99;5u" + ); + assert_eq!( + press(ch("a"), ch("a"), Modifiers::ALT, Some("a"), DISAMBIGUATE), + "\x1b[97;3u" + ); + assert_eq!( + press(ch(" "), ch(" "), Modifiers::CTRL, Some("\0"), DISAMBIGUATE), + "\x1b[32;5u" + ); + } + + #[test] + fn alternate_keys() { + let mode = DISAMBIGUATE | TermMode::REPORT_ALTERNATE_KEYS; + assert_eq!( + press( + ch("a"), + ch("A"), + Modifiers::CTRL | Modifiers::SHIFT, + Some("\x01"), + mode + ), + "\x1b[97:65;6u" + ); + // AZERTY : Ctrl+Shift+& donne « 1 » + assert_eq!( + press( + ch("&"), + ch("1"), + Modifiers::CTRL | Modifiers::SHIFT, + None, + mode + ), + "\x1b[38:49;6u" + ); + // Sans le drapeau 4, pas d'alternative + assert_eq!( + press( + ch("a"), + ch("A"), + Modifiers::CTRL | Modifiers::SHIFT, + Some("\x01"), + DISAMBIGUATE + ), + "\x1b[97;6u" + ); + } + + #[test] + fn functional_keys() { + let up = || named(Named::ArrowUp); + assert_eq!( + press(up(), up(), Modifiers::empty(), None, DISAMBIGUATE), + "\x1b[A" + ); + assert_eq!( + press(up(), up(), Modifiers::CTRL, None, DISAMBIGUATE), + "\x1b[1;5A" + ); + let f3 = || named(Named::F3); + assert_eq!( + press(f3(), f3(), Modifiers::empty(), None, DISAMBIGUATE), + "\x1b[13~" + ); + let del = || named(Named::Delete); + assert_eq!( + press(del(), del(), Modifiers::SHIFT, None, DISAMBIGUATE), + "\x1b[3;2~" + ); + } + + #[test] + fn event_types() { + let mode = DISAMBIGUATE | TermMode::REPORT_EVENT_TYPES; + assert_eq!( + event( + ch("a"), + ch("a"), + Modifiers::empty(), + None, + KeyAction::Release, + mode + ), + "\x1b[97;1:3u" + ); + assert_eq!( + event( + ch("a"), + ch("a"), + Modifiers::CTRL, + Some("\x01"), + KeyAction::Repeat, + mode + ), + "\x1b[97;5:2u" + ); + // Pas de relâchement d'Entrée hors « toutes les touches » + let enter = || named(Named::Enter); + assert_eq!( + event( + enter(), + enter(), + Modifiers::empty(), + None, + KeyAction::Release, + mode + ), + "" + ); + // Ni de relâchement du tout sans le drapeau 2 + assert_eq!( + event( + ch("a"), + ch("a"), + Modifiers::empty(), + None, + KeyAction::Release, + DISAMBIGUATE + ), + "" + ); + } + + #[test] + fn report_all_keys() { + let mode = TermMode::REPORT_ALL_KEYS_AS_ESC | TermMode::REPORT_ASSOCIATED_TEXT; + assert_eq!( + press(ch("a"), ch("a"), Modifiers::empty(), Some("a"), mode), + "\x1b[97;1;97u" + ); + let enter = || named(Named::Enter); + assert_eq!( + press(enter(), enter(), Modifiers::empty(), Some("\r"), mode), + "\x1b[13u" + ); + // Touche de modification : son propre bit est posé à l'appui + let shift = || named(Named::Shift); + assert_eq!( + press(shift(), shift(), Modifiers::empty(), None, mode), + "\x1b[57441;2u" + ); + } + + #[test] + fn numpad_keys() { + let input = |key: &Key, text| { + String::from_utf8(encode( + &KeyInput { + key, + modified_key: key, + location: Location::Numpad, + modifiers: Modifiers::empty(), + text, + action: KeyAction::Press, + }, + DISAMBIGUATE, + )) + .unwrap() + }; + // Un chiffre du pavé produit du texte : envoyé tel quel + assert_eq!(input(&ch("5"), Some("5")), "5"); + // Entrée du pavé n'en produit pas d'imprimable : code dédié + assert_eq!(input(&named(Named::Enter), Some("\r")), "\x1b[57414u"); + } + + #[test] + fn only_with_disambiguate_or_all() { + assert!(!active(TermMode::empty())); + assert!(!active(TermMode::REPORT_EVENT_TYPES)); + assert!(active(DISAMBIGUATE)); + assert!(active(TermMode::REPORT_ALL_KEYS_AS_ESC)); + } + + /// Le terminal répond à `CSI ? u` et applique `CSI > 5 u` dès que + /// `kitty_keyboard` est actif : c'est ce que Claude Code interroge. + #[test] + fn term_reports_and_applies_kitty_modes() { + use alacritty_terminal::{ + Term, + event::{Event, EventListener}, + term::{Config, test::TermSize}, + vte::ansi::Processor, + }; + use std::sync::{Arc, Mutex}; + + #[derive(Clone, Default)] + struct Replies(Arc>>); + impl EventListener for Replies { + fn send_event(&self, event: Event) { + if let Event::PtyWrite(text) = event { + self.0.lock().unwrap().push(text); + } + } + } + + let replies = Replies::default(); + let config = Config { + kitty_keyboard: true, + ..Config::default() + }; + let mut term = Term::new(config, &TermSize::new(80, 24), replies.clone()); + let mut parser: Processor = Processor::new(); + parser.advance(&mut term, b"\x1b[?u\x1b[>5u\x1b[?u"); + + assert_eq!(*replies.0.lock().unwrap(), ["\x1b[?0u", "\x1b[?5u"]); + let mode = *term.mode(); + assert!(mode.contains(TermMode::DISAMBIGUATE_ESC_CODES)); + assert!(mode.contains(TermMode::REPORT_ALTERNATE_KEYS)); + assert!(active(mode)); + + parser.advance(&mut term, b"\x1b[ Result<(), Box> { // Terminal config setup let term_config = term::Config { scrolling_history: 100_000, + // [yoda] Protocole clavier kitty : alacritty_terminal tient la pile des + // modes et répond à `CSI ? u`, l'encodage est dans `kitty_keyboard`. + kitty_keyboard: true, ..term::Config::default() }; // Set up environmental variables for terminal diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 1df9ae3..be73890 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -47,7 +47,7 @@ use std::{ }; use crate::{ - Action, Terminal, TerminalScroll, + Action, Terminal, TerminalScroll, kitty_keyboard, menu::MenuState, terminal::{BlockFill, Metadata}, }; @@ -940,6 +940,7 @@ where let is_app_cursor = terminal.term.lock().mode().contains(TermMode::APP_CURSOR); let is_mouse_mode = terminal.term.lock().mode().intersects(TermMode::MOUSE_MODE); + let term_mode = *terminal.term.lock().mode(); match event { Event::Window(event) => match event { cosmic::iced::window::Event::Focused => { @@ -979,6 +980,101 @@ where } _ => {} }, + // [yoda] Protocole clavier kitty, quand l'application au premier plan + // l'a demandé (voir `kitty_keyboard`) ; sinon encodage legacy plus bas. + Event::Keyboard(KeyEvent::KeyPressed { + key, + modified_key, + physical_key, + location, + modifiers, + text, + repeat, + }) if state.is_focused && kitty_keyboard::active(term_mode) => { + for key_bind in self.key_binds.keys() { + if key_bind.matches(*modifiers, key, Some(physical_key)) { + shell.capture_event(); + return; + } + } + + // Comportements locaux conservés, comme en legacy : Shift+PageUp… + // fait défiler l'historique, Échap annule une sélection. + let local_scroll = match modified_key { + Key::Named(Named::PageUp) if modifiers.shift() => Some(TerminalScroll::PageUp), + Key::Named(Named::PageDown) if modifiers.shift() => { + Some(TerminalScroll::PageDown) + } + Key::Named(Named::Home) if modifiers.shift() => Some(TerminalScroll::Top), + Key::Named(Named::End) if modifiers.shift() => Some(TerminalScroll::Bottom), + _ => None, + }; + if let Some(scroll) = local_scroll { + terminal.scroll(scroll); + shell.capture_event(); + return; + } + if *modified_key == Key::Named(Named::Escape) { + let had_selection = terminal.term.lock().selection.take().is_some(); + if had_selection { + terminal.update(); + shell.capture_event(); + return; + } + } + + let input = kitty_keyboard::KeyInput { + key, + modified_key, + location: *location, + modifiers: *modifiers, + text: text.as_deref(), + action: if *repeat { + kitty_keyboard::KeyAction::Repeat + } else { + kitty_keyboard::KeyAction::Press + }, + }; + let bytes = kitty_keyboard::encode(&input, term_mode); + if !bytes.is_empty() { + // Une touche de modification seule (« toutes les touches ») + // ne ramène pas la vue en bas. + let modifier_only = matches!( + modified_key, + Key::Named(Named::Shift | Named::Control | Named::Alt | Named::Super) + ); + if modifier_only { + terminal.input_no_scroll(bytes); + } else { + terminal.input_scroll(bytes); + } + shell.capture_event(); + } + } + Event::Keyboard(KeyEvent::KeyReleased { + key, + modified_key, + location, + modifiers, + .. + }) if state.is_focused + && kitty_keyboard::active(term_mode) + && term_mode.contains(TermMode::REPORT_EVENT_TYPES) => + { + let input = kitty_keyboard::KeyInput { + key, + modified_key, + location: *location, + modifiers: *modifiers, + text: None, + action: kitty_keyboard::KeyAction::Release, + }; + let bytes = kitty_keyboard::encode(&input, term_mode); + if !bytes.is_empty() { + terminal.input_no_scroll(bytes); + shell.capture_event(); + } + } Event::Keyboard(KeyEvent::KeyPressed { key: Key::Named(named), physical_key, @@ -1094,7 +1190,15 @@ where shell.capture_event(); } Named::Enter => { - terminal.input_scroll(format!("{}{}", alt_prefix, "\x0D").into_bytes()); + // [yoda] Shift+Entrée envoie LF (`\n`, comme Ctrl+J) : saut de + // ligne dans les éditeurs qui ne parlent pas le protocole kitty + // (rustyline de Modjo/Goose) ; pour un shell, c'est Entrée. + let code = if modifiers.shift() && !modifiers.control() { + "\x0A" + } else { + "\x0D" + }; + terminal.input_scroll(format!("{alt_prefix}{code}").into_bytes()); shell.capture_event(); } Named::Escape => { From db9ee02d8d0da6fe9f47fc34bf0be7587c391189 Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 1 Oct 2026 13:40:47 +0200 Subject: [PATCH 12/14] yoda: attenuation des panneaux non focalises, a la Ghostty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avec Claude Code et Modjo cote a cote, rien ne distinguait le panneau ou l'on tape, hors le curseur creux. L'amont assombrissait le fond de 8 % (aussi quand la fenetre perdait le focus) et l'a retire en juillet (a43b5ae). Reprise de unfocused-split-opacity de Ghostty : un voile de la couleur du fond, texte compris, sur chaque panneau non focalise, seulement quand il y en a plusieurs ; la perte de focus de la fenetre ne change rien. - Config unfocused_pane_dim (pourcentage, defaut 30 = opacite 0,7 de Ghostty, 0 desactive, plafond 85 = opacite minimale 0,15 de Ghostty). - Reglages > Panneaux : curseur « Attenuation des panneaux inactifs ». - terminal_box : voile trace dans un calque a part en fin de rendu (dans le meme calque, la primitive de texte passerait par-dessus), aux coins du fond du panneau. Co-Authored-By: Claude Opus 5.5 --- i18n/en/cosmic_term.ftl | 1 + i18n/fr/cosmic_term.ftl | 1 + src/config.rs | 37 +++++++++++++++++++++++++++++++++++++ src/main.rs | 25 +++++++++++++++++++++++++ src/terminal_box.rs | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index d4a8c90..bdc68c5 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -59,6 +59,7 @@ use-bright-bold = Make bold text brighter splits = Splits focus-follow-mouse = Typing focus follows mouse show-pane-borders = Show pane borders +unfocused-pane-dim = Dim unfocused panes ### Advanced advanced = Advanced diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index 350158b..f699685 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -172,3 +172,4 @@ keywords = Commande;Shell;Terminal;CLI; tab-new-inherit-working-directory = Les nouveaux onglets et fenêtres utilisent le répertoire actuel tab-new-inherit-working-directory-description = Ouvrir les nouveaux onglets et fenêtres dans le répertoire de travail de l'onglet actif show-pane-borders = Afficher les bordures des panneaux +unfocused-pane-dim = Atténuation des panneaux inactifs diff --git a/src/config.rs b/src/config.rs index caedf4d..5b434bc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -232,6 +232,10 @@ pub struct Config { pub profiles: BTreeMap, pub show_headerbar: bool, pub show_pane_borders: bool, + /// [yoda] Voile posé sur les panneaux non focalisés, en pourcentage + /// (`unfocused-split-opacity` de Ghostty : 0,7 d'opacité = 30 % de voile). + #[serde(default = "default_unfocused_pane_dim")] + pub unfocused_pane_dim: u8, pub use_bright_bold: bool, pub syntax_theme_dark: String, pub syntax_theme_light: String, @@ -243,6 +247,13 @@ pub struct Config { pub shortcuts_custom: Shortcuts, } +/// Voile maximal des panneaux non focalisés : Ghostty borne leur opacité à 0,15. +pub const UNFOCUSED_PANE_DIM_MAX: u8 = 85; + +fn default_unfocused_pane_dim() -> u8 { + 30 +} + impl Default for Config { fn default() -> Self { Self { @@ -262,6 +273,7 @@ impl Default for Config { profiles: BTreeMap::new(), show_headerbar: true, show_pane_borders: false, + unfocused_pane_dim: default_unfocused_pane_dim(), syntax_theme_dark: COSMIC_THEME_DARK.to_string(), syntax_theme_light: COSMIC_THEME_LIGHT.to_string(), use_bright_bold: false, @@ -343,6 +355,12 @@ impl Config { Metrics::new(font_size, line_height) } + /// Opacité du voile des panneaux non focalisés ; `None` si désactivé. + pub fn unfocused_pane_dim_ratio(&self) -> Option { + let dim = self.unfocused_pane_dim.min(UNFOCUSED_PANE_DIM_MAX); + (dim > 0).then(|| f32::from(dim) / 100.0) + } + pub fn opacity_ratio(&self) -> f32 { f32::from(self.opacity) / 100.0 } @@ -404,3 +422,22 @@ impl Config { })[&self.font_stretch] } } + +#[cfg(test)] +mod tests { + use super::{Config, UNFOCUSED_PANE_DIM_MAX}; + + #[test] + fn unfocused_pane_dim_ratio() { + let mut config = Config::default(); + // Défaut de Ghostty : opacité 0,7, soit 30 % de voile + assert_eq!(config.unfocused_pane_dim_ratio(), Some(0.3)); + config.unfocused_pane_dim = 0; + assert_eq!(config.unfocused_pane_dim_ratio(), None); + config.unfocused_pane_dim = 100; + assert_eq!( + config.unfocused_pane_dim_ratio(), + Some(f32::from(UNFOCUSED_PANE_DIM_MAX) / 100.0) + ); + } +} diff --git a/src/main.rs b/src/main.rs index be8fce8..e749142 100644 --- a/src/main.rs +++ b/src/main.rs @@ -591,6 +591,7 @@ pub enum Message { ShowHeaderBar(bool), SshConnect(usize), ShowPaneBorders(bool), + UnfocusedPaneDim(u8), SyntaxTheme(ColorSchemeKind, usize), SystemThemeChange, @@ -1729,6 +1730,15 @@ impl App { .add( widget::settings::item::builder(fl!("show-pane-borders")) .toggler(self.config.show_pane_borders, Message::ShowPaneBorders), + ) + .add( + widget::settings::item::builder(fl!("unfocused-pane-dim")) + .description(format!("{}%", self.config.unfocused_pane_dim)) + .control(widget::slider( + 0..=config::UNFOCUSED_PANE_DIM_MAX, + self.config.unfocused_pane_dim, + Message::UnfocusedPaneDim, + )), ); let advanced_section = widget::settings::section() @@ -3371,6 +3381,12 @@ impl Application for App { config_set!(show_pane_borders, show_pane_borders); } } + Message::UnfocusedPaneDim(dim) => { + config_set!( + unfocused_pane_dim, + cmp::min(config::UNFOCUSED_PANE_DIM_MAX, dim) + ); + } Message::UseBrightBold(use_bright_bold) => { if use_bright_bold != self.config.use_bright_bold { config_set!(use_bright_bold, use_bright_bold); @@ -4247,6 +4263,15 @@ impl Application for App { terminal_box = terminal_box.on_mouse_enter(move || Message::MouseEnter(pane)); } + // [yoda] Voile sur les panneaux non focalisés (à la Ghostty), seulement + // quand il y en a plusieurs : on voit d'un coup d'œil où l'on tape. + if let Some(dim) = self.config.unfocused_pane_dim_ratio() + && self.pane_model.panes.panes.len() > 1 + && pane != self.pane_model.focused() + { + terminal_box = terminal_box.dim(dim); + } + // The terminal records what was under the right press; the widget opens the // menu on release, so build it from that state let context_link = terminal diff --git a/src/terminal_box.rs b/src/terminal_box.rs index be73890..9b41a22 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -120,6 +120,7 @@ pub struct TerminalBox<'a, Message> { on_context_menu: Option) -> Message + 'a>>, on_mouse_enter: Option Message + 'a>>, opacity: Option, + dim: Option, mouse_inside_boundary: Option, on_middle_click: Option Message + 'a>>, on_open_hyperlink: Option Message + 'a>>, @@ -147,6 +148,7 @@ where on_context_menu: None, on_mouse_enter: None, opacity: None, + dim: None, mouse_inside_boundary: None, on_middle_click: None, key_binds, @@ -216,6 +218,13 @@ where self } + /// [yoda] Voile de la couleur du fond posé sur tout le panneau (texte + /// compris), d'opacité `amount` : panneau non focalisé. + pub fn dim(mut self, amount: f32) -> Self { + self.dim = Some(amount); + self + } + pub fn sharp_corners(mut self, sharp_corners: bool) -> Self { self.sharp_corners = sharp_corners; self @@ -915,6 +924,32 @@ where } } + // [yoda] Panneau non focalisé : voile de la couleur du fond, comme + // `unfocused-split-opacity` de Ghostty. Calque à part, sinon le texte + // (primitive du même calque) serait tracé par-dessus. + if let Some(dim) = self.dim { + let bg = terminal.metadata_set[terminal.default_attrs().metadata].bg; + renderer.with_layer(layout.bounds(), |renderer| { + renderer.fill_quad( + Quad { + bounds: layout.bounds(), + border: Border { + radius: border_radius, + ..Default::default() + }, + snap: true, + ..Default::default() + }, + Color::from_rgba( + f32::from(bg.r()) / 255.0, + f32::from(bg.g()) / 255.0, + f32::from(bg.b()) / 255.0, + dim, + ), + ); + }); + } + let duration = instant.elapsed(); log::trace!("redraw {}, {}: {:?}", view_w, view_h, duration); } From a035b47e98447c056bf6a0361c2d909dd8b30fcb Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 1 Oct 2026 14:19:02 +0200 Subject: [PATCH 13/14] yoda: lecture seule par onglet, a la Ghostty (toggle_readonly) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surveiller une session Claude Code ou Modjo sans risquer de lui taper dedans, ni de lui coller quoi que ce soit. - Terminal::read_only : input_no_scroll, input_scroll (donc paste) et la molette en mode souris n'ecrivent plus rien, et une frappe ne ramene plus la vue en bas. Couvre touches legacy et kitty, collage, clic milieu, Ctrl+C, gestionnaire de mots de passe, IME, glisser-deposer. - Terminal::respond : ecriture non bloquee pour ce que le terminal repond lui-meme (PtyWrite, couleurs, taille, rapports de focus), sinon une application attendrait une reponse qui ne vient pas (CSI ? u de Claude Code, DA, DSR...). - terminal_box : en lecture seule la souris revient au terminal (selection, copie et defilement locaux, meme dans une application qui la capture). - Case « Lecture seule » dans Affichage et dans le menu contextuel ; action ToggleReadOnly dans les raccourcis (groupe Autre, sans raccourci par defaut, comme Ghostty et Konsole) ; cadenas changes-prevent-symbolic sur l'onglet, apres les alertes. Test de bout en bout dans un vrai PTY (cat) : saisie et collage bloques, reponse transmise, saisie retablie ; il echoue si le verrou est retire. Co-Authored-By: Claude Opus 5.5 --- i18n/en/cosmic_term.ftl | 1 + i18n/fr/cosmic_term.ftl | 1 + src/main.rs | 42 +++++++++++++++++++-- src/menu.rs | 9 +++++ src/shortcuts.rs | 9 ++++- src/terminal.rs | 83 +++++++++++++++++++++++++++++++++++++++-- src/terminal_box.rs | 5 ++- 7 files changed, 142 insertions(+), 8 deletions(-) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index bdc68c5..b32e7ad 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -140,6 +140,7 @@ save-output = Save output as text... monitor-activity = Monitor for activity monitor-silence = Monitor for silence monitor-process-finished = Monitor for process finishing +read-only = Read-only ## Notifications notification-show = Show tab diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index f699685..bb3a00a 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -108,6 +108,7 @@ save-output = Enregistrer la sortie comme texte... monitor-activity = Surveiller l'activité monitor-silence = Surveiller le silence monitor-process-finished = Surveiller la fin du processus +read-only = Lecture seule ## Notifications notification-show = Afficher l'onglet diff --git a/src/main.rs b/src/main.rs index e749142..f5c6eb2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -115,6 +115,7 @@ fn monitor_icon_name(terminal: &Terminal) -> Option<&'static str> { Some(MonitorKind::Activity) => Some("dialog-information-symbolic"), Some(MonitorKind::Silence) => Some("alarm-symbolic"), Some(MonitorKind::ProcessFinished) => Some("emblem-ok-symbolic"), + None if terminal.read_only => Some("changes-prevent-symbolic"), None if terminal.monitoring_enabled() => Some("view-reveal-symbolic"), None => None, } @@ -390,6 +391,7 @@ pub enum Action { LayoutLoad, LayoutSave, Monitor(MonitorKind), + ToggleReadOnly, PaneFocusDown, PaneFocusLeft, PaneFocusRight, @@ -449,6 +451,7 @@ impl Action { Self::LayoutLoad => Message::LayoutLoad, Self::LayoutSave => Message::LayoutSave, Self::Monitor(monitor_kind) => Message::MonitorToggle(*monitor_kind, entity_opt), + Self::ToggleReadOnly => Message::ReadOnlyToggle(entity_opt), Self::PaneFocusDown => Message::PaneFocusAdjacent(pane_grid::Direction::Down), Self::PaneFocusLeft => Message::PaneFocusAdjacent(pane_grid::Direction::Left), Self::PaneFocusRight => Message::PaneFocusAdjacent(pane_grid::Direction::Right), @@ -556,6 +559,7 @@ pub enum Message { ShortcutSearch(String), MonitorTick, MonitorToggle(MonitorKind, Option), + ReadOnlyToggle(Option), MouseEnter(pane_grid::Pane), Opacity(u8), PaneClicked(pane_grid::Pane), @@ -1809,6 +1813,22 @@ impl App { } } + fn terminal_read_only(&self, pane: pane_grid::Pane, entity: segmented_button::Entity) -> bool { + self.pane_model + .panes + .get(pane) + .and_then(|tab_model| tab_model.data::>(entity)) + .is_some_and(|terminal| terminal.lock().unwrap().read_only) + } + + fn active_terminal_read_only(&self) -> bool { + let pane = self.pane_model.focused(); + self.pane_model + .panes + .get(pane) + .is_some_and(|tab_model| self.terminal_read_only(pane, tab_model.active())) + } + fn active_terminal_monitors(&self) -> (bool, bool, bool) { let pane = self.pane_model.focused(); if let Some(tab_model) = self.pane_model.panes.get(pane) { @@ -3034,6 +3054,20 @@ impl Application for App { } } } + Message::ReadOnlyToggle(entity_opt) => { + if let Some(tab_model) = self.pane_model.active_mut() { + let entity = entity_opt.unwrap_or_else(|| tab_model.active()); + let mut icon_update = None; + if let Some(terminal) = tab_model.data::>(entity) { + let mut terminal = terminal.lock().unwrap(); + terminal.read_only = !terminal.read_only; + icon_update = Some(monitor_icon_name(&terminal)); + } + if let Some(icon_name) = icon_update { + monitor_update_tab_icon(tab_model, entity, icon_name); + } + } + } Message::MonitorToggle(monitor_kind, entity_opt) => { if let Some(tab_model) = self.pane_model.active_mut() { let entity = entity_opt.unwrap_or_else(|| tab_model.active()); @@ -3718,7 +3752,7 @@ impl Application for App { let terminal = terminal.lock().unwrap(); let rgb = terminal.effective_color(index); let text = f(rgb); - terminal.input_no_scroll(text.into_bytes()); + terminal.respond(text.into_bytes()); } } TermEvent::CursorBlinkingChange => { @@ -3732,7 +3766,7 @@ impl Application for App { && let Some(terminal) = tab_model.data::>(entity) { let terminal = terminal.lock().unwrap(); - terminal.input_no_scroll(text.into_bytes()); + terminal.respond(text.into_bytes()); } } TermEvent::ResetTitle => { @@ -3757,7 +3791,7 @@ impl Application for App { { let terminal = terminal.lock().unwrap(); let text = f(terminal.size().into()); - terminal.input_no_scroll(text.into_bytes()); + terminal.respond(text.into_bytes()); } } TermEvent::Title(title) => { @@ -4160,6 +4194,7 @@ impl Application for App { &self.config, &self.key_binds, self.active_terminal_monitors(), + self.active_terminal_read_only(), &self.ssh_hosts, )] } @@ -4292,6 +4327,7 @@ impl Application for App { entity, link, self.terminal_monitors(pane, entity), + self.terminal_read_only(pane, entity), ) }), ) diff --git a/src/menu.rs b/src/menu.rs index 4ffb397..7fc4fed 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -45,6 +45,7 @@ pub fn context_menu( entity: segmented_button::Entity, link: Option, monitors: (bool, bool, bool), + read_only: bool, ) -> Vec> { let item = |label: String, action: Action| MenuItem::Button(label, None, TabAction(entity, action)); @@ -78,6 +79,7 @@ pub fn context_menu( monitors.2, Action::Monitor(MonitorKind::ProcessFinished), ), + check(fl!("read-only"), read_only, Action::ToggleReadOnly), MenuItem::Divider, item(fl!("split-horizontal"), Action::PaneSplitHorizontal), item(fl!("split-vertical"), Action::PaneSplitVertical), @@ -163,6 +165,7 @@ pub fn menu_bar<'a>( config: &Config, key_binds: &HashMap, monitors: (bool, bool, bool), + read_only: bool, ssh_hosts: &[String], ) -> Element<'a, Message> { let mut profile_items = Vec::with_capacity(config.profiles.len()); @@ -264,6 +267,12 @@ pub fn menu_bar<'a>( monitors.2, Action::Monitor(MonitorKind::ProcessFinished), ), + MenuItem::CheckBox( + fl!("read-only"), + None, + read_only, + Action::ToggleReadOnly, + ), MenuItem::Divider, MenuItem::Button( fl!("menu-color-schemes"), diff --git a/src/shortcuts.rs b/src/shortcuts.rs index a04a103..768f15e 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -90,6 +90,7 @@ pub enum KeyBindAction { TabPrev, TabRename, ToggleFullscreen, + ToggleReadOnly, WindowClose, WindowNew, ZoomIn, @@ -132,6 +133,7 @@ impl KeyBindAction { Self::TabPrev => Some(Action::TabPrev), Self::TabRename => Some(Action::TabRename), Self::ToggleFullscreen => Some(Action::ToggleFullscreen), + Self::ToggleReadOnly => Some(Action::ToggleReadOnly), Self::WindowClose => Some(Action::WindowClose), Self::WindowNew => Some(Action::WindowNew), Self::ZoomIn => Some(Action::ZoomIn), @@ -295,6 +297,7 @@ pub fn action_label(action: KeyBindAction) -> String { KeyBindAction::TabPrev => fl!("previous-tab"), KeyBindAction::TabRename => fl!("rename-tab"), KeyBindAction::ToggleFullscreen => fl!("toggle-fullscreen"), + KeyBindAction::ToggleReadOnly => fl!("read-only"), KeyBindAction::WindowClose => fl!("close-window"), KeyBindAction::WindowNew => fl!("new-window"), KeyBindAction::ZoomIn => fl!("zoom-in"), @@ -369,7 +372,11 @@ pub fn shortcut_groups() -> Vec { KeyBindAction::ZoomReset, ], }); - let mut other_actions = vec![KeyBindAction::ClearScrollback, KeyBindAction::SaveOutput]; + let mut other_actions = vec![ + KeyBindAction::ClearScrollback, + KeyBindAction::SaveOutput, + KeyBindAction::ToggleReadOnly, + ]; #[cfg(feature = "password_manager")] other_actions.push(KeyBindAction::PasswordManager); groups.push(ShortcutGroup { diff --git a/src/terminal.rs b/src/terminal.rs index 356e009..213e5fd 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -382,6 +382,9 @@ pub struct Terminal { pub monitor_job_running: bool, pub attention: Option, notify_last: Option<(Instant, u64)>, + /// [yoda] Lecture seule : aucune saisie de l'utilisateur n'atteint le PTY + /// (touches, collage, souris) ; les réponses du terminal passent toujours. + pub read_only: bool, pub needs_update: bool, pub profile_id_opt: Option, pub tab_title_override: Option, @@ -514,6 +517,7 @@ impl Terminal { monitor_job_running: false, attention: None, notify_last: None, + read_only: false, mouse_reporter: Default::default(), needs_update: true, notifier, @@ -607,7 +611,7 @@ impl Terminal { const FOCUS_OUT: &[u8] = b"\x1b[O"; let input = if is_focused { FOCUS_IN } else { FOCUS_OUT }; - self.input_no_scroll(input); + self.respond(input); } } } @@ -620,7 +624,18 @@ impl Terminal { self.with_buffer_mut(|buffer| buffer.set_redraw(redraw)); } + /// Saisie de l'utilisateur vers le PTY ; ignorée en lecture seule. pub fn input_no_scroll>>(&self, input: I) { + if self.read_only { + return; + } + self.notifier.notify(input); + } + + /// [yoda] Réponse du terminal lui-même (rapports demandés par + /// l'application, focus) : jamais bloquée par la lecture seule, sinon + /// l'application attendrait une réponse qui ne vient pas. + pub fn respond>>(&self, input: I) { self.notifier.notify(input); } @@ -638,6 +653,10 @@ impl Terminal { } pub fn input_scroll>>(&self, input: I) { + // En lecture seule, une frappe ne ramène pas non plus la vue en bas + if self.read_only { + return; + } self.input_no_scroll(input); self.scroll(TerminalScroll::Bottom); } @@ -1299,8 +1318,11 @@ impl Terminal { y, ); - for code in codes { - self.notifier.notify(code); + // Saisie de l'utilisateur : rien en lecture seule + if !self.read_only { + for code in codes { + self.notifier.notify(code); + } } } else { self.scroll_as_arrows(delta); @@ -1513,6 +1535,61 @@ impl Drop for Terminal { mod tests { use super::*; + /// Lecture seule, de bout en bout : un vrai `cat` dans un vrai PTY. La + /// saisie bloquée n'arrive pas ; une réponse du terminal, si ; la saisie + /// repasse quand le verrou est levé. + #[cfg(unix)] + #[test] + fn read_only_blocks_input_but_not_replies() { + use std::time::Duration; + + let (_panes, pane) = pane_grid::State::new(()); + let mut model = segmented_button::Model::::default(); + let entity = model.insert().id(); + let (event_tx, _event_rx) = mpsc::unbounded_channel(); + let options = Options { + shell: Some(tty::Shell::new("cat".into(), Vec::new())), + ..Options::default() + }; + let mut terminal = Terminal::new( + pane, + entity, + event_tx, + Config::default(), + options, + &AppConfig::default(), + crate::terminal_theme::cosmic_dark(), + None, + None, + ) + .unwrap(); + + let wait_for = |terminal: &Terminal, needle: &str| { + let deadline = Instant::now() + Duration::from_secs(5); + while Instant::now() < deadline { + if terminal.scrollback_text().contains(needle) { + return true; + } + std::thread::sleep(Duration::from_millis(20)); + } + false + }; + + terminal.read_only = true; + terminal.input_scroll(&b"bloque\n"[..]); + terminal.paste("colle\n".to_string()); + terminal.respond(&b"repond\n"[..]); + assert!(wait_for(&terminal, "repond")); + // Écrites avant la réponse, la saisie et le collage seraient déjà là + let text = terminal.scrollback_text(); + assert!(!text.contains("bloque"), "{text}"); + assert!(!text.contains("colle"), "{text}"); + + terminal.read_only = false; + terminal.input_scroll(&b"libre\n"[..]); + assert!(wait_for(&terminal, "libre")); + } + #[test] fn block_fill_couvre_toute_la_plage_unicode() { // U+2580–U+259F : chaque élément de bloc a sa géométrie native. diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 9b41a22..6efd65b 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -974,7 +974,10 @@ where let buffer_size = terminal.with_buffer(|buffer| buffer.size()); let is_app_cursor = terminal.term.lock().mode().contains(TermMode::APP_CURSOR); - let is_mouse_mode = terminal.term.lock().mode().intersects(TermMode::MOUSE_MODE); + // [yoda] En lecture seule, la souris revient au terminal : sélection et + // défilement locaux, même dans une application qui la capture. + let is_mouse_mode = terminal.term.lock().mode().intersects(TermMode::MOUSE_MODE) + && !terminal.read_only; let term_mode = *terminal.term.lock().mode(); match event { Event::Window(event) => match event { From 9b10e98ab181746b9764c3f60c2f0eeadb80630c Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Thu, 1 Oct 2026 14:38:17 +0200 Subject: [PATCH 14/14] yoda: copie a la selection vers le presse-papiers, a la Ghostty La selection n'allait que dans la selection primaire (clic du milieu) ; pour la coller avec Ctrl+V ailleurs, il fallait Ctrl+Shift+C. Reprise de copy-on-select = clipboard de Ghostty, le reglage de l'ancienne config Ghostty de Lionel. - Config copy_on_select_clipboard (desactive par defaut, comme l'amont) ; case dans Reglages > Avance. - terminal_box::on_selection_done : publie a la fin d'un geste de selection fait dans le panneau (glisser, double/triple clic, Shift+ clic), pas a chaque relachement du bouton gauche. La copie primaire existante part elle a tout relachement dans la fenetre : la recopier dans le presse-papiers ecraserait, au simple clic sur un onglet, ce qu'on vient de copier ailleurs avec une vieille selection. - Message::SelectionDone : copie la selection de cet onglet ; une selection vide (simple clic) ne donne pas de texte (range_simple). Co-Authored-By: Claude Opus 5.5 --- i18n/en/cosmic_term.ftl | 2 ++ i18n/fr/cosmic_term.ftl | 2 ++ src/config.rs | 6 ++++++ src/main.rs | 33 +++++++++++++++++++++++++++++++++ src/terminal_box.rs | 13 +++++++++++++ 5 files changed, 56 insertions(+) diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index b32e7ad..aab041c 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -68,6 +68,8 @@ window-header = Window header show-header-description = Reveal the header from the right-click menu tab-new-inherit-working-directory = New tabs and windows use current directory tab-new-inherit-working-directory-description = Open new tabs and windows in the active tab's working directory +copy-on-select-clipboard = Copy selection to clipboard +copy-on-select-clipboard-description = In addition to the primary selection (middle click), like copy-on-select = clipboard in Ghostty ### Keyboard shortcuts add-another-keybinding = Add another keybinding diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index bb3a00a..5d2d82e 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -172,5 +172,7 @@ comment = Émulateur de terminal pour le bureau COSMIC keywords = Commande;Shell;Terminal;CLI; tab-new-inherit-working-directory = Les nouveaux onglets et fenêtres utilisent le répertoire actuel tab-new-inherit-working-directory-description = Ouvrir les nouveaux onglets et fenêtres dans le répertoire de travail de l'onglet actif +copy-on-select-clipboard = Copier la sélection dans le presse-papiers +copy-on-select-clipboard-description = En plus de la sélection primaire (clic du milieu), comme copy-on-select = clipboard dans Ghostty show-pane-borders = Afficher les bordures des panneaux unfocused-pane-dim = Atténuation des panneaux inactifs diff --git a/src/config.rs b/src/config.rs index 5b434bc..2137165 100644 --- a/src/config.rs +++ b/src/config.rs @@ -242,6 +242,11 @@ pub struct Config { pub focus_follow_mouse: bool, #[serde(default)] pub tab_new_inherit_working_directory: bool, + /// [yoda] Copier aussi la sélection dans le presse-papiers, et pas + /// seulement dans la sélection primaire (`copy-on-select = clipboard` de + /// Ghostty). + #[serde(default)] + pub copy_on_select_clipboard: bool, pub default_profile: Option, #[serde(default)] pub shortcuts_custom: Shortcuts, @@ -264,6 +269,7 @@ impl Default for Config { dim_font_weight: Weight::NORMAL.0, focus_follow_mouse: false, tab_new_inherit_working_directory: false, + copy_on_select_clipboard: false, font_name: "Noto Sans Mono".to_string(), font_size: 14, font_size_zoom_step_mul_100: 100, diff --git a/src/main.rs b/src/main.rs index f5c6eb2..d69e5f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -600,6 +600,8 @@ pub enum Message { SyntaxTheme(ColorSchemeKind, usize), SystemThemeChange, TabNewInheritWorkingDirectory(bool), + CopyOnSelectClipboard(bool), + SelectionDone(pane_grid::Pane, segmented_button::Entity), TabActivate(segmented_button::Entity), TabActivateJump(usize), TabClose(Option), @@ -1759,6 +1761,14 @@ impl App { self.config.tab_new_inherit_working_directory, Message::TabNewInheritWorkingDirectory, ), + ) + .add( + widget::settings::item::builder(fl!("copy-on-select-clipboard")) + .description(fl!("copy-on-select-clipboard-description")) + .toggler( + self.config.copy_on_select_clipboard, + Message::CopyOnSelectClipboard, + ), ); widget::settings::view_column(vec![ @@ -3404,6 +3414,24 @@ impl Application for App { return self.update_config(); } } + Message::CopyOnSelectClipboard(copy_on_select_clipboard) => { + if copy_on_select_clipboard != self.config.copy_on_select_clipboard { + config_set!(copy_on_select_clipboard, copy_on_select_clipboard); + } + } + Message::SelectionDone(pane, entity) => { + // [yoda] Copie à la sélection vers le presse-papiers ; la + // sélection primaire, elle, suit le relâchement du bouton. + if self.config.copy_on_select_clipboard + && let Some(tab_model) = self.pane_model.panes.get(pane) + && let Some(terminal) = tab_model.data::>(entity) + { + let text = terminal.lock().unwrap().term.lock().selection_to_string(); + if let Some(text) = text.filter(|text| !text.is_empty()) { + return clipboard::write(text); + } + } + } Message::TabNewInheritWorkingDirectory(tab_new_inherit_working_directory) => { config_set!( tab_new_inherit_working_directory, @@ -4298,6 +4326,11 @@ impl Application for App { terminal_box = terminal_box.on_mouse_enter(move || Message::MouseEnter(pane)); } + if self.config.copy_on_select_clipboard { + terminal_box = + terminal_box.on_selection_done(move || Message::SelectionDone(pane, entity)); + } + // [yoda] Voile sur les panneaux non focalisés (à la Ghostty), seulement // quand il y en a plusieurs : on voit d'un coup d'œil où l'on tape. if let Some(dim) = self.config.unfocused_pane_dim_ratio() diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 6efd65b..c43d440 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -123,6 +123,7 @@ pub struct TerminalBox<'a, Message> { dim: Option, mouse_inside_boundary: Option, on_middle_click: Option Message + 'a>>, + on_selection_done: Option Message + 'a>>, on_open_hyperlink: Option Message + 'a>>, on_window_focused: Option Message + 'a>>, on_window_unfocused: Option Message + 'a>>, @@ -151,6 +152,7 @@ where dim: None, mouse_inside_boundary: None, on_middle_click: None, + on_selection_done: None, key_binds, on_open_hyperlink: None, on_window_focused: None, @@ -208,6 +210,14 @@ where self } + /// [yoda] Fin d'un geste de sélection fait dans ce panneau (glisser, double + /// ou triple clic, Shift+clic) : le moment de copier la sélection. Un + /// simple clic ailleurs dans la fenêtre ne le déclenche pas. + pub fn on_selection_done(mut self, on_selection_done: impl Fn() -> Message + 'a) -> Self { + self.on_selection_done = Some(Box::new(on_selection_done)); + self + } + pub fn on_middle_click(mut self, on_middle_click: impl Fn() -> Message + 'a) -> Self { self.on_middle_click = Some(Box::new(on_middle_click)); self @@ -1581,6 +1591,9 @@ where } } terminal.needs_update = true; + if let Some(on_selection_done) = &self.on_selection_done { + shell.publish(on_selection_done()); + } } if let Some(p) = cursor_position.position_in(layout.bounds()) { let x = p.x - self.padding.left;