diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 63abe52..e6ca28b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,10 +1,8 @@ -Replace this text with a description of your changes, and why these changes are important. Read and acknowledge the list below. PRs without a completed checkbox will be closed. +- [ ] I have disclosed use of any AI generated code in my commit messages. + - If you are using an LLM, and do not fully understand the changes it is making to the code base, do not create a PR. + - In our experience, AI generated code often results in overly complex code that lacks enough context for a proper fix or feature inclusion. This results in considerably longer code reviews. Due to this, AI authored or partially authored PRs may be closed without comment. +- [ ] I understand these changes in full and will be able to respond to review comments. +- [ ] My change is accurately described in the commit message. +- [ ] My contribution is tested and working as described. +- [ ] I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions. ---- - -- I have not included any LLM (also known as AI) generated content in this PR, including code, comments, and descriptions. -- I understand these changes in full and will be able to respond to review comments. -- My change is accurately described in the commit message. -- My contribution is tested and working as described. -- I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions. -- [ ] I have read and followed all of the above requirements. For more information, see our [contributor guide](https://github.com/pop-os/pop/blob/master/CONTRIBUTING.md). diff --git a/.github/workflows/require-checklist.yml b/.github/workflows/require-checklist.yml deleted file mode 100644 index fd4ca8c..0000000 --- a/.github/workflows/require-checklist.yml +++ /dev/null @@ -1,14 +0,0 @@ -# From https://github.com/mheap/require-checklist-action, license MIT -name: Require Checklist - -on: - pull_request: - types: [opened, edited, synchronize] - -jobs: - job1: - runs-on: ubuntu-latest - steps: - - uses: mheap/require-checklist-action@v2 - with: - requireChecklist: true diff --git a/Cargo.lock b/Cargo.lock index 6f0f6cd..b1d64b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" version = "0.22.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "uuid", ] @@ -29,7 +29,7 @@ dependencies = [ [[package]] name = "accesskit_atspi_common" version = "0.15.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", @@ -41,7 +41,7 @@ dependencies = [ [[package]] name = "accesskit_consumer" version = "0.32.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "hashbrown 0.16.1", @@ -50,12 +50,12 @@ dependencies = [ [[package]] name = "accesskit_macos" version = "0.23.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", "hashbrown 0.16.1", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] @@ -63,7 +63,7 @@ dependencies = [ [[package]] name = "accesskit_unix" version = "0.18.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_atspi_common", @@ -78,7 +78,7 @@ dependencies = [ [[package]] name = "accesskit_windows" version = "0.30.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_consumer", @@ -91,7 +91,7 @@ dependencies = [ [[package]] name = "accesskit_winit" version = "0.30.0" -source = "git+https://github.com/wash2/accesskit?rev=6c20249#6c20249d3b9fd45e7002efad9f6b6171a9257912" +source = "git+https://github.com/wash2/accesskit?tag=cosmic-0.14#f0599eed5f18111228266fe3f28991cc48b5964f" dependencies = [ "accesskit", "accesskit_macos", @@ -109,13 +109,24 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" -version = "0.9.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "cipher", + "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", "cpubits", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", ] [[package]] @@ -146,8 +157,8 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46319972e74179d707445f64aaa2893bbf6a111de3a9af29b7eb382f8b39e282" dependencies = [ - "base64 0.22.1", - "bitflags 2.13.2", + "base64", + "bitflags 2.13.1", "home", "libc", "log", @@ -156,7 +167,7 @@ dependencies = [ "piper", "polling", "regex-automata", - "rustix 1.1.5", + "rustix 1.1.4", "rustix-openpty", "serde", "signal-hook", @@ -223,7 +234,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.13.2", + "bitflags 2.13.1", "cc", "jni", "libc", @@ -232,7 +243,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] @@ -309,6 +320,12 @@ 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" @@ -416,7 +433,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 1.1.5", + "rustix 1.1.4", "slab", "windows-sys 0.61.2", ] @@ -447,18 +464,18 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 1.1.5", + "rustix 1.1.4", ] [[package]] name = "async-recursion" -version = "1.2.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f8abc12baad266b1c8cec146854c195b5864b4221d4b2ca7296a7ae82d9e451" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 2.0.119", ] [[package]] @@ -473,7 +490,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.1.5", + "rustix 1.1.4", "signal-hook-registry", "slab", "windows-sys 0.61.2", @@ -493,7 +510,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -564,7 +581,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -588,7 +605,7 @@ dependencies = [ "num-traits", "pastey", "rayon", - "thiserror 2.0.21", + "thiserror 2.0.20", "v_frame", "y4m", ] @@ -622,12 +639,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" - [[package]] name = "basic-toml" version = "0.1.10" @@ -666,9 +677,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.2" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] @@ -709,11 +720,11 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.4.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ - "hybrid-array", + "generic-array", ] [[package]] @@ -722,7 +733,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2 0.5.3", + "objc2 0.5.2", ] [[package]] @@ -731,14 +742,14 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.5", + "objc2 0.6.4", ] [[package]] name = "blocking" -version = "1.7.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -749,9 +760,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.8.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" dependencies = [ "bytes", "cfg_aliases", @@ -790,6 +801,7 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "cfg_aliases", ] @@ -823,13 +835,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.12.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -871,13 +883,14 @@ dependencies = [ [[package]] name = "calloop" -version = "0.14.5" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b32313e937c8721c9d17ee9bf60699a6402b4b7c2cb6ac1bee0ffcaa4b4e5e" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "polling", - "rustix 1.1.5", + "rustix 1.1.4", + "slab", "tracing", ] @@ -888,25 +901,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ "calloop", - "rustix 1.1.5", + "rustix 1.1.4", "wayland-backend", "wayland-client", ] [[package]] name = "cbc" -version = "0.2.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] name = "cc" -version = "1.6.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -927,9 +940,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -950,6 +963,16 @@ 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" @@ -957,7 +980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ "crypto-common 0.2.2", - "inout", + "inout 0.2.2", ] [[package]] @@ -978,6 +1001,7 @@ 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", @@ -987,12 +1011,22 @@ 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" @@ -1010,7 +1044,7 @@ dependencies = [ "cocoa-foundation", "core-foundation 0.9.4", "core-graphics", - "foreign-types 0.5.0", + "foreign-types", "libc", "objc", ] @@ -1048,9 +1082,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" -version = "4.6.8" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -1192,9 +1226,9 @@ dependencies = [ [[package]] name = "configparser" -version = "3.3.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031ad3d167622974ed636505ae4556267ed4aa2aea0464122fa6bc9698a32825" +checksum = "b46dec724fd22199ebde05033a0cbae453bc3b1ecff11eb6a6bb3eec4b90c6a4" [[package]] name = "const-oid" @@ -1243,7 +1277,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types 0.5.0", + "foreign-types", "libc", ] @@ -1264,7 +1298,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "core-foundation 0.10.1", "libc", ] @@ -1280,12 +1314,6 @@ 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" @@ -1298,8 +1326,9 @@ 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.2", + "bitflags 2.13.1", "cosmic-protocols", "libc", "smithay-client-toolkit", @@ -1310,6 +1339,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1330,6 +1360,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "quote", "syn 2.0.119", @@ -1337,7 +1368,8 @@ dependencies = [ [[package]] name = "cosmic-files" -version = "1.10.0" +version = "1.5.0" +source = "git+https://github.com/pop-os/cosmic-files.git#6e210a3753c814118b9f8daf5a83cd53136f28d9" dependencies = [ "anyhow", "atomic_float", @@ -1358,7 +1390,7 @@ dependencies = [ "jiff-icu", "jxl-oxide", "libc", - "libcosmic-yoda", + "libcosmic", "log", "md-5", "mime_guess", @@ -1380,7 +1412,7 @@ dependencies = [ "slotmap", "tar", "tempfile", - "thiserror 2.0.21", + "thiserror 2.0.20", "tokio", "tracing", "tracing-subscriber", @@ -1397,12 +1429,13 @@ dependencies = [ [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" +source = "git+https://github.com/pop-os/freedesktop-icons#ab4c57b8e416c6af9297cb04d101889896fd9a92" dependencies = [ "bstr", "btoi", "memchr", "memmap2 0.9.11", - "thiserror 2.0.21", + "thiserror 2.0.20", "tracing", "xdg", ] @@ -1410,8 +1443,9 @@ 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.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1422,14 +1456,15 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" -version = "0.1.1-yoda.1" +version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#eed01dd3609e90e3c8cd043656734c500956c793" dependencies = [ "zbus", ] [[package]] name = "cosmic-term" -version = "1.10.0" +version = "1.6.0" dependencies = [ "alacritty_terminal", "clap_lex", @@ -1441,32 +1476,30 @@ dependencies = [ "i18n-embed-fl", "icu", "indexmap", - "libcosmic-yoda", + "libcosmic", "log", "open", "paste", - "polling", "regex", - "reqwest", "ron 0.11.0", "rust-embed", "secret-service", "secstr", "serde", - "serde_json", "shlex 1.3.0", - "thiserror 2.0.21", + "thiserror 2.0.20", "tokio", "url", "xdgen", - "zbus", ] [[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", + "bitflags 2.13.1", "fontdb", "harfrust", "linebender_resource_handle", @@ -1482,12 +1515,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#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "almost", "configparser", @@ -1499,7 +1532,7 @@ dependencies = [ "ron 0.12.2", "serde", "serde_json", - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] @@ -1519,27 +1552,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.5.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.8" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1547,27 +1580,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.21" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.14" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.23" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1578,6 +1611,7 @@ 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", @@ -1613,9 +1647,9 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168dbdf4dced8f57fa4246ac9080598452b49d70bb2d0e46422142f113140dd8" +checksum = "199f851bd3cb5004c09474252c7f74e7c047441ed0979bf3688a7106a13da952" dependencies = [ "num-traits", "phf", @@ -1623,6 +1657,15 @@ 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" @@ -1713,7 +1756,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" dependencies = [ - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] @@ -1742,7 +1785,7 @@ checksum = "dc05a5d33db20c784f873e84934ad94bb209a090987ac5f62fede2c178234f23" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -1753,6 +1796,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "crypto-common 0.1.7", + "subtle", ] [[package]] @@ -1816,7 +1860,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.5.3", + "redox_users 0.5.2", "windows-sys 0.61.2", ] @@ -1837,10 +1881,10 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "libc", - "objc2 0.6.5", + "objc2 0.6.4", ] [[package]] @@ -1851,7 +1895,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -1866,8 +1910,9 @@ 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", + "bitflags 2.13.1", "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit", @@ -1892,26 +1937,58 @@ 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" -version = "1.18.0" +version = "1.17.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", -] +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "endi" @@ -2030,7 +2107,7 @@ dependencies = [ "bit_field", "half", "lebe", - "miniz_oxide 0.8.9", + "miniz_oxide", "num-complex", "pulp", "rayon-core", @@ -2089,9 +2166,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.14" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fixed_decimal" @@ -2106,12 +2183,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "miniz_oxide 0.9.1", + "miniz_oxide", "zlib-rs", ] @@ -2178,7 +2255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" dependencies = [ "memchr", - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] @@ -2219,9 +2296,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.12.6" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c92d9081c7ab3bd83ef1eecdfad090f3d966e3ce74106779664114cfe1a6274" +checksum = "75382bc7392ef10aad10935f92fc3db36d2d4dad0e5d96d8d65e04f89a07ec39" dependencies = [ "bytemuck", ] @@ -2249,15 +2326,6 @@ 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" @@ -2265,7 +2333,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -2276,15 +2344,9 @@ checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] -[[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" @@ -2406,7 +2468,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -2440,9 +2502,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.10" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ade96dc9003043bce7c035c85a9df5a858bfb2039c5a2e6fdf00f324f6c551" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" dependencies = [ "cc", "cfg-if", @@ -2463,6 +2525,16 @@ 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" @@ -2586,7 +2658,7 @@ dependencies = [ "hashbrown 0.16.1", "log", "presser", - "thiserror 2.0.21", + "thiserror 2.0.20", "windows 0.62.2", ] @@ -2596,7 +2668,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2607,7 +2679,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -2626,25 +2698,6 @@ dependencies = [ "svg_fmt", ] -[[package]] -name = "h2" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "half" version = "2.7.1" @@ -2663,7 +2716,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "core_maths", "read-fonts 0.37.0", @@ -2704,9 +2757,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2721,7 +2774,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d37f101bf4c633f7ca2e4b5e136050314503dd198e78e325ea602c327c484ef0" dependencies = [ "arrayvec", - "rand 0.8.8", + "rand 0.8.7", "serde", ] @@ -2733,11 +2786,20 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "hkdf" -version = "0.13.0" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "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", ] [[package]] @@ -2758,132 +2820,15 @@ 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" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] -[[package]] -name = "hyper" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" -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" @@ -2978,6 +2923,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "build_helpers", "dnd", @@ -2992,13 +2938,14 @@ dependencies = [ "iced_winit", "image", "mime 0.1.0", - "thiserror 2.0.21", + "thiserror 2.0.20", "window_clipboard", ] [[package]] name = "iced_accessibility" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "accesskit", "accesskit_winit", @@ -3007,8 +2954,9 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "build_helpers", "bytes", "cosmic-client-toolkit", @@ -3023,7 +2971,7 @@ dependencies = [ "rustc-hash 2.1.3", "serde", "smol_str", - "thiserror 2.0.21", + "thiserror 2.0.20", "unicode-segmentation", "web-time", "window_clipboard", @@ -3032,6 +2980,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "iced_core", "iced_futures", @@ -3041,6 +2990,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "futures", "iced_core", @@ -3054,8 +3004,9 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cosmic-text", "half", @@ -3067,13 +3018,14 @@ dependencies = [ "lyon_path", "raw-window-handle", "rustc-hash 2.1.3", - "thiserror 2.0.21", + "thiserror 2.0.20", "unicode-segmentation", ] [[package]] name = "iced_program" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "iced_graphics", "iced_runtime", @@ -3082,17 +3034,19 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "iced_graphics", "iced_tiny_skia", "iced_wgpu", "log", - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] name = "iced_runtime" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "build_helpers", "bytes", @@ -3101,13 +3055,14 @@ dependencies = [ "iced_core", "iced_futures", "raw-window-handle", - "thiserror 2.0.21", + "thiserror 2.0.20", "window_clipboard", ] [[package]] name = "iced_tiny_skia" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "bytemuck", "cosmic-text", @@ -3124,8 +3079,10 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ - "bitflags 2.13.2", + "as-raw-xcb-connection", + "bitflags 2.13.1", "build_helpers", "bytemuck", "cosmic-client-toolkit", @@ -3141,17 +3098,20 @@ dependencies = [ "resvg", "rustc-hash 2.1.3", "rustix 0.38.44", - "thiserror 2.0.21", + "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#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3162,7 +3122,7 @@ dependencies = [ "num-traits", "ouroboros", "rustc-hash 2.1.3", - "thiserror 2.0.21", + "thiserror 2.0.20", "unicode-segmentation", "window_clipboard", ] @@ -3170,6 +3130,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3184,7 +3145,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 2.1.3", "rustix 0.38.44", - "thiserror 2.0.21", + "thiserror 2.0.20", "wasm-bindgen-futures", "wayland-backend", "wayland-client", @@ -3201,9 +3162,9 @@ dependencies = [ [[package]] name = "icu" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4867dd3a39b9d48632416cc7fc3dfa1913d89fd36cc02fe7bfc1dddc6fda3cde" +checksum = "8d5080b89807979ab05f8b6f3c6bbd580ece1512a6cf4cf800baa76937e488b3" dependencies = [ "icu_calendar", "icu_casemap", @@ -3271,9 +3232,9 @@ checksum = "059fcda0fc8d33effc6633a8cf0d8a3c17caf7d7c91918fba9918744f501e4e8" [[package]] name = "icu_collator" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08984ed58ac439ebf3e13d2cf26b0c46a60afcd21721c1d14087c0b240344dda" +checksum = "59eea194d189ca897bcb960fd2130f9e7d53998460d4d32e85a60b10d5507cf4" dependencies = [ "icu_collator_data", "icu_collections", @@ -3426,9 +3387,9 @@ checksum = "4ffef91ee351bd195a803115615a034dfb9f02bb48850980548c31cb78568a91" [[package]] name = "icu_locale" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "785f595c61ef57169a467eeed7b4b6936a66f6cacbb116a96ee86da983251bf4" +checksum = "250ec6d4ac288584d1d0ba29dbfad7737635b7b0e822441f4026a523e3fdb147" dependencies = [ "icu_collections", "icu_locale_core", @@ -3559,9 +3520,9 @@ checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428" dependencies = [ "displaydoc", "icu_locale_core", @@ -3617,9 +3578,9 @@ dependencies = [ [[package]] name = "icu_time_data" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e21be527807cda7562cbfbdb04179f9cca46c12691d6a8073ffae6cfd7aeec" +checksum = "005ff86fa5851a77fc0a977b72d717f777bd9230415a247219d7898aefb1517a" [[package]] name = "ident_case" @@ -3706,15 +3667,15 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "indexmap" -version = "2.14.2" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -3737,7 +3698,7 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "inotify-sys", "libc", ] @@ -3751,13 +3712,22 @@ 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", ] @@ -3791,12 +3761,6 @@ 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" @@ -3839,9 +3803,9 @@ checksum = "4d3667095d64c3ecffc96463a21157b04bf3e252f6e8d5750b20c02e33c194e3" [[package]] name = "jiff" -version = "0.2.37" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" dependencies = [ "defmt", "jiff-core", @@ -3856,12 +3820,11 @@ dependencies = [ [[package]] name = "jiff-core" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" dependencies = [ "defmt", - "log", ] [[package]] @@ -3877,9 +3840,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.37" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" dependencies = [ "jiff-core", "proc-macro2", @@ -3914,7 +3877,7 @@ dependencies = [ "jni-sys 0.4.1", "log", "simd_cesu8", - "thiserror 2.0.21", + "thiserror 2.0.20", "walkdir", "windows-link 0.2.1", ] @@ -3972,9 +3935,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.106" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -4176,7 +4139,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "serde", ] @@ -4222,7 +4185,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", ] @@ -4249,9 +4212,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" @@ -4267,13 +4230,14 @@ checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" -version = "0.2.190" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] -name = "libcosmic-yoda" -version = "0.1.0-yoda.2" +name = "libcosmic" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#c1897c01aa8a25776ceadeddcb161bb59ccffd79" dependencies = [ "apply", "ashpd 0.12.3", @@ -4306,12 +4270,11 @@ dependencies = [ "palette", "phf", "rfd", - "roxmltree", "rust-embed", "serde", "slotmap", "taffy", - "thiserror 2.0.21", + "thiserror 2.0.20", "tokio", "tracing", "unicode-segmentation", @@ -4347,14 +4310,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.25" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", "plain", - "redox_syscall 0.9.4", + "redox_syscall 0.9.2", ] [[package]] @@ -4378,6 +4341,12 @@ 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" @@ -4407,9 +4376,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.34" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loom" @@ -4452,9 +4421,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.21" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" +checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" dependencies = [ "lyon_path", "num-traits", @@ -4483,9 +4452,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.22" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" +checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" dependencies = [ "float_next_after", "lyon_path", @@ -4578,10 +4547,10 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block", "core-graphics-types 0.2.0", - "foreign-types 0.5.0", + "foreign-types", "log", "objc", "paste", @@ -4590,6 +4559,7 @@ 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", ] @@ -4626,21 +4596,11 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "miniz_oxide" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "mio" -version = "1.2.4" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -4667,12 +4627,6 @@ 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" @@ -4687,7 +4641,7 @@ checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.13.2", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -4701,34 +4655,17 @@ dependencies = [ "once_cell", "rustc-hash 1.1.0", "spirv", - "thiserror 2.0.21", + "thiserror 2.0.20", "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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "jni-sys 0.3.1", "log", "ndk-sys", @@ -4798,7 +4735,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "fsevent-sys", "inotify", "kqueue", @@ -4829,7 +4766,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -4992,9 +4929,9 @@ checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ "objc-sys", "objc2-encode", @@ -5002,9 +4939,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.5" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -5015,10 +4952,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "libc", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", "objc2-foundation 0.2.2", @@ -5031,9 +4968,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", ] @@ -5044,9 +4981,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-foundation 0.2.2", ] @@ -5056,10 +4993,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", - "objc2 0.6.5", + "objc2 0.6.4", ] [[package]] @@ -5068,7 +5005,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libc", "objc2-core-foundation", ] @@ -5080,7 +5017,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ "block2 0.5.1", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-foundation 0.2.2", "objc2-metal", ] @@ -5091,7 +5028,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "objc2-core-foundation", "objc2-core-graphics", ] @@ -5108,10 +5045,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", "libc", - "objc2 0.5.3", + "objc2 0.5.2", ] [[package]] @@ -5120,9 +5057,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.6.2", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-core-foundation", ] @@ -5132,9 +5069,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-foundation 0.2.2", ] @@ -5144,9 +5081,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "block2 0.5.1", - "objc2 0.5.3", + "objc2 0.5.2", "objc2-foundation 0.2.2", "objc2-metal", ] @@ -5157,8 +5094,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.13.2", - "objc2 0.6.5", + "bitflags 2.13.1", + "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", ] @@ -5180,57 +5117,14 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" -version = "5.4.4" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +checksum = "f9cfef937e9c486488c7e3d949ae31c0f1d06bdacd75b99c086cb35356e30408" dependencies = [ "is-wsl", "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" @@ -5249,9 +5143,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.5.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c9e0d9b23589f26070720bac724174bfec1083e82f7854cdd0267518343c0" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", ] @@ -5268,9 +5162,9 @@ dependencies = [ [[package]] name = "ordermap" -version = "1.2.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a756ddcdeb6c0efc8927bdf0ed112885815a35ba350472a467be5104f01ca1" +checksum = "7f7476a5b122ff1fce7208e7ee9dccd0a516e835f5b8b19b8f3c98a34cf757c1" dependencies = [ "indexmap", "serde", @@ -5399,7 +5293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" dependencies = [ "digest 0.11.3", - "hmac", + "hmac 0.13.0", ] [[package]] @@ -5487,9 +5381,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bee6c73da26345c729282832b60b0363cf3dd9f4bfd81d8551b7a1c889a113" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" @@ -5524,7 +5418,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.9", + "miniz_oxide", ] [[package]] @@ -5533,11 +5427,11 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.9", + "miniz_oxide", ] [[package]] @@ -5550,7 +5444,7 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.1.5", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -5568,9 +5462,9 @@ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -5588,15 +5482,15 @@ dependencies = [ [[package]] name = "powerfmt" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196a7c80b9a7652aba7cc070827516c2abe4ccdf53d128e1944003cf5726cff1" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "ppv-lite86" @@ -5624,9 +5518,9 @@ dependencies = [ [[package]] name = "proc-macro-error-attr3" -version = "3.1.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e564d14133360e1ae169ffde5da25881b5fa47261665b8e5713c212c27799da" +checksum = "b0084e6206a967a2dad822180626b2f6b07a3b379325e8f1ec0438e33a469ba7" dependencies = [ "proc-macro2", "quote", @@ -5634,14 +5528,14 @@ dependencies = [ [[package]] name = "proc-macro-error3" -version = "3.1.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0d4471b3436c22106b21913b1dda531558918ae9b7ec55d58aa84b43552233" +checksum = "0cf066225f2373bc711684792b69bdeac0356019b007e721090c24d92d5d5a50" dependencies = [ "proc-macro-error-attr3", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -5672,11 +5566,11 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "chrono", "flate2", "procfs-core", - "rustix 1.1.5", + "rustix 1.1.4", ] [[package]] @@ -5685,7 +5579,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "chrono", "hex", ] @@ -5795,9 +5689,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.8" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -5894,7 +5788,7 @@ dependencies = [ "rand 0.9.5", "rand_chacha 0.9.0", "simd_helpers", - "thiserror 2.0.21", + "thiserror 2.0.20", "v_frame", "wasm-bindgen", ] @@ -5920,7 +5814,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -5967,7 +5861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ "bytemuck", - "font-types 0.12.6", + "font-types 0.12.3", "once_cell", ] @@ -5999,7 +5893,7 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5018d583d6d2f5499352aea8d177e9067d1eb03ab17c78169d5ba7a30001b15" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "libredox", ] @@ -6009,16 +5903,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] name = "redox_syscall" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" +checksum = "f1c93da5bb2c5d4e6c0ef7abeead62c89169a0a4882bfb83ac892f2423aea2fe" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -6034,12 +5928,13 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ + "getrandom 0.2.17", "libredox", - "thiserror 2.0.21", + "thiserror 2.0.20", ] [[package]] @@ -6077,49 +5972,6 @@ 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" @@ -6148,7 +6000,7 @@ dependencies = [ "dispatch2", "js-sys", "log", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -6170,28 +6022,14 @@ 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 0.22.1", - "bitflags 2.13.2", + "base64", + "bitflags 2.13.1", "serde", "serde_derive", "unicode-ident", @@ -6203,7 +6041,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "once_cell", "serde", "serde_derive", @@ -6279,7 +6117,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6288,11 +6126,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -6307,40 +6145,7 @@ checksum = "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32cd85e2393" dependencies = [ "errno", "libc", - "rustix 1.1.5", -] - -[[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", + "rustix 1.1.4", ] [[package]] @@ -6355,7 +6160,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "core_maths", "log", @@ -6367,12 +6172,6 @@ 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" @@ -6382,15 +6181,6 @@ 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" @@ -6418,20 +6208,20 @@ dependencies = [ [[package]] name = "secret-service" -version = "5.2.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5107b24b91445dd2aa449a258a1807b63240942157292354dc5bfdbeb8bc6db8" +checksum = "9a62d7f86047af0077255a29494136b9aaaf697c76ff70b8e49cded4e2623c14" dependencies = [ - "aes", + "aes 0.8.4", "cbc", "futures-util", - "getrandom 0.4.3", + "generic-array", + "getrandom 0.2.17", "hkdf", - "hybrid-array", "num", "once_cell", "serde", - "sha2 0.11.0", + "sha2 0.10.9", "zbus", ] @@ -6444,29 +6234,6 @@ 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" @@ -6506,7 +6273,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -6531,19 +6298,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", -] - -[[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", + "syn 3.0.3", ] [[package]] @@ -6553,7 +6308,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", "digest 0.11.3", ] @@ -6575,7 +6330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.1", + "cpufeatures 0.3.0", "digest 0.11.3", ] @@ -6662,9 +6417,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "skrifa" @@ -6703,9 +6458,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.16.2" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smithay-client-toolkit" @@ -6713,7 +6468,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "calloop", "calloop-wayland-source", @@ -6722,8 +6477,8 @@ dependencies = [ "log", "memmap2 0.9.11", "pkg-config", - "rustix 1.1.5", - "thiserror 2.0.21", + "rustix 1.1.4", + "thiserror 2.0.20", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -6740,6 +6495,7 @@ 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", @@ -6770,26 +6526,31 @@ 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 0.5.0", + "foreign-types", "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]] @@ -6807,7 +6568,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", ] [[package]] @@ -6883,24 +6644,15 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.6" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", "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" @@ -6913,13 +6665,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.14.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 2.0.119", ] [[package]] @@ -6931,27 +6683,6 @@ 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" @@ -6984,7 +6715,7 @@ dependencies = [ "fastrand", "getrandom 0.4.3", "once_cell", - "rustix 1.1.5", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -7014,11 +6745,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.21" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.21", + "thiserror-impl 2.0.20", ] [[package]] @@ -7034,13 +6765,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.21" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -7137,6 +6868,19 @@ 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" @@ -7150,15 +6894,24 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.13.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.53.2" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -7179,27 +6932,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" -dependencies = [ - "rustls", - "tokio", + "syn 3.0.3", ] [[package]] @@ -7213,20 +6946,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml" version = "0.5.11" @@ -7247,9 +6966,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.15+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", "toml_datetime", @@ -7266,51 +6985,6 @@ 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" @@ -7375,28 +7049,22 @@ dependencies = [ [[package]] name = "trash" -version = "5.2.9" +version = "5.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be89b3fe156965d29ac4f8522f3a640c655affdd9f21cb4f36857f0c92c00317" +checksum = "7602e0c7d66ec2d92a8c917219fbc7894039efa2063b9064260110828a356f46" dependencies = [ "chrono", "libc", "log", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-foundation 0.3.2", "once_cell", "percent-encoding", "scopeguard", "urlencoding", - "windows 0.62.2", + "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" @@ -7474,9 +7142,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.10.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -7498,9 +7166,9 @@ checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" -version = "1.0.26" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-linebreak" @@ -7538,12 +7206,6 @@ 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" @@ -7569,7 +7231,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ - "base64 0.22.1", + "base64", "data-url", "flate2", "fontdb", @@ -7604,9 +7266,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.27.0" +version = "1.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" dependencies = [ "js-sys", "serde_core", @@ -7640,12 +7302,6 @@ 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" @@ -7659,7 +7315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" dependencies = [ "arrayvec", - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "log", "memchr", @@ -7676,15 +7332,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -7702,9 +7349,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.129" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -7715,20 +7362,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.79" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", - "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.129" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7736,39 +7382,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.129" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.6", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.129" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" 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" @@ -7791,7 +7424,7 @@ checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.5", + "rustix 1.1.4", "scoped-tls", "smallvec", "wayland-sys", @@ -7803,8 +7436,8 @@ version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "bitflags 2.13.2", - "rustix 1.1.5", + "bitflags 2.13.1", + "rustix 1.1.4", "wayland-backend", "wayland-scanner", ] @@ -7815,7 +7448,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "wayland-backend", ] @@ -7826,7 +7459,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" dependencies = [ - "rustix 1.1.5", + "rustix 1.1.4", "wayland-client", "xcursor", ] @@ -7837,7 +7470,7 @@ version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7850,7 +7483,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7863,7 +7496,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7876,7 +7509,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7889,7 +7522,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7914,9 +7547,9 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde9c29be0f723a573977de51ee455bf3dfa03652730a74f9dd3b337e374d75" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "downcast-rs", - "rustix 1.1.5", + "rustix 1.1.4", "wayland-backend", "wayland-scanner", ] @@ -7935,9 +7568,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.106" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -7966,7 +7599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" dependencies = [ "arrayvec", - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cfg-if", "cfg_aliases", @@ -7998,7 +7631,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "cfg_aliases", "document-features", @@ -8013,7 +7646,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.21", + "thiserror 2.0.20", "wgpu-core-deps-apple", "wgpu-core-deps-emscripten", "wgpu-core-deps-windows-linux-android", @@ -8058,7 +7691,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.13.2", + "bitflags 2.13.1", "block", "bytemuck", "cfg-if", @@ -8088,7 +7721,7 @@ dependencies = [ "raw-window-handle", "renderdoc-sys", "smallvec", - "thiserror 2.0.21", + "thiserror 2.0.20", "wasm-bindgen", "web-sys", "wgpu-types", @@ -8102,7 +7735,7 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "bytemuck", "js-sys", "log", @@ -8149,16 +7782,28 @@ 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", "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" @@ -8202,14 +7847,26 @@ dependencies = [ "windows-core 0.62.2", ] +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -8221,8 +7878,8 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.2.1", "windows-result 0.4.1", "windows-strings 0.5.1", @@ -8250,6 +7907,17 @@ dependencies = [ "windows-threading 0.2.1", ] +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-implement" version = "0.60.2" @@ -8261,6 +7929,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -8305,14 +7984,12 @@ dependencies = [ ] [[package]] -name = "windows-registry" -version = "0.6.1" +name = "windows-result" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", + "windows-targets 0.52.6", ] [[package]] @@ -8603,14 +8280,15 @@ 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.2", + "bitflags 2.13.1", "cfg_aliases", "cursor-icon", "dpi", "libc", "raw-window-handle", - "rustix 1.1.5", + "rustix 1.1.4", "smol_str", "tracing", "winit-android", @@ -8622,14 +8300,16 @@ 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.2", + "bitflags 2.13.1", "dpi", "ndk", "raw-window-handle", @@ -8641,12 +8321,13 @@ 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.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", "dpi", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-core-graphics", @@ -8662,21 +8343,24 @@ 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.5", + "objc2 0.6.4", "objc2-core-foundation", "smol_str", "tracing", "winit-core", + "x11-dl", "xkbcommon-dl", ] [[package]] name = "winit-core" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#71ce08c043814514a8fd92d9d0599f115ae854e8" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "cursor-icon", "dpi", "keyboard-types", @@ -8688,8 +8372,9 @@ 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.2", + "bitflags 2.13.1", "dpi", "libredox", "orbclient", @@ -8703,12 +8388,13 @@ 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.2", + "bitflags 2.13.1", "block2 0.6.2", "dispatch2", "dpi", - "objc2 0.6.5", + "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", "objc2-ui-kit", @@ -8722,16 +8408,17 @@ 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.2", + "bitflags 2.13.1", "calloop", "cursor-icon", "dpi", "libc", "memmap2 0.9.11", "raw-window-handle", - "rustix 1.1.5", + "rustix 1.1.4", "sctk-adwaita", "smithay-client-toolkit", "smol_str", @@ -8747,9 +8434,10 @@ 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.2", + "bitflags 2.13.1", "concurrent-queue", "cursor-icon", "dpi", @@ -8768,8 +8456,9 @@ 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.2", + "bitflags 2.13.1", "cursor-icon", "dpi", "raw-window-handle", @@ -8780,6 +8469,29 @@ 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" @@ -8810,6 +8522,39 @@ 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" @@ -8817,7 +8562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.1.5", + "rustix 1.1.4", ] [[package]] @@ -8884,7 +8629,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.13.2", + "bitflags 2.13.1", "dlib", "log", "once_cell", @@ -8958,13 +8703,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 2.0.119", "synstructure", ] @@ -8990,7 +8735,7 @@ dependencies = [ "hex", "libc", "ordered-stream", - "rustix 1.1.5", + "rustix 1.1.4", "serde", "serde_repr", "tokio", @@ -9037,7 +8782,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", "zbus_names", "zvariant", "zvariant_utils", @@ -9083,18 +8828,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.59" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.59" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", @@ -9112,13 +8857,13 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 2.0.119", "synstructure", ] @@ -9142,9 +8887,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.8" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8" dependencies = [ "serde", "yoke", @@ -9154,13 +8899,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.6" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +checksum = "9f212a141d820099d57ffafb9569be9617a6f27d3dc881fbee8fb56642f917a9" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", ] [[package]] @@ -9169,14 +8914,14 @@ version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" dependencies = [ - "aes", + "aes 0.9.2", "bzip2", "constant_time_eq", "crc32fast", "deflate64", "flate2", "getrandom 0.4.3", - "hmac", + "hmac 0.13.0", "indexmap", "lzma-rust2", "memchr", @@ -9192,9 +8937,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" [[package]] name = "zmij" @@ -9225,18 +8970,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.3.0" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.1.0+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", @@ -9306,7 +9051,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.3", "zvariant_utils", ] @@ -9319,10 +9064,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 3.0.6", + "syn 3.0.3", "winnow", ] - -[[patch.unused]] -name = "winit-x11" -version = "0.31.0-beta.2" diff --git a/Cargo.toml b/Cargo.toml index 2862491..606d642 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-term" -version = "1.10.0" +version = "1.6.0" authors = ["Jeremy Soller "] edition = "2024" license = "GPL-3.0-only" @@ -18,9 +18,6 @@ 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/cargo.just b/cargo.just deleted file mode 100644 index fb09e1e..0000000 --- a/cargo.just +++ /dev/null @@ -1,70 +0,0 @@ -cargo-target-dir := env('CARGO_TARGET_DIR', 'target') - -# Compile with debug profile -[no-cd] -build-debug *args: - cargo build {{args}} - -# Compile with release profile -[no-cd] -build-release *args: (build-debug '--release' args) - -# Compile with a vendored tarball -[no-cd] -build-vendored *args: vendor-extract (build-release '--frozen --offline' args) - -# Check for errors and linter warnings -[no-cd] -check *args: - cargo clippy --all-features {{args}} -- -W clippy::pedantic - -# Runs a check with JSON message format for IDE integration -[no-cd] -check-json: (check '--message-format=json') - -# Remove Cargo build artifacts -[no-cd] -clean: - cargo clean - -# Also remove .cargo and vendored dependencies -[no-cd] -clean-dist: clean - rm -rf .cargo vendor vendor.tar target - -# Run the application for testing purposes -[no-cd] -run *args: - cargo run {{args}} - -# Run `cargo test` -[no-cd] -test *args: - cargo test {{args}} - -# Vendor Cargo dependencies locally -[no-cd] -vendor: - #!/usr/bin/env bash - mkdir -p .cargo - cargo vendor --locked | head -n -1 > .cargo/config.toml - echo 'directory = "vendor"' >> .cargo/config.toml - echo >> .cargo/config.toml - echo '[env]' >> .cargo/config.toml - if [ -n "${SOURCE_DATE_EPOCH}" ] - then - source_date="$(date -d "@${SOURCE_DATE_EPOCH}" "+%Y-%m-%d")" - echo "VERGEN_GIT_COMMIT_DATE = \"${source_date}\"" >> .cargo/config.toml - fi - if [ -n "${SOURCE_GIT_HASH}" ] - then - echo "VERGEN_GIT_SHA = \"${SOURCE_GIT_HASH}\"" >> .cargo/config.toml - fi - tar pcf vendor.tar .cargo vendor - rm -rf .cargo vendor - -# Extracts vendored dependencies -[no-cd] -vendor-extract: - rm -rf vendor - tar pxf vendor.tar diff --git a/debian/changelog b/debian/changelog index 3f4cb6f..0c59b1d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,27 +1,3 @@ -cosmic-term (1.10.0) noble; urgency=medium - - * Epoch 1.10.0 version update - - -- Michael Murphy Mon, 05 Oct 2026 21:28:17 +0200 - -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 - - -- Jeremy Soller Wed, 02 Sep 2026 08:15:55 -0600 - -cosmic-term (1.7.0) noble; urgency=medium - - * Epoch 1.7.0 version update - - -- Jeremy Soller Tue, 25 Aug 2026 09:21:20 -0600 - cosmic-term (1.6.0) noble; urgency=medium * Epoch 1.6.0 version update diff --git a/debian/source/options b/debian/source/options index 2f8c4a1..5d4ff73 100644 --- a/debian/source/options +++ b/debian/source/options @@ -1,6 +1,4 @@ tar-ignore=.github -tar-ignore=target/.rustc_info.json -tar-ignore=target/CACHEDIR.TAG -tar-ignore=target/debug -tar-ignore=target/release +tar-ignore=.vscode tar-ignore=vendor +tar-ignore=target \ No newline at end of file diff --git a/i18n/cs/cosmic_term.ftl b/i18n/cs/cosmic_term.ftl index 9853ec4..89aa747 100644 --- a/i18n/cs/cosmic_term.ftl +++ b/i18n/cs/cosmic_term.ftl @@ -45,8 +45,8 @@ use-bright-bold = Světlejší tučný text splits = Rozdělení focus-follow-mouse = Zaměření psaní sleduje myš advanced = Pokročilé -show-headerbar = Zobrazit záhlaví -show-header-description = Záhlaví lze odkrýt v nabídce zobrazené po kliknutí pravým tlačítkem myši +show-headerbar = Zobrazit hlavičku +show-header-description = Hlavičku lze odkrýt z nabídky zobrazené po kliknutí pravým tlačítkem myši find-placeholder = Najít... find-previous = Najít předchozí find-next = Najít další @@ -69,7 +69,7 @@ next-tab = Další karta previous-tab = Předchozí karta split-horizontal = Rozdělit horizontálně split-vertical = Rozdělit vertikálně -pane-toggle-maximize = Maximalizovat nebo obnovit podokno +pane-toggle-maximize = Přepnout maximalizaci menu-color-schemes = Barevná schémata... menu-settings = Nastavení... menu-about = O aplikaci Terminál COSMIC... @@ -99,17 +99,14 @@ shortcut-group-zoom = Přiblížení toggle-fullscreen = Přepnout režim celé obrazovky type-to-search = Pište pro vyhledávání... copy-or-sigint = Kopírovat nebo SIGINT -focus-pane-down = Zaměřit podokno dole -focus-pane-left = Zaměřit podokno vlevo -focus-pane-right = Zaměřit podokno vpravo -focus-pane-up = Zaměřit podokno nahoře +focus-pane-down = Zaměřit panel dole +focus-pane-left = Zaměřit panel vlevo +focus-pane-right = Zaměřit panel vpravo +focus-pane-up = Zaměřit panel nahoře shortcut-replace-body = { $binding } je již přiřazena k „{ $existing }“. Nahradit za „{ $new_action }“? shortcut-capture-hint = Stiskněte kombinaci kláves paste-primary = Vložit primární copy-link = Kopírovat odkaz tab-new-inherit-working-directory = Nové karty a okna používají aktuální adresář tab-new-inherit-working-directory-description = Otevírat nové karty a okna v pracovním adresáři aktivní karty -show-pane-borders = Zobrazit ohraničení podoken -window-header = Záhlaví okna -move-tab-left = Přesunout kartu doleva -move-tab-right = Přesunout kartu doprava +show-pane-borders = Zobrazit ohraničení panelu diff --git a/i18n/da/cosmic_term.ftl b/i18n/da/cosmic_term.ftl index acd6e6c..3e55885 100644 --- a/i18n/da/cosmic_term.ftl +++ b/i18n/da/cosmic_term.ftl @@ -1,7 +1,7 @@ rename = Omdøb delete = Slet name = Navn -cancel = Afbryd +cancel = Annuller quit = Afslut find-next = Find næste select-all = Vælg alle diff --git a/i18n/de/cosmic_term.ftl b/i18n/de/cosmic_term.ftl index 3dcb828..21d29da 100644 --- a/i18n/de/cosmic_term.ftl +++ b/i18n/de/cosmic_term.ftl @@ -105,7 +105,7 @@ next-tab = Nächster Tab previous-tab = Vorheriger Tab split-horizontal = Horizontal teilen split-vertical = Vertikal teilen -pane-toggle-maximize = Bereich maximieren oder wiederherstellen +pane-toggle-maximize = Maximierung umschalten menu-color-schemes = Farbschemen ... menu-settings = Einstellungen ... menu-about = Über COSMIC Terminal ... @@ -150,6 +150,3 @@ keywords = Befehl;Shell;Terminal;CLI; tab-new-inherit-working-directory = Neue Tabs und Fenster verwenden das aktuelle Verzeichnis tab-new-inherit-working-directory-description = Neue Tabs und Fenster im Arbeitsverzeichnis des aktiven Tabs öffnen show-pane-borders = Bereichsrahmen anzeigen -window-header = Fenstertitel -move-tab-left = Tab nach links verschieben -move-tab-right = Tab nach rechts verschieben diff --git a/i18n/el/cosmic_term.ftl b/i18n/el/cosmic_term.ftl index f2a6414..fbc7b53 100644 --- a/i18n/el/cosmic_term.ftl +++ b/i18n/el/cosmic_term.ftl @@ -107,7 +107,7 @@ next-tab = Επόμενη καρτέλα previous-tab = Προηγούμενη καρτέλα split-horizontal = Οριζόντιος διαχωρισμός split-vertical = Κάθετος διαχωρισμός -pane-toggle-maximize = Μεγιστοποίηση ή επαναφορά προβολής +pane-toggle-maximize = Εναλλαγή μεγιστοποίησης menu-color-schemes = Χρωματικοί συνδυασμοί... menu-settings = Ρυθμίσεις... menu-about = Σχετικά με το Τερματικό COSMIC... @@ -152,7 +152,3 @@ shortcut-group-zoom = Ζουμ shortcut-replace-body = Ο συνδυασμός { $binding } έχει ήδη αντιστοιχιστεί στην ενέργεια «{ $existing }». Θέλετε να αντικατασταθεί με την ενέργεια «{ $new_action }»; tab-new-inherit-working-directory = Οι νέες καρτέλες και παράθυρα χρησιμοποιούν τον τρέχοντα κατάλογο tab-new-inherit-working-directory-description = Άνοιγμα νέων καρτελών και παραθύρων στον τρέχοντα κατάλογο της ενεργής καρτέλας -show-pane-borders = Εμφάνιση περιγραμμάτων πλαισίων -window-header = Κεφαλίδα παραθύρου -move-tab-left = Μετακίνηση καρτέλας στα αριστερά -move-tab-right = Μετακίνηση καρτέλας στα δεξιά diff --git a/i18n/en-GB/cosmic_term.ftl b/i18n/en-GB/cosmic_term.ftl index c966e6f..5714c25 100644 --- a/i18n/en-GB/cosmic_term.ftl +++ b/i18n/en-GB/cosmic_term.ftl @@ -105,7 +105,7 @@ next-tab = Next tab previous-tab = Previous tab split-horizontal = Split horizontal split-vertical = Split vertical -pane-toggle-maximize = Maximise or restore pane +pane-toggle-maximize = Toggle maximized menu-color-schemes = Colour schemes... menu-settings = Settings... menu-about = About COSMIC Terminal... @@ -115,4 +115,3 @@ cancel = Cancel keyboard-shortcuts = Keyboard shortcuts replace = Replace menu-keyboard-shortcuts = Keyboard shortcuts... -window-header = Window header diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index a5f5e91..8d282d4 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -59,17 +59,13 @@ 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 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 -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 @@ -142,10 +138,6 @@ 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 ## Open open-link = Open Link @@ -158,11 +150,9 @@ zoom-reset = Default text size zoom-out = Smaller text next-tab = Next tab previous-tab = Previous tab -move-tab-left = Move tab left -move-tab-right = Move tab right split-horizontal = Split horizontal split-vertical = Split vertical -pane-toggle-maximize = Maximize or restore pane +pane-toggle-maximize = Toggle maximized menu-color-schemes = Color schemes... menu-settings = Settings... menu-about = About COSMIC Terminal... diff --git a/i18n/fi/cosmic_term.ftl b/i18n/fi/cosmic_term.ftl index 1fc8b6b..0686f39 100644 --- a/i18n/fi/cosmic_term.ftl +++ b/i18n/fi/cosmic_term.ftl @@ -107,7 +107,7 @@ next-tab = Seuraava välilehti previous-tab = Edellinen välilehti split-horizontal = Halkaise näkymä vaakasuunnassa split-vertical = Halkaise näkymä pystysuunnassa -pane-toggle-maximize = Suurenna tai palauta paneeli +pane-toggle-maximize = Suurennus päällä tai pois menu-color-schemes = Väriteemat… menu-settings = Asetukset… menu-about = Tietoa COSMICin päätteestä… @@ -152,6 +152,3 @@ shortcut-group-other = Muut tab-new-inherit-working-directory = Uudet välilehdet käyttävät nykyistä hakemistoa tab-new-inherit-working-directory-description = Avaa uudet välilehdet aktiivisen välilehden työskentelyhakemistossa show-pane-borders = Näytä paneelin rajat -window-header = Ikkunan otsake -move-tab-left = Siirrä välilehti vasemmalle -move-tab-right = Siirrä välilehti oikealle diff --git a/i18n/fil/cosmic_term.ftl b/i18n/fil/cosmic_term.ftl deleted file mode 100644 index e69de29..0000000 diff --git a/i18n/fr/cosmic_term.ftl b/i18n/fr/cosmic_term.ftl index 12248af..834c800 100644 --- a/i18n/fr/cosmic_term.ftl +++ b/i18n/fr/cosmic_term.ftl @@ -96,7 +96,7 @@ quit = Quitter ## Edit -edit = Édition +edit = Modifier copy = Copier paste = Coller select-all = Sélectionner tout @@ -108,10 +108,6 @@ 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 ## View @@ -123,7 +119,7 @@ next-tab = Onglet suivant previous-tab = Onglet précédent split-horizontal = Scinder en horizontal split-vertical = Scinder en vertical -pane-toggle-maximize = Agrandir ou restaurer le panneau +pane-toggle-maximize = Vue unique menu-color-schemes = Palettes de couleurs... menu-settings = Paramètres... menu-about = À propos de terminal COSMIC... @@ -172,10 +168,4 @@ 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 -window-header = Barre de titre de la fenêtre -move-tab-left = Déplacer l'onglet à gauche -move-tab-right = Déplacer l'onglet à droite diff --git a/i18n/ga/cosmic_term.ftl b/i18n/ga/cosmic_term.ftl index acd4585..03f37ce 100644 --- a/i18n/ga/cosmic_term.ftl +++ b/i18n/ga/cosmic_term.ftl @@ -105,7 +105,7 @@ next-tab = An cluaisín ar aghaidh previous-tab = An cluaisín roimhe seo split-horizontal = Scoilt cothrománach split-vertical = Scoilt ingearach -pane-toggle-maximize = Uasmhéadaigh nó athchóirigh an phána +pane-toggle-maximize = Scoránaigh uasmhéadú menu-color-schemes = Scéimeanna dathanna... menu-settings = Socruithe... menu-about = Maidir le COSMIC Teirminéal... @@ -149,5 +149,3 @@ keywords = Ordú;Blaosc;Teirminéal;CLI; copy-link = Cóipeáil Nasc tab-new-inherit-working-directory = Úsáideann cluaisíní agus fuinneoga nua an t-eolaire reatha tab-new-inherit-working-directory-description = Oscail cluaisíní agus fuinneoga nua in eolaire oibre an chluaisín ghníomhaigh -show-pane-borders = Taispeáin teorainneacha na pána -window-header = Ceanntásc na fuinneoige diff --git a/i18n/gl/cosmic_term.ftl b/i18n/gl/cosmic_term.ftl index ece23fd..30e6ecc 100644 --- a/i18n/gl/cosmic_term.ftl +++ b/i18n/gl/cosmic_term.ftl @@ -7,7 +7,7 @@ support = Soporte settings = Axustes appearance = Apariencia theme = Tema -match-desktop = Emparexar co escritorio +match-desktop = Axustar ao escritorio dark = Escuro light = Claro default-zoom-step = Pasos do zoom @@ -110,6 +110,3 @@ passwords-title = Contrasinais add-password = Engadir contrasinal password-input = Contrasinal password-input-description = Descripción -window-header = Cabeceira da xanela -move-tab-left = Mover a pestaña á esquerda -move-tab-right = Mover a pestaña á dereita diff --git a/i18n/hu/cosmic_term.ftl b/i18n/hu/cosmic_term.ftl index daa12f2..9c1e9df 100644 --- a/i18n/hu/cosmic_term.ftl +++ b/i18n/hu/cosmic_term.ftl @@ -52,14 +52,14 @@ opacity = Háttér átlátszósága ### Font -font = Betűkészlet -advanced-font-settings = Speciális betűkészlet-beállítások -default-font = Betűkészlet +font = Betűtípus +advanced-font-settings = Speciális betűtípus-beállítások +default-font = Betűtípus default-font-size = Betűméret default-font-stretch = Betűszélesség -default-font-weight = Normál betűvastagság -default-dim-font-weight = Vékony betűvastagság -default-bold-font-weight = Félkövér betűvastagság +default-font-weight = Normál betűsúly +default-dim-font-weight = Vékony betűsúly +default-bold-font-weight = Félkövér betűsúly use-bright-bold = Félkövér szöveg világosítása ### Splits @@ -109,7 +109,7 @@ next-tab = Következő lap previous-tab = Előző lap split-horizontal = Vízszintes felosztás split-vertical = Függőleges felosztás -pane-toggle-maximize = Panel maximalizálása vagy visszaállítása +pane-toggle-maximize = Panel maximalizálása menu-color-schemes = Színsémák… menu-settings = Beállítások… menu-about = A COSMIC Terminál névjegye… @@ -150,6 +150,3 @@ copy-link = Hivatkozás másolása tab-new-inherit-working-directory = Az új lapok és ablakok az aktuális könyvtárat használják tab-new-inherit-working-directory-description = Az új lapok és ablakok az aktív lap munkakönyvtárában nyílnak meg show-pane-borders = Ablaktábla-szegélyek megjelenítése -window-header = Ablakfejléc -move-tab-left = Lap mozgatása balra -move-tab-right = Lap mozgatása jobbra diff --git a/i18n/id/cosmic_term.ftl b/i18n/id/cosmic_term.ftl index 4a179d4..a17d82d 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 @@ -23,7 +23,7 @@ remain-open = Tetap buka setelah proses anak berakhir. settings = Pengaturan appearance = Tampilan theme = Tema -match-desktop = Sesuaikan desktop +match-desktop = Cocok desktop dark = Gelap light = Terang syntax-dark = Skema warna gelap @@ -68,7 +68,7 @@ next-tab = Tab selanjutnya previous-tab = Tab sebelumnya split-horizontal = Pemisahan horisontal split-vertical = Pemisahan vertikal -pane-toggle-maximize = Maksimalkan atau pulihkan panel +pane-toggle-maximize = Ubah ke maksimal menu-color-schemes = Skema warna... menu-settings = Pengaturan... menu-about = Tentang Terminal COSMIC... @@ -110,6 +110,3 @@ copy-link = Salin Tautan tab-new-inherit-working-directory = Tab dan jendela baru menggunakan direktori saat ini tab-new-inherit-working-directory-description = Buka tab dan jendela baru di direktori pekerjaan tab aktif show-pane-borders = Tampilkan batas panel -window-header = Header jendela -move-tab-left = Pindahkan tab ke kiri -move-tab-right = Pindahkan tab ke kanan diff --git a/i18n/kab/cosmic_term.ftl b/i18n/kab/cosmic_term.ftl index 368b6f2..1761fee 100644 --- a/i18n/kab/cosmic_term.ftl +++ b/i18n/kab/cosmic_term.ftl @@ -1,9 +1,9 @@ -cancel = Semmet +cancel = Sefsex name = Isem delete = kkes rename = Snifel isem -quit = Ffeɣ -support = Tallelt +quit = Tuffɣa +support = Tallalt 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 = Semṣada akked tnarit +match-desktop = Amṣada d tnarit file = Afaylu new-window = Asfaylu amaynut edit = Ẓreg diff --git a/i18n/kk/cosmic_term.ftl b/i18n/kk/cosmic_term.ftl index 7560358..682dd96 100644 --- a/i18n/kk/cosmic_term.ftl +++ b/i18n/kk/cosmic_term.ftl @@ -5,8 +5,8 @@ support = Қолдау settings = Баптаулар appearance = Сыртқы көрініс theme = Тема -match-desktop = Жұмыс үстеліне сәйкес -dark = Қараңғы +match-desktop = Жұмыс үстеліне сәйкес болу +dark = Қою light = Ашық file = Файл new-tab = Жаңа бет @@ -29,7 +29,7 @@ find = Табу cosmic-terminal = COSMIC терминалы new-terminal = Жаңа терминал color-schemes = Түстер схемалары -rename = Атауын өзгерту +rename = Атын өзгерту import-errors = Импорттау қателері profiles = Профильдер command-line = Командалық жол @@ -69,7 +69,7 @@ next-tab = Келесі бет previous-tab = Алдыңғы бет split-horizontal = Горизонталды бөлу split-vertical = Вертикалды бөлу -pane-toggle-maximize = Панельді үлкейту немесе қалпына келтіру +pane-toggle-maximize = Толық экран режимін ауыстыру menu-color-schemes = Түс схемалары... menu-about = COSMIC терминалы туралы... menu-password-manager = Парольдер... @@ -110,6 +110,3 @@ copy-link = Сілтемені көшіру tab-new-inherit-working-directory = Жаңа беттерде және терезелерде ағымдағы буманы қолдану tab-new-inherit-working-directory-description = Жаңа беттерді және терезелерді белсенді беттің жұмыс бумасында ашу show-pane-borders = Панель жақтауларын көрсету -window-header = Терезе тақырыптамасы -move-tab-left = Бетті солға жылжыту -move-tab-right = Бетті оңға жылжыту diff --git a/i18n/kmr/cosmic_term.ftl b/i18n/kmr/cosmic_term.ftl index 1c764c6..8cfa2dc 100644 --- a/i18n/kmr/cosmic_term.ftl +++ b/i18n/kmr/cosmic_term.ftl @@ -27,13 +27,13 @@ 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 dark = Tarî hold = Ragire -match-desktop = Bi sermaseyê re guncav bike +match-desktop = Bi sermaseyê re li hev bîne find-previous = Yê paş bibîne cosmic-terminal = Termînalê COSMIC find-placeholder = Bibîne... @@ -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î? @@ -110,6 +110,3 @@ toggle-fullscreen = Dîmendera tijî biguhêrîne type-to-search = Ji bo lêgerînê binivîse... copy-link = Girêdanê jê bigire show-pane-borders = Sînorên kilîtdankê nîşan bide -window-header = Sernavê çarçoveyê -move-tab-left = Rûgerê bilivîne çepê -move-tab-right = Rûgerê bilivîne rastê diff --git a/i18n/oc/cosmic_term.ftl b/i18n/oc/cosmic_term.ftl index 50030da..0f74e05 100644 --- a/i18n/oc/cosmic_term.ftl +++ b/i18n/oc/cosmic_term.ftl @@ -1,14 +1,7 @@ -settings = Configuracion +settings = Paramètres appearance = Aparéncia theme = Tèma match-desktop = Assortir al burèu -dark = Escur +dark = Fosc 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 3b1ea6d..6af669e 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 środowiska COSMIC +comment = Emulator terminala dla pulpitu 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 = Wyszukaj… +find-placeholder = Szukaj… find-previous = Znajdź poprzedni find-next = Znajdź następny @@ -96,7 +96,7 @@ edit = Edytuj copy = Kopiuj paste = Wklej select-all = Zaznacz wszystko -find = Wyszukaj +find = Szukaj clear-scrollback = Wyczyść przewijanie ## View @@ -109,7 +109,7 @@ next-tab = Następna karta previous-tab = Poprzednia karta split-horizontal = Podziel w poziomie split-vertical = Podziel w pionie -pane-toggle-maximize = Maksymalizuj lub przywróć panel +pane-toggle-maximize = Przełącznik maksymalizacji menu-color-schemes = Schemat kolorów... menu-settings = Ustawienia… menu-about = O Terminalu COSMIC... @@ -150,4 +150,3 @@ copy-link = Skopiuj Odnośnik tab-new-inherit-working-directory = Nowe karty i okna użyją obecnego katalogu tab-new-inherit-working-directory-description = Otwieraj nowe karty i okna w katalogu roboczym aktywnej karty show-pane-borders = Pokaż obramowania paneli -window-header = Nagłówek okna diff --git a/i18n/pt-BR/cosmic_term.ftl b/i18n/pt-BR/cosmic_term.ftl index 25df23c..98a7f87 100644 --- a/i18n/pt-BR/cosmic_term.ftl +++ b/i18n/pt-BR/cosmic_term.ftl @@ -70,7 +70,7 @@ focus-follow-mouse = Foco de digitação segue o mouse ### Advanced advanced = Avançado -show-headerbar = Mostrar cabeçalho +show-headerbar = Mostrar a barra de título show-header-description = Mostrar o cabeçalho ao clicar no menu com o botão direito do mouse # Find find-placeholder = Localizar... @@ -109,7 +109,7 @@ next-tab = Próxima aba previous-tab = Aba anterior split-horizontal = Dividir horizontalmente split-vertical = Dividir verticalmente -pane-toggle-maximize = Maximizar ou restaurar o quadro +pane-toggle-maximize = Alternar maximização menu-color-schemes = Esquemas de cores... menu-settings = Configurações... menu-about = Sobre o Terminal... @@ -150,6 +150,3 @@ copy-link = Copiar link tab-new-inherit-working-directory = Novas abas e janelas usam o diretório atual tab-new-inherit-working-directory-description = Abrir novas abas e janelas no diretório de trabalho da aba ativa show-pane-borders = Mostrar bordas do quadro -window-header = Cabeçalho da janela -move-tab-left = Mover a aba para a esquerda -move-tab-right = Mover a aba para a direita diff --git a/i18n/ru/cosmic_term.ftl b/i18n/ru/cosmic_term.ftl index 7fcb36e..c168100 100644 --- a/i18n/ru/cosmic_term.ftl +++ b/i18n/ru/cosmic_term.ftl @@ -106,7 +106,7 @@ next-tab = Следующая вкладка previous-tab = Предыдущая вкладка split-horizontal = Разделение по горизонтали split-vertical = Разделение по вертикали -pane-toggle-maximize = Развернуть/восстановить область +pane-toggle-maximize = Переключить на весь экран menu-color-schemes = Цветовые схемы... menu-settings = Параметры... menu-about = О Терминале COSMIC... @@ -143,7 +143,4 @@ type-to-search = Введите для поиска... copy-link = Копировать ссылку tab-new-inherit-working-directory = Текущий каталог в новых вкладках и окнах tab-new-inherit-working-directory-description = Открывать новые вкладки и окна в рабочем каталоге активной вкладки -show-pane-borders = Показывать границы областей -window-header = Заголовок окна -move-tab-left = Перемещение вкладки налево -move-tab-right = Перемещение вкладки направо +show-pane-borders = Показывать границы панелей diff --git a/i18n/sv-SE/cosmic_term.ftl b/i18n/sv-SE/cosmic_term.ftl index e8e2d69..8167a39 100644 --- a/i18n/sv-SE/cosmic_term.ftl +++ b/i18n/sv-SE/cosmic_term.ftl @@ -110,7 +110,7 @@ next-tab = Nästa flik previous-tab = Föregående flik split-horizontal = Dela horisontellt split-vertical = Dela vertikalt -pane-toggle-maximize = Maximera eller återställ fält +pane-toggle-maximize = Växla maximerad clear-scrollback = Töm tillbakarullning menu-color-schemes = Färgscheman… menu-settings = Inställningar... @@ -154,6 +154,3 @@ copy-link = Kopiera länk tab-new-inherit-working-directory-description = Öppna nya flikar och fönster i den aktiva flikens arbetskatalog tab-new-inherit-working-directory = Nya flikar och fönster använder aktuell katalog show-pane-borders = Visa ram runt fält -window-header = Fönstertitel -move-tab-left = Flytta flik vänster -move-tab-right = Flytta flik höger diff --git a/i18n/th/cosmic_term.ftl b/i18n/th/cosmic_term.ftl index f95e682..32ec77d 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,8 +109,3 @@ 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/uk/cosmic_term.ftl b/i18n/uk/cosmic_term.ftl index b495cc9..753eda5 100644 --- a/i18n/uk/cosmic_term.ftl +++ b/i18n/uk/cosmic_term.ftl @@ -38,7 +38,7 @@ settings = Налаштування appearance = Вигляд theme = Тема -match-desktop = Підігнати під стільницю +match-desktop = Системна dark = Темна light = Світла syntax-dark = Темна колірна схема @@ -150,6 +150,3 @@ copy-link = Копіювати ланку tab-new-inherit-working-directory = Нові вкладки та вікна відкривати в поточному каталозі tab-new-inherit-working-directory-description = Відкривати нові вкладки та вікна в робочому каталозі активної вкладки show-pane-borders = Показувати межі панелей -window-header = Заголовок вікна -move-tab-left = Перемістити ліворуч -move-tab-right = Перемістити праворуч diff --git a/i18n/zh-CN/cosmic_term.ftl b/i18n/zh-CN/cosmic_term.ftl index 8a8116b..d06d5d5 100644 --- a/i18n/zh-CN/cosmic_term.ftl +++ b/i18n/zh-CN/cosmic_term.ftl @@ -105,7 +105,7 @@ next-tab = 下一个标签 previous-tab = 上一个标签 split-horizontal = 水平分割 split-vertical = 垂直分割 -pane-toggle-maximize = 将窗格最大化或还原 +pane-toggle-maximize = 切换最大化 menu-color-schemes = 配色方案… menu-settings = 设置… menu-about = 关于 COSMIC 终端… @@ -150,6 +150,3 @@ copy-link = 复制链接 tab-new-inherit-working-directory = 新标签和窗口使用当前目录 tab-new-inherit-working-directory-description = 在活动标签的工作目录中打开新标签和窗口 show-pane-borders = 显示窗格边框 -window-header = 窗口标题栏 -move-tab-left = 将标签向左移动 -move-tab-right = 将标签向右移动 diff --git a/i18n/zh-TW/cosmic_term.ftl b/i18n/zh-TW/cosmic_term.ftl index ecae885..3fa61a6 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 = 匯入 @@ -104,7 +104,7 @@ next-tab = 下個分頁 previous-tab = 上個分頁 split-horizontal = 水平分割 split-vertical = 垂直分割 -pane-toggle-maximize = 將窗格最大化或還原 +pane-toggle-maximize = 切換最大化 menu-color-schemes = 配色方案... menu-settings = 設定... menu-about = 關於 COSMIC 終端機… @@ -150,6 +150,3 @@ comment = COSMIC 桌面終端機模擬器 tab-new-inherit-working-directory = 新分頁和視窗使用目前目錄 tab-new-inherit-working-directory-description = 在作用中分頁的工作目錄開啟新分頁和視窗 show-pane-borders = 顯示窗格邊框 -window-header = 視窗標題列 -move-tab-left = 將分頁向左移動 -move-tab-right = 將分頁向右移動 diff --git a/src/config.rs b/src/config.rs index 2137165..caedf4d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -232,33 +232,17 @@ 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, 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, } -/// 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 { @@ -269,7 +253,6 @@ 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, @@ -279,7 +262,6 @@ 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, @@ -361,12 +343,6 @@ 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 } @@ -428,22 +404,3 @@ 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/desktop_notify.rs b/src/desktop_notify.rs deleted file mode 100644 index 4ad9821..0000000 --- a/src/desktop_notify.rs +++ /dev/null @@ -1,185 +0,0 @@ -// 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/kitty_keyboard.rs b/src/kitty_keyboard.rs deleted file mode 100644 index df24628..0000000 --- a/src/kitty_keyboard.rs +++ /dev/null @@ -1,697 +0,0 @@ -// 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[ 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"), 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, } @@ -314,9 +297,6 @@ fn main() -> 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 @@ -391,7 +371,6 @@ pub enum Action { LayoutLoad, LayoutSave, Monitor(MonitorKind), - ToggleReadOnly, PaneFocusDown, PaneFocusLeft, PaneFocusRight, @@ -425,8 +404,6 @@ pub enum Action { TabNext, TabPrev, TabRename, - TabMoveLeft, - TabMoveRight, ToggleFullscreen, WindowClose, WindowNew, @@ -453,7 +430,6 @@ 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), @@ -487,8 +463,6 @@ impl Action { Self::TabNext => Message::TabNext, Self::TabPrev => Message::TabPrev, Self::TabRename => Message::TabRenameOpen(entity_opt), - Self::TabMoveLeft => Message::TabMoveLeft, - Self::TabMoveRight => Message::TabMoveRight, Self::ToggleFullscreen => Message::ToggleFullscreen, Self::WindowClose => Message::WindowClose, Self::WindowNew => Message::WindowNew, @@ -563,7 +537,6 @@ pub enum Message { ShortcutSearch(String), MonitorTick, MonitorToggle(MonitorKind, Option), - ReadOnlyToggle(Option), MouseEnter(pane_grid::Pane), Opacity(u8), PaneClicked(pane_grid::Pane), @@ -593,19 +566,16 @@ pub enum Message { ReorderTab(Pane, ReorderEvent), SaveOutput(Option), SaveOutputResult(pane_grid::Pane, segmented_button::Entity, DialogResult), - Surface(surface::Action), + Surface(surface::Action), SelectAll(Option), ShowAdvancedFontSettings(bool), ShowHeaderBar(bool), SshConnect(usize), ShowPaneBorders(bool), - UnfocusedPaneDim(u8), SyntaxTheme(ColorSchemeKind, usize), SystemThemeChange, TabNewInheritWorkingDirectory(bool), - CopyOnSelectClipboard(bool), - SelectionDone(pane_grid::Pane, segmented_button::Entity), TabActivate(segmented_button::Entity), TabActivateJump(usize), TabClose(Option), @@ -621,12 +591,8 @@ pub enum Message { TabRenameCommit, TabRenameCancel, TabRenameResetToDefault, - TabMoveLeft, - TabMoveRight, TermEvent(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), + TermEventTx(mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, TermEvent)>), ToggleFullscreen, ToggleContextPage(ContextPage), UpdateDefaultProfile((bool, ProfileId)), @@ -638,6 +604,7 @@ pub enum Message { ZoomIn, ZoomOut, ZoomReset, + ContextMenuPopupClosed(window::Id), } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -692,9 +659,7 @@ pub struct App { find_search_id: widget::Id, find_search_value: String, term_event_tx_opt: - Option>, - notify_tx_opt: Option>, - window_focused: bool, + Option>, startup_options: Option, startup_profile_id: Option, term_config: term::Config, @@ -717,56 +682,19 @@ 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, } 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, @@ -1742,15 +1670,6 @@ 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() @@ -1767,14 +1686,6 @@ 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![ @@ -1829,22 +1740,6 @@ 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) { @@ -2104,7 +1999,6 @@ impl App { log::warn!("tried to create new tab before having event channel"); } } - self.sync_terminal_focus(); self.update_title(Some(pane)) } } @@ -2254,7 +2148,7 @@ impl Application for App { .comments(fl!("comment")) .license("GPL-3.0-only") .license_url("https://spdx.org/licenses/GPL-3.0-only") - .developers([("System76", "info@system76.com")]) + .developers([("Jeremy Soller", "jeremy@system76.com")]) .links([ (fl!("repository"), "https://github.com/pop-os/cosmic-term"), ( @@ -2300,8 +2194,6 @@ 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, @@ -2321,6 +2213,7 @@ 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(), }; @@ -3070,20 +2963,6 @@ 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()); @@ -3420,24 +3299,6 @@ 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, @@ -3449,12 +3310,6 @@ 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); @@ -3522,7 +3377,6 @@ 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) => { @@ -3576,11 +3430,19 @@ impl Application for App { } } - self.sync_terminal_focus(); 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) @@ -3589,8 +3451,11 @@ impl Application for App { //Some actions need the menu_state, //so only clear the position for them. match action { - // these read the link from the menu state and clear it themselves - Action::LaunchUrlByMenu | Action::CopyUrlByMenu => {} + Action::LaunchUrlByMenu | Action::CopyUrlByMenu => { + if let Some(context_menu) = terminal.context_menu.as_mut() { + context_menu.position = None; + } + } _ => { terminal.context_menu = None; } @@ -3600,29 +3465,94 @@ 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(); - if terminal.context_menu.take().is_some() { - terminal.active_regex_match = None; - terminal.needs_update = true; - } + terminal.context_menu = 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); + 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), + ))); + } + } } self.pane_model.set_focus(pane); } + + return cosmic::Task::batch(tasks); } Message::TabNew => { // The profile from `--profile` only applies to the first tab @@ -3743,43 +3673,10 @@ impl Application for App { } self.pane_model.update_terminal_focus(); } - Message::TabMoveLeft => { - if let Some(tab_model) = self.pane_model.active_mut() { - let pos: usize = tab_model - .position(tab_model.active()) - .expect("at least one tab is always open") - .into(); - if pos > 0 { - let dragged = tab_model.iter().nth(pos).expect("tab unavailable"); - let target = tab_model.iter().nth(pos - 1).expect("previous tab missing"); - tab_model.reorder(dragged, target, InsertPosition::Before); - } - } - } - Message::TabMoveRight => { - if let Some(tab_model) = self.pane_model.active_mut() { - let len = tab_model.iter().count(); - let pos: usize = tab_model - .position(tab_model.active()) - .expect("at least one tab is always open") - .into(); - if pos < len - 1 && len > 1 { - let dragged = tab_model.iter().nth(pos).expect("tab unavailable"); - let target = tab_model.iter().nth(pos + 1).expect("next tab missing"); - tab_model.reorder(dragged, target, InsertPosition::After); - } - } - } Message::TermEvent(pane, entity, event) => { match event { TermEvent::Bell => { - // 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); - } + //TODO: audible or visible bell options? } TermEvent::ClipboardLoad(kind, callback) => { match kind { @@ -3813,7 +3710,7 @@ impl Application for App { let terminal = terminal.lock().unwrap(); let rgb = terminal.effective_color(index); let text = f(rgb); - terminal.respond(text.into_bytes()); + terminal.input_no_scroll(text.into_bytes()); } } TermEvent::CursorBlinkingChange => { @@ -3827,7 +3724,7 @@ impl Application for App { && let Some(terminal) = tab_model.data::>(entity) { let terminal = terminal.lock().unwrap(); - terminal.respond(text.into_bytes()); + terminal.input_no_scroll(text.into_bytes()); } } TermEvent::ResetTitle => { @@ -3852,7 +3749,7 @@ impl Application for App { { let terminal = terminal.lock().unwrap(); let text = f(terminal.size().into()); - terminal.respond(text.into_bytes()); + terminal.input_no_scroll(text.into_bytes()); } } TermEvent::Title(title) => { @@ -3939,76 +3836,6 @@ 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; @@ -4099,14 +3926,12 @@ 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 => { @@ -4119,8 +3944,26 @@ 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::Surface(a)); + return cosmic::task::message(cosmic::Action::Cosmic( + cosmic::app::Action::Surface(a), + )); } Message::ReorderTab( pane, @@ -4255,7 +4098,6 @@ impl Application for App { &self.config, &self.key_binds, self.active_terminal_monitors(), - self.active_terminal_read_only(), &self.ssh_hosts, )] } @@ -4270,7 +4112,32 @@ 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(), + self.terminal_monitors(pane, entity), + ), + autosize_id.clone(), + ) + .into(); + } match &self.dialog_opt { Some(dialog) => dialog.view(window_id), None => widget::text("Unknown window ID").into(), @@ -4359,51 +4226,51 @@ 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)); + // 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); } - // [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); - } + let use_wayland_popup = { + #[cfg(feature = "wayland")] + { + is_wayland() + } + #[cfg(not(feature = "wayland"))] + { + false + } + }; - // 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 mut context_menu = widget::context_menu( - terminal_box, - context_link.map(|link| { - menu::context_menu( - &self.config, - &self.key_binds, - entity, - link, - self.terminal_monitors(pane, entity), - self.terminal_read_only(pane, entity), - ) - }), - ) - .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); + 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(), + self.terminal_monitors(popup_pane, popup_entity), + )) + .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); } //Only draw find in the currently focused pane @@ -4542,18 +4409,16 @@ impl Application for App { output.send(Message::TermEventTx(event_tx)).await.unwrap(); while let Some((pane, entity, event)) = event_rx.recv().await { - 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(); + output + .send(Message::TermEvent(pane, entity, event)) + .await + .unwrap(); } panic!("terminal event channel closed"); }, ) }), - desktop_notify::subscription().map(Message::DesktopNotify), cosmic_config::config_subscription( TypeId::of::(), Self::APP_ID.into(), @@ -4586,6 +4451,14 @@ 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 3050b91..e75046b 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,15 +1,17 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::widget::menu::action::MenuAction; +use cosmic::iced::Point; 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}, + iced::{Background, Length, advanced::widget::text::Style as TextStyle}, + theme, widget::{ - self, + self, divider, menu::{ItemHeight, ItemWidth}, responsive_menu_bar, segmented_button, }, @@ -21,94 +23,147 @@ use crate::{Action, ColorSchemeId, ColorSchemeKind, Config, Message, fl, termina 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, } -/// 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( +pub fn context_menu<'a>( config: &Config, key_binds: &HashMap, 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)); - let check = |label: String, value: bool, action: Action| { - MenuItem::CheckBox(label, None, value, TabAction(entity, action)) +) -> 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() + } + } + + 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 mut items = vec![ - item(fl!("new-tab"), Action::TabNew), - item(fl!("rename-tab"), Action::TabRename), - MenuItem::Divider, - item(fl!("copy"), Action::Copy), - item(fl!("paste"), Action::Paste), - item(fl!("select-all"), Action::SelectAll), - MenuItem::Divider, - item(fl!("clear-scrollback"), Action::ClearScrollback), - item(fl!("save-output"), Action::SaveOutput), - MenuItem::Divider, - check( + 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(menu_item(fl!("save-output"), Action::SaveOutput)), + Element::from(divider::horizontal::light()), + Element::from(menu_checkbox( fl!("monitor-activity"), monitors.0, Action::Monitor(MonitorKind::Activity), - ), - check( + )), + Element::from(menu_checkbox( fl!("monitor-silence"), monitors.1, Action::Monitor(MonitorKind::Silence), - ), - check( + )), + Element::from(menu_checkbox( fl!("monitor-process-finished"), 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), - item(fl!("pane-toggle-maximize"), Action::PaneToggleMaximized), - MenuItem::Divider, - MenuItem::CheckBox( - fl!("window-header"), - None, - config.show_headerbar, - TabAction(entity, Action::ShowHeaderBar(!config.show_headerbar)), - ), - MenuItem::Divider, + )), + 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!("rename-tab"), Action::TabRename)), + Element::from(menu_item(fl!("menu-settings"), Action::Settings)), + Element::from(menu_item(fl!("menu-about"), Action::About)), ]; #[cfg(feature = "password_manager")] - items.push(item(fl!("menu-password-manager"), Action::PasswordManager)); - items.push(item(fl!("menu-settings"), Action::Settings)); - items.push(item(fl!("menu-about"), Action::About)); - // If we have a link, prepend the link items - if link.is_some() { - items.insert(0, item(fl!("open-link"), Action::LaunchUrlByMenu)); - items.insert(1, item(fl!("copy-link"), Action::CopyUrlByMenu)); - items.insert(2, MenuItem::Divider); + { + rows.push(Element::from(menu_item( + fl!("menu-password-manager"), + Action::PasswordManager, + ))); } + rows.push(Element::from(menu_checkbox( + fl!("show-headerbar"), + config.show_headerbar, + Action::ShowHeaderBar(!config.show_headerbar), + ))); - let key_binds: HashMap = key_binds - .iter() - .map(|(key_bind, action)| (key_bind.clone(), TabAction(entity, *action))) - .collect(); - widget::menu::items(&key_binds, items) + //If we have a link + //prepend the Open Link item + 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())); + } + 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() } pub fn color_scheme_menu<'a>( @@ -165,7 +220,6 @@ 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()); @@ -237,9 +291,6 @@ pub fn menu_bar<'a>( MenuItem::Button(fl!("next-tab"), None, Action::TabNext), MenuItem::Button(fl!("previous-tab"), None, Action::TabPrev), MenuItem::Divider, - MenuItem::Button(fl!("move-tab-left"), None, Action::TabMoveLeft), - MenuItem::Button(fl!("move-tab-right"), None, Action::TabMoveRight), - MenuItem::Divider, MenuItem::Button( fl!("split-horizontal"), None, @@ -270,12 +321,6 @@ 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/osc_tap.rs b/src/osc_tap.rs deleted file mode 100644 index 641fab1..0000000 --- a/src/osc_tap.rs +++ /dev/null @@ -1,407 +0,0 @@ -// 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/shortcuts.rs b/src/shortcuts.rs index 7b2db24..a04a103 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -89,10 +89,7 @@ pub enum KeyBindAction { TabNext, TabPrev, TabRename, - TabMoveLeft, - TabMoveRight, ToggleFullscreen, - ToggleReadOnly, WindowClose, WindowNew, ZoomIn, @@ -134,10 +131,7 @@ impl KeyBindAction { Self::TabNext => Some(Action::TabNext), Self::TabPrev => Some(Action::TabPrev), Self::TabRename => Some(Action::TabRename), - Self::TabMoveLeft => Some(Action::TabMoveLeft), - Self::TabMoveRight => Some(Action::TabMoveRight), 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), @@ -300,10 +294,7 @@ pub fn action_label(action: KeyBindAction) -> String { KeyBindAction::TabNext => fl!("next-tab"), KeyBindAction::TabPrev => fl!("previous-tab"), KeyBindAction::TabRename => fl!("rename-tab"), - KeyBindAction::TabMoveLeft => fl!("move-tab-left"), - KeyBindAction::TabMoveRight => fl!("move-tab-right"), 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"), @@ -338,8 +329,6 @@ pub fn shortcut_groups() -> Vec { KeyBindAction::TabRename, KeyBindAction::TabNext, KeyBindAction::TabPrev, - KeyBindAction::TabMoveLeft, - KeyBindAction::TabMoveRight, KeyBindAction::TabActivate0, KeyBindAction::TabActivate1, KeyBindAction::TabActivate2, @@ -380,11 +369,7 @@ pub fn shortcut_groups() -> Vec { KeyBindAction::ZoomReset, ], }); - let mut other_actions = vec![ - KeyBindAction::ClearScrollback, - KeyBindAction::SaveOutput, - KeyBindAction::ToggleReadOnly, - ]; + let mut other_actions = vec![KeyBindAction::ClearScrollback, KeyBindAction::SaveOutput]; #[cfg(feature = "password_manager")] other_actions.push(KeyBindAction::PasswordManager); groups.push(ShortcutGroup { @@ -494,10 +479,6 @@ fn fallback_shortcuts() -> Shortcuts { bind!([Ctrl], "Tab", TabNext); bind!([Ctrl, Shift], "Tab", TabPrev); - // Ctrl+Shift+PageUp/Down move tabs left and right - bind!([Ctrl, Shift], "PageUp", TabMoveLeft); - bind!([Ctrl, Shift], "PageDown", TabMoveRight); - // Ctrl+Shift+# activates tabs by index bind!([Ctrl, Shift], "1", TabActivate0); bind!([Ctrl, Shift], "2", TabActivate1); diff --git a/src/terminal.rs b/src/terminal.rs index 213e5fd..e56f3dd 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -27,15 +27,13 @@ use indexmap::IndexSet; use std::{ borrow::Cow, collections::HashMap, - fs, - hash::{DefaultHasher, Hash, Hasher}, - io, mem, + fs, io, mem, path::PathBuf, sync::{ Arc, Mutex, Weak, atomic::{AtomicU32, Ordering}, }, - time::{Duration, Instant}, + time::Instant, }; use tokio::sync::mpsc; @@ -45,7 +43,6 @@ 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. @@ -68,28 +65,6 @@ 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://)\ @@ -134,13 +109,13 @@ impl From for WindowSize { pub struct EventProxy( pane_grid::Pane, segmented_button::Entity, - mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, PtyEvent)>, + mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, ); impl EventListener for EventProxy { fn send_event(&self, event: Event) { //TODO: handle error - let _ = self.2.send((self.0, self.1, PtyEvent::Term(event))); + let _ = self.2.send((self.0, self.1, event)); } } @@ -221,63 +196,33 @@ impl TerminalPaneGrid { self.focus } - 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 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 unfocus_all_terminals(&self) { for tab_model in self.panes.panes.values() { - 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(); - } - } + 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(); } } } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, PartialEq, Eq, Hash, Clone)] pub struct Metadata { pub bg: cosmic_text::Color, pub underline_color: cosmic_text::Color, pub flags: Flags, - /// Remplissage natif (élément de bloc Unicode) — voir [`BlockFill`]. - pub block: Option, - /// Couleur du remplissage natif. Hors bloc, sans effet ; participant à - /// l'égalité pour que deux blocs adjacents de couleurs différentes ne - /// fusionnent pas en un seul quad. - pub block_color: cosmic_text::Color, } impl Metadata { @@ -287,8 +232,6 @@ impl Metadata { bg, underline_color, flags, - block: None, - block_color: underline_color, } } @@ -302,73 +245,6 @@ impl Metadata { fn with_flags(self, flags: Flags) -> Self { Self { flags, ..self } } - - fn with_block(mut self, block: Option, color: cosmic_text::Color) -> Self { - self.block = block; - self.block_color = color; - self - } -} - -/// Élément de bloc Unicode (U+2580–U+259F) rendu nativement. -/// -/// Ces caractères ne passent PAS par le glyphe de la police : le `█` d'une -/// police couvre à peine l'em (≈ 1× la taille de police) alors que la cellule -/// fait `line_height` (≈ 1,4×) — d'où des trous entre les rangées et un rendu -/// crénelé. À la place, chaque bloc est remplacé par une espace (le glyphe -/// disparaît) et peint en quad GPU couvrant exactement la fraction voulue de -/// la cellule : bords alignés sur la grille, jointif par construction, net à -/// toute échelle. C'est l'approche de kitty/WezTerm. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum BlockFill { - /// Un ou deux rectangles en huitièmes de cellule : `(x0, x1, y0, y1)`, - /// abscisse et ordonnée depuis le coin haut-gauche. Un rectangle vide - /// (`x0 >= x1` ou `y0 >= y1`) est ignoré au tracé — deux rectangles - /// suffisent pour toute la famille des quadrants. - Rects([(u8, u8, u8, u8); 2]), - /// Trame (`░▒▓`) : rectangle plein, alpha en quarts (1–3). - Shade(u8), -} - -/// Mappe un caractère vers son remplissage natif, s'il est un élément de bloc. -pub fn block_fill(c: char) -> Option { - use BlockFill::{Rects, Shade}; - const NONE: (u8, u8, u8, u8) = (8, 8, 8, 8); - match c { - '▀' => Some(Rects([(0, 8, 0, 4), NONE])), - '▁' => Some(Rects([(0, 8, 7, 8), NONE])), - '▂' => Some(Rects([(0, 8, 6, 8), NONE])), - '▃' => Some(Rects([(0, 8, 5, 8), NONE])), - '▄' => Some(Rects([(0, 8, 4, 8), NONE])), - '▅' => Some(Rects([(0, 8, 3, 8), NONE])), - '▆' => Some(Rects([(0, 8, 2, 8), NONE])), - '▇' => Some(Rects([(0, 8, 1, 8), NONE])), - '█' => Some(Rects([(0, 8, 0, 8), NONE])), - '▉' => Some(Rects([(0, 7, 0, 8), NONE])), - '▊' => Some(Rects([(0, 6, 0, 8), NONE])), - '▋' => Some(Rects([(0, 5, 0, 8), NONE])), - '▌' => Some(Rects([(0, 4, 0, 8), NONE])), - '▍' => Some(Rects([(0, 3, 0, 8), NONE])), - '▎' => Some(Rects([(0, 2, 0, 8), NONE])), - '▏' => Some(Rects([(0, 1, 0, 8), NONE])), - '▐' => Some(Rects([(4, 8, 0, 8), NONE])), - '░' => Some(Shade(1)), - '▒' => Some(Shade(2)), - '▓' => Some(Shade(3)), - '▔' => Some(Rects([(0, 8, 0, 1), NONE])), - '▕' => Some(Rects([(7, 8, 0, 8), NONE])), - '▖' => Some(Rects([(0, 4, 4, 8), NONE])), - '▗' => Some(Rects([(4, 8, 4, 8), NONE])), - '▘' => Some(Rects([(0, 4, 0, 4), NONE])), - '▝' => Some(Rects([(4, 8, 0, 4), NONE])), - '▙' => Some(Rects([(0, 4, 0, 8), (4, 8, 4, 8)])), - '▚' => Some(Rects([(0, 4, 0, 4), (4, 8, 4, 8)])), - '▛' => Some(Rects([(0, 8, 0, 4), (0, 4, 4, 8)])), - '▜' => Some(Rects([(0, 8, 0, 4), (4, 8, 4, 8)])), - '▞' => Some(Rects([(4, 8, 0, 4), (0, 4, 4, 8)])), - '▟' => Some(Rects([(0, 8, 4, 8), (4, 8, 0, 4)])), - _ => None, - } } pub struct Terminal { @@ -380,11 +256,6 @@ 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)>, - /// [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, @@ -415,7 +286,7 @@ impl Terminal { pub fn new( pane: pane_grid::Pane, entity: segmented_button::Entity, - event_tx: mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, PtyEvent)>, + event_tx: mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, config: Config, options: Options, app_config: &AppConfig, @@ -467,8 +338,6 @@ 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, @@ -483,15 +352,6 @@ 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()); @@ -515,9 +375,6 @@ impl Terminal { monitor_alert: None, monitor_last_output: Instant::now(), monitor_job_running: false, - attention: None, - notify_last: None, - read_only: false, mouse_reporter: Default::default(), needs_update: true, notifier, @@ -581,25 +438,6 @@ 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; @@ -611,7 +449,7 @@ impl Terminal { const FOCUS_OUT: &[u8] = b"\x1b[O"; let input = if is_focused { FOCUS_IN } else { FOCUS_OUT }; - self.respond(input); + self.input_no_scroll(input); } } } @@ -624,18 +462,7 @@ 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); } @@ -653,10 +480,6 @@ 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); } @@ -1082,14 +905,9 @@ impl Terminal { } let start = text.len(); - // Tab skip/stop is handled by alacritty_terminal. - // Les éléments de bloc ne deviennent pas des glyphes : la - // police ne couvre pas la cellule (trous d'interligne) ; - // ils sont peints en quads natifs au tracé, via Metadata. - let block = block_fill(indexed.cell.c); + // Tab skip/stop is handled by alacritty_terminal text.push(match indexed.cell.c { '\t' => ' ', - c if block.is_some() => ' ', c => c, }); if let Some(zerowidth) = indexed.cell.zerowidth() { @@ -1207,7 +1025,6 @@ impl Terminal { } let metadata = Metadata::new(bg, fg) - .with_block(block, fg) .with_flags(flags) .with_underline_color(underline_color); let (meta_idx, _) = self.metadata_set.insert_full(metadata); @@ -1318,11 +1135,8 @@ impl Terminal { y, ); - // Saisie de l'utilisateur : rien en lecture seule - if !self.read_only { - for code in codes { - self.notifier.notify(code); - } + for code in codes { + self.notifier.notify(code); } } else { self.scroll_as_arrows(delta); @@ -1530,108 +1344,3 @@ impl Drop for Terminal { } } } - -#[cfg(test)] -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. - for code in 0x2580..=0x259F { - let c = char::from_u32(code).unwrap(); - assert!( - block_fill(c).is_some(), - "{c} (U+{code:04X}) sans remplissage" - ); - } - // Hors de la plage : filets, espaces, lettres — pas de remplissage. - for c in [' ', '─', '│', 'M', '●', '\u{25A0}'] { - assert!( - block_fill(c).is_none(), - "{c} ne doit pas être un bloc natif" - ); - } - } - - #[test] - fn block_fill_geometry_toujours_valide() { - // Fractions croissantes, bornées à la cellule — sinon le quad - // déborderait sur la cellule voisine ou serait rejeté au tracé. - for c in (char::from_u32(0x2580).unwrap()..=char::from_u32(0x259F).unwrap()) - .chain(['░', '▒', '▓'].iter().copied()) - { - let Some(fill) = block_fill(c) else { continue }; - match fill { - BlockFill::Rects(rects) => { - for (x0, x1, y0, y1) in rects { - // Rectangle vide (sentinelle) ou borné à la cellule. - let empty = x0 >= x1 || y0 >= y1; - assert!( - empty || (x1 <= 8 && y1 <= 8), - "{c}: géométrie déborde la cellule" - ); - } - } - BlockFill::Shade(quarters) => { - assert!((1..=3).contains(&quarters), "{c}: alpha de trame invalide") - } - } - } - } -} diff --git a/src/terminal_box.rs b/src/terminal_box.rs index c43d440..64b9490 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -46,11 +46,7 @@ use std::{ time::{Duration, Instant}, }; -use crate::{ - Action, Terminal, TerminalScroll, kitty_keyboard, - menu::MenuState, - terminal::{BlockFill, Metadata}, -}; +use crate::{Action, Terminal, TerminalScroll, menu::MenuState, terminal::Metadata}; const AUTOSCROLL_INTERVAL: Duration = Duration::from_millis(100); @@ -116,14 +112,12 @@ pub struct TerminalBox<'a, Message> { show_headerbar: bool, pane_border_radius: Option, click_timing: Duration, - context_menu_open: bool, + context_menu: Option, 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_selection_done: Option Message + 'a>>, on_open_hyperlink: Option Message + 'a>>, on_window_focused: Option Message + 'a>>, on_window_unfocused: Option Message + 'a>>, @@ -145,14 +139,12 @@ where show_headerbar: true, pane_border_radius: None, click_timing: Duration::from_millis(500), - context_menu_open: false, + context_menu: None, on_context_menu: None, on_mouse_enter: None, opacity: None, - dim: None, mouse_inside_boundary: None, on_middle_click: None, - on_selection_done: None, key_binds, on_open_hyperlink: None, on_window_focused: None, @@ -192,8 +184,8 @@ where self } - pub fn context_menu_open(mut self, open: bool) -> Self { - self.context_menu_open = open; + pub fn context_menu(mut self, position: Point) -> Self { + self.context_menu = Some(position); self } @@ -210,14 +202,6 @@ 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 @@ -228,13 +212,6 @@ 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 @@ -272,7 +249,7 @@ where if !state.is_focused { return InputMethod::Disabled; } - if self.context_menu_open { + if self.context_menu.is_some() { return InputMethod::Disabled; } @@ -613,41 +590,6 @@ where ); } - // Éléments de bloc peints nativement : fractions de la - // cellule (ou de la course fusionnée, à géométrie - // séparable), bords calés sur la grille — zéro glyphe, - // zéro interligne. - if let Some(block) = metadata.block { - let span_w = self.end_x - self.start_x; - let mut color = cosmic_text_to_iced_color(metadata.block_color); - let rects = match block { - BlockFill::Rects(rects) => rects, - BlockFill::Shade(quarters) => { - color.a *= f32::from(quarters) / 4.0; - [(0, 8, 0, 8), (8, 8, 8, 8)] - } - }; - for (x0, x1, y0, y1) in rects { - if x0 >= x1 || y0 >= y1 { - continue; - } - let left = self.start_x + span_w * f32::from(x0) / 8.0; - let right = self.start_x + span_w * f32::from(x1) / 8.0; - let top = self.line_top + self.line_height * f32::from(y0) / 8.0; - let bottom = self.line_top + self.line_height * f32::from(y1) / 8.0; - renderer.fill_quad( - Quad { - bounds: Rectangle::new( - self.view_position + Vector::new(left.floor(), top), - Size::new(right.ceil() - left.floor(), bottom - top), - ), - ..Default::default() - }, - color, - ); - } - } - if !metadata.flags.is_empty() { let style_line_height = (self.glyph_font_size / 10.0).clamp(1.0, 16.0); @@ -934,32 +876,6 @@ 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); } @@ -984,11 +900,7 @@ where let buffer_size = terminal.with_buffer(|buffer| buffer.size()); let is_app_cursor = terminal.term.lock().mode().contains(TermMode::APP_CURSOR); - // [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(); + let is_mouse_mode = terminal.term.lock().mode().intersects(TermMode::MOUSE_MODE); match event { Event::Window(event) => match event { cosmic::iced::window::Event::Focused => { @@ -1028,101 +940,6 @@ 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, @@ -1238,15 +1055,7 @@ where shell.capture_event(); } Named::Enter => { - // [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()); + terminal.input_scroll(format!("{}{}", alt_prefix, "\x0D").into_bytes()); shell.capture_event(); } Named::Escape => { @@ -1544,11 +1353,11 @@ where } // Update context menu state if let Some(on_context_menu) = &self.on_context_menu { - match self.context_menu_open { - true => { + match self.context_menu { + Some(_) => { shell.publish(on_context_menu(None)); } - false => { + None => { if *button == Button::Right { let x = p.x - self.padding.left; let y = p.y - self.padding.top; @@ -1566,7 +1375,15 @@ where None, ); let link = get_hyperlink(&terminal, location); - shell.publish(on_context_menu(Some(MenuState { link }))); + 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, + }))); } } } @@ -1591,9 +1408,6 @@ 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;