diff --git a/Cargo.lock b/Cargo.lock index 197a5ad5c..6f2b9167c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -72,9 +72,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -87,44 +87,64 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "arboard" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "parking_lot", + "percent-encoding", + "windows-sys 0.59.0", + "wl-clipboard-rs", + "x11rb", +] [[package]] name = "arraydeque" @@ -167,7 +187,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 1.0.69", + "thiserror 1.0.68", "time", ] @@ -196,9 +216,9 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ "event-listener", "event-listener-strategy", @@ -208,9 +228,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.5.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -218,6 +238,55 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-io" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 0.38.44", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 0.38.44", + "tracing", +] + [[package]] name = "async-recursion" version = "1.1.1" @@ -229,28 +298,58 @@ dependencies = [ "syn", ] +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.44", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", @@ -275,9 +374,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bincode" @@ -296,9 +395,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block-buffer" @@ -318,11 +417,30 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -330,19 +448,25 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" -version = "1.10.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cairo-rs" -version = "0.20.12" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e3bd0f4e25afa9cabc157908d14eeef9067d6448c49414d17b3fb55f0eadd0" +checksum = "d7fa699e1d7ae691001a811dda5ef0e3e42e1d4119b26426352989df9e94e3e6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cairo-sys-rs", "glib", "libc", @@ -350,9 +474,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.20.10" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059cc746549898cbfd9a47754288e5a958756650ef4652bbb6c5f71a6bda4f8b" +checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" dependencies = [ "glib-sys", "libc", @@ -361,33 +485,33 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.10" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "cargo-platform" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4" +checksum = "122ec45a44b270afd1402f351b782c676b173e3c3fb28d86ff7ebfb4d86a4ee4" dependencies = [ "serde", ] [[package]] name = "cargo-util-schemas" -version = "0.2.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63d2780ac94487eb9f1fea7b0d56300abc9eb488800854ca217f102f5caccca" +checksum = "7dc1a6f7b5651af85774ae5a34b4e8be397d9cf4bc063b7e6dbd99a841837830" dependencies = [ "semver", "serde", "serde-untagged", "serde-value", - "thiserror 1.0.69", + "thiserror 2.0.17", "toml", "unicode-xid", "url", @@ -395,9 +519,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.20.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7835cfc6135093070e95eb2b53e5d9b5c403dc3a6be6040ee026270aa82502" +checksum = "0c3f56c207c76c07652489840ff98687dcf213de178ac0974660d6fefeaf5ec6" dependencies = [ "camino", "cargo-platform", @@ -405,7 +529,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -419,10 +543,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.30" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -442,9 +567,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0390889d58f934f01cd49736275b4c2da15bcfc328c78ff2349907e6cabf22" +checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c" dependencies = [ "smallvec", "target-lexicon", @@ -452,9 +577,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" @@ -474,9 +599,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.42" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -484,9 +609,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.42" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -496,9 +621,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", @@ -508,15 +633,24 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "clipboard-win" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -555,9 +689,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -575,7 +709,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "core-graphics-types", "foreign-types", @@ -588,20 +722,29 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.17" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "critical-section" version = "1.2.0" @@ -628,9 +771,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -692,15 +841,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -723,9 +872,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -742,6 +891,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.4", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -814,9 +973,9 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.12" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -824,9 +983,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.12" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", @@ -835,9 +994,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -845,48 +1004,55 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", "env_filter", - "jiff", + "humantime", "log", ] [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + [[package]] name = "event-listener" -version = "5.4.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -895,9 +1061,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ "event-listener", "pin-project-lite", @@ -905,15 +1071,44 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] [[package]] name = "ff" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", "subtle", @@ -935,6 +1130,28 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1021,9 +1238,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210" dependencies = [ "fastrand", "futures-core", @@ -1075,9 +1292,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd242894c084f4beed508a56952750bce3e96e85eb68fdc153637daa163e10c" +checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -1087,9 +1304,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b34f3b580c988bd217e9543a2de59823fafae369d1a055555e5f95a8b130b96" +checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" dependencies = [ "gio-sys", "glib-sys", @@ -1100,9 +1317,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850c9d9c1aecd1a3eb14fadc1cdb0ac0a2298037e116264c7473e1740a32d60" +checksum = "d3fb4af2d606b0ac4e81f982f0d064bcb71ca73859ce5f30475f7eb2e2be4bc3" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -1115,9 +1332,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f6eb95798e2b46f279cf59005daf297d5b69555428f185650d71974a910473a" +checksum = "3642625b384ad43c006871462e6c498488b503dbf219542591f4ddf0f5f2032b" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1132,16 +1349,16 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ "cc", "cfg-if", "libc", "log", "rustversion", - "windows", + "windows 0.58.0", ] [[package]] @@ -1155,15 +1372,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "gethostname" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +dependencies = [ + "rustix 1.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -1175,7 +1402,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", ] [[package]] @@ -1196,9 +1423,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.20.12" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e27e276e7b6b8d50f6376ee7769a71133e80d093bdc363bd0af71664228b831" +checksum = "d8569975884fdfdbed536b682448fbd8c70bafbd69cac2d45eb1a7a372702241" dependencies = [ "futures-channel", "futures-core", @@ -1213,24 +1440,24 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.20.10" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" +checksum = "217f464cad5946ae4369c355155e2d16b488c08920601083cb4891e352ae777b" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "git2" -version = "0.20.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "libc", "libgit2-sys", "log", @@ -1239,11 +1466,11 @@ dependencies = [ [[package]] name = "glib" -version = "0.20.12" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" +checksum = "358431b0e0eb15b9d02db52e1f19c805b953c5c168099deb3de88beab761768c" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "futures-channel", "futures-core", "futures-executor", @@ -1269,9 +1496,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.12" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8084af62f09475a3f529b1629c10c429d7600ee1398ae12dd3bf175d74e7145" +checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" dependencies = [ "heck", "proc-macro-crate", @@ -1282,9 +1509,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.20.10" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" +checksum = "8a5911863ab7ecd4a6f8d5976f12eeba076b23669c49b066d877e742544aa389" dependencies = [ "libc", "system-deps", @@ -1292,9 +1519,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" +checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" dependencies = [ "glib-sys", "libc", @@ -1303,9 +1530,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b86dfad7d14251c9acaf1de63bc8754b7e3b4e5b16777b6f5a748208fe9519b" +checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" dependencies = [ "glib", "graphene-sys", @@ -1314,9 +1541,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df583a85ba2d5e15e1797e40d666057b28bc2f60a67c9c24145e6db2cc3861ea" +checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" dependencies = [ "glib-sys", "libc", @@ -1337,9 +1564,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f5e72f931c8c9f65fbfc89fe0ddc7746f147f822f127a53a9854666ac1f855" +checksum = "3deb9ae5a7fb759b2405e248d52850d9ef733079b90af2d6b01638f5b9eeafe1" dependencies = [ "cairo-rs", "gdk4", @@ -1352,9 +1579,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755059de55fa6f85a46bde8caf03e2184c96bfda1f6206163c72fb0ea12436dc" +checksum = "2226662e97948f3f241c9a6c432cd95eeca662daf4a327e201458bb540ad9590" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -1368,9 +1595,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.9.7" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f274dd0102c21c47bbfa8ebcb92d0464fab794a22fad6c3f3d5f165139a326d6" +checksum = "d34465497f5a4c182c9c94a582a187db7d6af0863f28e87ccf4379f21f0e2a22" dependencies = [ "cairo-rs", "field-offset", @@ -1389,9 +1616,9 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.9.5" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed1786c4703dd196baf7e103525ce0cf579b3a63a0570fe653b7ee6bac33999" +checksum = "a7c518d5dd41c57385c7cd30af52e261820c897fc1144e558bb88c303d048ae2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1401,9 +1628,9 @@ dependencies = [ [[package]] name = "gtk4-sys" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41e03b01e54d77c310e1d98647d73f996d04b2f29b9121fe493ea525a7ec03d6" +checksum = "f11c7812e28542edb4d0495a2fde1f4588899e2accfcebaa80115f27dc7358a3" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1418,11 +1645,22 @@ dependencies = [ "system-deps", ] +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy 0.8.27", +] + [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1430,6 +1668,18 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1454,7 +1704,7 @@ dependencies = [ "once_cell", "rand 0.9.2", "ring", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tokio", "tracing", @@ -1477,7 +1727,7 @@ dependencies = [ "rand 0.9.2", "resolv-conf", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -1502,28 +1752,44 @@ dependencies = [ [[package]] name = "hostname" -version = "0.4.1" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "hostname" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ "cfg-if", "libc", - "windows-link", + "windows 0.52.0", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", - "log", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1537,22 +1803,21 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", @@ -1562,65 +1827,98 @@ dependencies = [ ] [[package]] -name = "icu_normalizer" -version = "2.0.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", + "icu_locid", + "icu_locid_transform_data", "icu_provider", - "smallvec", + "tinystr", "zerovec", ] [[package]] -name = "icu_normalizer_data" -version = "2.0.0" +name = "icu_locid_transform_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] -name = "icu_properties" -version = "2.0.1" +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", - "icu_locale_core", - "icu_properties_data", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", "icu_provider", - "potential_utf", - "zerotrie", + "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", - "icu_locale_core", + "icu_locid", + "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", - "zerotrie", "zerovec", ] +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" version = "1.0.3" @@ -1634,19 +1932,33 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", ] +[[package]] +name = "image" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "tiff", +] + [[package]] name = "indexmap" -version = "2.10.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", @@ -1654,9 +1966,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ "block-padding", "generic-array", @@ -1666,9 +1978,10 @@ dependencies = [ name = "input-capture" version = "0.3.0" dependencies = [ + "arboard", "ashpd", "async-trait", - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "core-graphics", @@ -1682,13 +1995,13 @@ dependencies = [ "once_cell", "reis", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "wayland-client", "wayland-protocols", "wayland-protocols-wlr", - "windows", + "windows 0.61.3", "x11", ] @@ -1696,9 +2009,10 @@ dependencies = [ name = "input-emulation" version = "0.3.0" dependencies = [ + "arboard", "ashpd", "async-trait", - "bitflags 2.9.1", + "bitflags 2.9.4", "core-graphics", "futures", "input-event", @@ -1706,13 +2020,13 @@ dependencies = [ "log", "once_cell", "reis", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "wayland-client", "wayland-protocols", "wayland-protocols-misc", "wayland-protocols-wlr", - "windows", + "windows 0.61.3", "x11", ] @@ -1725,16 +2039,16 @@ dependencies = [ "num_enum", "reis", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -1745,7 +2059,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.10", + "socket2 0.5.7", "widestring", "windows-sys 0.48.0", "winreg", @@ -1753,9 +2067,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_debug" @@ -1771,41 +2085,16 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jiff" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", -] - -[[package]] -name = "jiff-static" -version = "0.2.15" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "getrandom 0.3.3", "libc", ] @@ -1827,7 +2116,7 @@ checksum = "29541831d33940ea1c68a1b8980382c1a507c95a528a98c0e335b361b9726975" dependencies = [ "arraydeque", "arrayvec", - "bitflags 2.9.1", + "bitflags 2.9.4", "keycode_macro", ] @@ -1868,7 +2157,7 @@ dependencies = [ "sha2", "shadow-rs", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "toml", @@ -1883,7 +2172,7 @@ dependencies = [ "clap", "futures", "lan-mouse-ipc", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -1894,11 +2183,11 @@ dependencies = [ "async-channel", "glib-build-tools", "gtk4", - "hostname", + "hostname 0.4.0", "lan-mouse-ipc", "libadwaita", "log", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -1909,7 +2198,7 @@ dependencies = [ "log", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", ] @@ -1921,7 +2210,7 @@ dependencies = [ "input-event", "num_enum", "paste", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -1932,9 +2221,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libadwaita" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500135d29c16aabf67baafd3e7741d48e8b8978ca98bac39e589165c8dc78191" +checksum = "8611ee9fb85e7606c362b513afcaf5b59853f79e4d98caaaf581d99465014247" dependencies = [ "gdk4", "gio", @@ -1947,9 +2236,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680988058c2558baf3f548a370e4e78da3bf7f08469daa822ac414842c912db" +checksum = "b099a223560118d4d4fa04b6d23f3ea5b7171fe1d83dfb7e6b45b54cdfc83af9" dependencies = [ "gdk4-sys", "gio-sys", @@ -1963,15 +2252,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libgit2-sys" -version = "0.18.2+1.9.1" +version = "0.18.0+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +checksum = "e1a117465e7e1597e8febea8bb0c410f1c7fb93b1e1cddf34363f8390367ffec" dependencies = [ "cc", "libc", @@ -1981,9 +2270,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" dependencies = [ "cc", "libc", @@ -1993,21 +2282,21 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "local-channel" @@ -2028,9 +2317,9 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2038,9 +2327,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -2055,6 +2344,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "matchers" version = "0.1.0" @@ -2066,9 +2361,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap" @@ -2106,22 +2401,24 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -2139,10 +2436,20 @@ dependencies = [ "rustc_version", "smallvec", "tagptr", - "thiserror 1.0.69", + "thiserror 1.0.68", "uuid", ] +[[package]] +name = "moxcms" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c588e11a3082784af229e23e8e4ecf5bcc6fbe4f69101e0421ce8d79da7f0b40" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "nix" version = "0.26.4" @@ -2158,11 +2465,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -2225,19 +2532,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", - "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2254,11 +2560,84 @@ dependencies = [ "libc", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.9.4", + "objc2", + "objc2-core-graphics", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.9.4", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.9.4", + "objc2", + "objc2-core-foundation", +] + [[package]] name = "object" -version = "0.36.7" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -2274,20 +2653,14 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" dependencies = [ "critical-section", "portable-atomic", ] -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - [[package]] name = "opaque-debug" version = "0.3.1" @@ -2313,6 +2686,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "os_pipe" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "overload" version = "0.1.1" @@ -2333,9 +2716,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" dependencies = [ "ecdsa", "elliptic-curve", @@ -2345,9 +2728,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.20.12" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6576b311f6df659397043a5fa8a021da8f72e34af180b44f7d57348de691ab5c" +checksum = "aa26aa54b11094d72141a754901cd71d9356432bb8147f9cace8d9c7ba95f356" dependencies = [ "gio", "glib", @@ -2357,9 +2740,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.20.10" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186909673fc09be354555c302c0b3dcf753cd9fa08dcb8077fa663c80fb243fa" +checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" dependencies = [ "glib-sys", "gobject-sys", @@ -2375,9 +2758,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2385,9 +2768,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", @@ -2404,9 +2787,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.5" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ "base64", "serde", @@ -2427,11 +2810,21 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2439,6 +2832,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -2451,45 +2855,55 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] -name = "polyval" -version = "0.6.2" +name = "png" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", + "bitflags 2.9.4", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] -name = "portable-atomic" -version = "1.11.1" +name = "polling" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", +] [[package]] -name = "portable-atomic-util" -version = "0.2.4" +name = "polyval" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ - "portable-atomic", + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", ] [[package]] -name = "potential_utf" -version = "0.1.2" +name = "portable-atomic" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "powerfmt" @@ -2499,11 +2913,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -2517,22 +2931,43 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] +[[package]] +name = "pxfm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +dependencies = [ + "num-traits", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.37.5" @@ -2544,9 +2979,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2604,7 +3039,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", ] [[package]] @@ -2618,9 +3053,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779" dependencies = [ "pem", "ring", @@ -2631,11 +3066,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", ] [[package]] @@ -2646,7 +3081,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "regex-syntax 0.8.5", ] @@ -2661,9 +3096,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2695,9 +3130,13 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname 0.3.1", + "quick-error 1.2.3", +] [[package]] name = "rfc6979" @@ -2717,7 +3156,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", @@ -2725,9 +3164,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" @@ -2753,31 +3192,31 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.4.15", + "linux-raw-sys 0.4.14", "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring", @@ -2798,9 +3237,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -2809,15 +3248,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scoped-tls" @@ -2847,30 +3286,33 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde-untagged" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" dependencies = [ "erased-serde", "serde", + "serde_core", "typeid", ] @@ -2884,11 +3326,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2897,21 +3348,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", @@ -2940,9 +3392,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.9" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -2951,9 +3403,9 @@ dependencies = [ [[package]] name = "shadow-rs" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6fd27df794ced2ef39872879c93a9f87c012607318af8621cd56d2c3a8b3a2" +checksum = "72d18183cef626bce22836103349c7050d73db799be0171386b80947d157ae32" dependencies = [ "cargo_metadata", "const_format", @@ -2981,9 +3433,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -2998,23 +3450,32 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.15.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.10" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3066,9 +3527,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3077,9 +3538,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", @@ -3088,9 +3549,9 @@ dependencies = [ [[package]] name = "system-deps" -version = "7.0.5" +version = "7.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4be53aa0cba896d2dc615bd42bbc130acdcffa239e0a2d965ea5b3b2a86ffdb" +checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" dependencies = [ "cfg-expr", "heck", @@ -3107,46 +3568,46 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.20.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", + "rustix 1.1.2", "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ - "thiserror-impl 1.0.69", + "thiserror-impl 1.0.68", ] [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", @@ -3155,9 +3616,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -3173,11 +3634,25 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error 2.0.1", + "weezl", + "zune-jpeg", +] + [[package]] name = "time" -version = "0.3.41" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -3192,15 +3667,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -3208,9 +3683,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", @@ -3218,9 +3693,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3233,9 +3708,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -3265,9 +3740,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -3276,9 +3751,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -3319,7 +3794,7 @@ dependencies = [ "serde_spanned", "toml_datetime", "toml_write", - "winnow", + "winnow 0.7.13", ] [[package]] @@ -3330,9 +3805,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -3341,9 +3816,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -3352,9 +3827,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -3373,9 +3848,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3389,6 +3864,18 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tree_magic_mini" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f943391d896cdfe8eec03a04d7110332d445be7df856db382dd96a730667562c" +dependencies = [ + "memchr", + "nom", + "once_cell", + "petgraph", +] + [[package]] name = "typeid" version = "1.0.3" @@ -3397,9 +3884,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "tz-rs" @@ -3440,9 +3927,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-xid" @@ -3478,6 +3965,12 @@ dependencies = [ "serde", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -3492,9 +3985,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -3527,17 +4020,26 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -3606,7 +4108,7 @@ checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs", - "rustix 1.0.8", + "rustix 1.1.2", "smallvec", "wayland-sys", ] @@ -3617,8 +4119,8 @@ version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.1", - "rustix 1.0.8", + "bitflags 2.9.4", + "rustix 1.1.2", "wayland-backend", "wayland-scanner", ] @@ -3629,7 +4131,7 @@ version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-scanner", @@ -3637,11 +4139,11 @@ dependencies = [ [[package]] name = "wayland-protocols-misc" -version = "0.3.9" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" +checksum = "da2e42969764e469a115d4bb1c16e9588ef8b75b127ba7a2c9ddf1e140b25ca7" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3654,7 +4156,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3712,7 +4214,7 @@ dependencies = [ "sha1", "sha2", "subtle", - "thiserror 1.0.69", + "thiserror 1.0.68", "tokio", "webrtc-util", "x25519-dalek", @@ -3735,16 +4237,22 @@ dependencies = [ "nix 0.26.4", "portable-atomic", "rand 0.8.5", - "thiserror 1.0.69", + "thiserror 1.0.68", "tokio", "winapi", ] +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + [[package]] name = "widestring" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -3768,6 +4276,26 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" @@ -3775,7 +4303,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", - "windows-core", + "windows-core 0.61.2", "windows-future", "windows-link", "windows-numerics", @@ -3787,7 +4315,29 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core", + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] @@ -3796,11 +4346,11 @@ 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", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -3809,16 +4359,27 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link", "windows-threading", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -3827,9 +4388,20 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -3848,10 +4420,19 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link", ] +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -3861,6 +4442,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -3897,15 +4488,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -3930,30 +4512,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows-threading" version = "0.1.0" @@ -3975,12 +4540,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3993,12 +4552,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4011,24 +4564,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4041,12 +4582,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4059,12 +4594,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4077,12 +4606,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4096,16 +4619,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" +name = "winnow" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -4121,19 +4647,41 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "wl-clipboard-rs" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" dependencies = [ - "bitflags 2.9.1", + "libc", + "log", + "os_pipe", + "rustix 0.38.44", + "tempfile", + "thiserror 2.0.17", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + [[package]] name = "writeable" -version = "0.6.1" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "x11" @@ -4145,6 +4693,23 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "gethostname", + "rustix 1.1.2", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -4170,10 +4735,20 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 1.0.69", + "thiserror 1.0.68", "time", ] +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "yasna" version = "0.5.2" @@ -4185,9 +4760,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -4197,9 +4772,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", @@ -4209,27 +4784,30 @@ dependencies = [ [[package]] name = "zbus" -version = "5.9.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" +checksum = "4e0c8d6fdd4c4ac401fd298fd169d538a386e9df3c32ff136e8745dfa443dbd8" dependencies = [ "async-broadcast", + "async-process", "async-recursion", "async-trait", "enumflags2", "event-listener", "futures-core", - "futures-lite", + "futures-util", "hex", - "nix 0.30.1", + "nix 0.29.0", "ordered-stream", "serde", "serde_repr", + "static_assertions", "tokio", "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow", + "winnow 0.6.20", + "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -4237,9 +4815,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.9.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" +checksum = "ed1f3cc6313cbefd539b4eee6de36a990897ab6cc2c30a82b3ac29ef9099e6c0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4252,30 +4830,51 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.2.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b" dependencies = [ "serde", "static_assertions", - "winnow", + "winnow 0.6.20", "zvariant", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive", + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive 0.8.27", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -4284,18 +4883,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", @@ -4323,22 +4922,11 @@ dependencies = [ "syn", ] -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - [[package]] name = "zerovec" -version = "0.11.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", @@ -4347,35 +4935,51 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" -version = "5.6.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" +checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f" dependencies = [ "endi", "enumflags2", "serde", + "static_assertions", "url", - "winnow", + "winnow 0.6.20", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.6.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" +checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4386,14 +4990,14 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6" dependencies = [ "proc-macro2", "quote", "serde", "static_assertions", "syn", - "winnow", + "winnow 0.6.20", ] diff --git a/input-capture/Cargo.toml b/input-capture/Cargo.toml index 8a61c83e7..9326d60cf 100644 --- a/input-capture/Cargo.toml +++ b/input-capture/Cargo.toml @@ -27,6 +27,7 @@ tokio = { version = "1.32.0", features = [ once_cell = "1.19.0" async-trait = "0.1.81" tokio-util = "0.7.11" +arboard = { version = "3.4", features = ["wayland-data-control"] } [target.'cfg(all(unix, not(target_os="macos")))'.dependencies] diff --git a/input-capture/src/clipboard.rs b/input-capture/src/clipboard.rs new file mode 100644 index 000000000..d9cc3ce55 --- /dev/null +++ b/input-capture/src/clipboard.rs @@ -0,0 +1,149 @@ +use arboard::Clipboard; +use input_event::{ClipboardEvent, Event}; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; +use tokio::sync::mpsc::{self, Receiver, Sender}; +use tokio::task::spawn_blocking; +use tokio::time::interval; + +use crate::{CaptureError, CaptureEvent}; + +/// Clipboard monitor that watches for clipboard changes +pub struct ClipboardMonitor { + event_rx: Receiver, + _event_tx: Sender, + last_content: Arc>>, + last_change: Arc>>, + enabled: Arc>, +} + +impl ClipboardMonitor { + pub fn new() -> Result { + let (event_tx, event_rx) = mpsc::channel(16); + let last_content: Arc>> = Arc::new(Mutex::new(None)); + let last_change: Arc>> = Arc::new(Mutex::new(None)); + let enabled = Arc::new(Mutex::new(true)); + + let last_content_clone = last_content.clone(); + let last_change_clone = last_change.clone(); + let enabled_clone = enabled.clone(); + let event_tx_clone = event_tx.clone(); + + // Spawn monitoring task + tokio::spawn(async move { + let mut check_interval = interval(Duration::from_millis(500)); + + loop { + check_interval.tick().await; + + // Check if enabled + let is_enabled = { + let enabled = enabled_clone.lock().unwrap(); + *enabled + }; + + if !is_enabled { + continue; + } + + // Read clipboard in blocking task + let last_content_clone2 = last_content_clone.clone(); + let last_change_clone2 = last_change_clone.clone(); + let event_tx_clone2 = event_tx_clone.clone(); + + let _ = spawn_blocking(move || { + // Create clipboard instance + let mut clipboard = match Clipboard::new() { + Ok(c) => c, + Err(e) => { + log::debug!("Failed to create clipboard: {}", e); + return; + } + }; + + // Get current clipboard text + let current_text = match clipboard.get_text() { + Ok(text) => { + log::trace!("Clipboard text read: {} bytes", text.len()); + text + } + Err(e) => { + // Clipboard might be empty or contain non-text data + log::trace!("Failed to get clipboard text: {}", e); + return; + } + }; + + // Check if content changed + let mut last_content = last_content_clone2.lock().unwrap(); + let mut last_change = last_change_clone2.lock().unwrap(); + + let content_changed = match last_content.as_ref() { + None => true, + Some(last) => last != ¤t_text, + }; + + if content_changed { + // Debounce: ignore changes within 200ms of last change + // This prevents infinite loops when both sides update clipboard + let should_emit = match *last_change { + None => true, + Some(instant) => instant.elapsed() > Duration::from_millis(200), + }; + + if should_emit { + log::info!("Clipboard changed, length: {} bytes", current_text.len()); + *last_content = Some(current_text.clone()); + *last_change = Some(Instant::now()); + + // Send event + let event = CaptureEvent::Input(Event::Clipboard( + ClipboardEvent::Text(current_text), + )); + let _ = event_tx_clone2.blocking_send(event); + } else { + log::trace!("Clipboard changed but debounced (too recent)"); + } + } + }) + .await; + } + }); + + Ok(Self { + event_rx, + _event_tx: event_tx, + last_content, + last_change, + enabled, + }) + } + + /// Receive the next clipboard event + pub async fn recv(&mut self) -> Option { + self.event_rx.recv().await + } + + /// Enable clipboard monitoring + pub fn enable(&self) { + let mut enabled = self.enabled.lock().unwrap(); + *enabled = true; + log::info!("Clipboard monitoring enabled"); + } + + /// Disable clipboard monitoring + pub fn disable(&self) { + let mut enabled = self.enabled.lock().unwrap(); + *enabled = false; + log::info!("Clipboard monitoring disabled"); + } + + /// Update the last known clipboard content (called when we set the clipboard) + /// This prevents detecting our own clipboard changes as external changes + pub fn update_last_content(&self, content: String) { + let mut last_content = self.last_content.lock().unwrap(); + let mut last_change = self.last_change.lock().unwrap(); + *last_content = Some(content); + *last_change = Some(Instant::now()); + } +} diff --git a/input-capture/src/lib.rs b/input-capture/src/lib.rs index 6b4f4f88d..38c850931 100644 --- a/input-capture/src/lib.rs +++ b/input-capture/src/lib.rs @@ -13,6 +13,7 @@ use input_event::{scancode, Event, KeyboardEvent}; pub use error::{CaptureCreationError, CaptureError, InputCaptureError}; +pub mod clipboard; pub mod error; #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] @@ -35,7 +36,7 @@ mod dummy; pub type CaptureHandle = u64; -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub enum CaptureEvent { /// capture on this capture handle is now active Begin, @@ -252,7 +253,7 @@ impl Stream for InputCapture { swap(&mut self.position_map, &mut position_map); { for &id in position_map.get(&pos).expect("position") { - self.pending.push_back((id, event)); + self.pending.push_back((id, event.clone())); } } swap(&mut self.position_map, &mut position_map); diff --git a/input-capture/src/macos.rs b/input-capture/src/macos.rs index a7f03f748..bbe15be68 100644 --- a/input-capture/src/macos.rs +++ b/input-capture/src/macos.rs @@ -392,7 +392,7 @@ fn create_event_tap<'a>( res_events.iter().for_each(|e| { // error must be ignored, since the event channel // may already be closed when the InputCapture instance is dropped. - let _ = event_tx.blocking_send((pos, *e)); + let _ = event_tx.blocking_send((pos, e.clone())); }); // Returning Drop should stop the event from being processed // but core fundation still returns the event diff --git a/input-emulation/Cargo.toml b/input-emulation/Cargo.toml index 31eadd482..0a22e7924 100644 --- a/input-emulation/Cargo.toml +++ b/input-emulation/Cargo.toml @@ -23,6 +23,7 @@ tokio = { version = "1.32.0", features = [ "signal", ] } once_cell = "1.19.0" +arboard = { version = "3.4", features = ["wayland-data-control"] } [target.'cfg(all(unix, not(target_os="macos")))'.dependencies] bitflags = "2.6.0" diff --git a/input-emulation/src/clipboard.rs b/input-emulation/src/clipboard.rs new file mode 100644 index 000000000..72dd3f6f4 --- /dev/null +++ b/input-emulation/src/clipboard.rs @@ -0,0 +1,105 @@ +use arboard::Clipboard; +use input_event::ClipboardEvent; +use std::sync::{Arc, Mutex}; +use thiserror::Error; +use tokio::task::spawn_blocking; + +#[derive(Debug, Error)] +pub enum ClipboardError { + #[error("Failed to access clipboard: {0}")] + Access(String), + #[error("Failed to set clipboard: {0}")] + Set(String), +} + +/// Clipboard emulation that sets clipboard content +#[derive(Clone)] +pub struct ClipboardEmulation { + // Use Arc> to share clipboard across threads + clipboard: Arc>>, +} + +impl ClipboardEmulation { + pub fn new() -> Result { + // Try to create initial clipboard instance + let clipboard = match Clipboard::new() { + Ok(c) => Some(c), + Err(e) => { + log::warn!("Failed to create clipboard instance: {}", e); + None + } + }; + + Ok(Self { + clipboard: Arc::new(Mutex::new(clipboard)), + }) + } + + /// Set clipboard content from a clipboard event + pub async fn set(&self, event: ClipboardEvent) -> Result<(), ClipboardError> { + match event { + ClipboardEvent::Text(text) => { + let clipboard_arc = self.clipboard.clone(); + + spawn_blocking(move || { + let mut clipboard_guard = clipboard_arc.lock().unwrap(); + + // Try to get or create clipboard + let clipboard = match clipboard_guard.as_mut() { + Some(c) => c, + None => { + // Try to create a new clipboard instance + match Clipboard::new() { + Ok(c) => { + *clipboard_guard = Some(c); + clipboard_guard.as_mut().unwrap() + } + Err(e) => { + return Err(ClipboardError::Access(format!("{}", e))); + } + } + } + }; + + // Set clipboard text + clipboard + .set_text(text.clone()) + .map_err(|e| ClipboardError::Set(format!("{}", e)))?; + + log::debug!("Clipboard set, length: {} bytes", text.len()); + Ok(()) + }) + .await + .map_err(|e| ClipboardError::Access(format!("Task join error: {}", e)))? + } + } + } + + /// Get current clipboard content (for testing/verification) + pub async fn get(&self) -> Result { + let clipboard_arc = self.clipboard.clone(); + + spawn_blocking(move || { + let mut clipboard_guard = clipboard_arc.lock().unwrap(); + + let clipboard = match clipboard_guard.as_mut() { + Some(c) => c, + None => match Clipboard::new() { + Ok(c) => { + *clipboard_guard = Some(c); + clipboard_guard.as_mut().unwrap() + } + Err(e) => { + return Err(ClipboardError::Access(format!("{}", e))); + } + }, + }; + + clipboard + .get_text() + .map_err(|e| ClipboardError::Access(format!("{}", e))) + }) + .await + .map_err(|e| ClipboardError::Access(format!("Task join error: {}", e)))? + } +} diff --git a/input-emulation/src/lib.rs b/input-emulation/src/lib.rs index 930695f9a..bd9c88f6b 100644 --- a/input-emulation/src/lib.rs +++ b/input-emulation/src/lib.rs @@ -26,6 +26,7 @@ mod libei; #[cfg(target_os = "macos")] mod macos; +pub mod clipboard; /// fallback input emulation (logs events) mod dummy; mod error; diff --git a/input-emulation/src/libei.rs b/input-emulation/src/libei.rs index 0ba0e5a19..864a6249e 100644 --- a/input-emulation/src/libei.rs +++ b/input-emulation/src/libei.rs @@ -203,6 +203,10 @@ impl Emulation for LibeiEmulation<'_> { } KeyboardEvent::Modifiers { .. } => {} }, + Event::Clipboard(_) => { + // Clipboard events are not supported by libei emulation + log::debug!("ignoring clipboard event in libei emulation"); + } } self.context .flush() diff --git a/input-emulation/src/macos.rs b/input-emulation/src/macos.rs index 0ac3dbe05..c0a3019ef 100644 --- a/input-emulation/src/macos.rs +++ b/input-emulation/src/macos.rs @@ -225,6 +225,10 @@ impl Emulation for MacOSEmulation { _handle: EmulationHandle, ) -> Result<(), EmulationError> { match event { + Event::Clipboard(_) => { + // Clipboard events are not emulated through this backend + // They are handled directly by the clipboard emulation module + } Event::Pointer(pointer_event) => match pointer_event { PointerEvent::Motion { time: _, dx, dy } => { let mut mouse_location = match self.get_mouse_location() { diff --git a/input-emulation/src/windows.rs b/input-emulation/src/windows.rs index 3d0eacd57..5023ddc72 100644 --- a/input-emulation/src/windows.rs +++ b/input-emulation/src/windows.rs @@ -70,6 +70,11 @@ impl Emulation for WindowsEmulation { } KeyboardEvent::Modifiers { .. } => {} }, + Event::Clipboard(_) => { + // Clipboard events are not emulated through this backend + // They are handled directly by the clipboard emulation module + log::debug!("ignoring clipboard event in windows emulation"); + } } // FIXME Ok(()) diff --git a/input-emulation/src/wlroots.rs b/input-emulation/src/wlroots.rs index 51d66217e..feb5ac497 100644 --- a/input-emulation/src/wlroots.rs +++ b/input-emulation/src/wlroots.rs @@ -144,13 +144,14 @@ impl Emulation for WlrootsEmulation { _ => {} } } + let event_debug = format!("{event:?}"); virtual_input .consume_event(event) - .unwrap_or_else(|_| panic!("failed to convert event: {event:?}")); + .unwrap_or_else(|_| panic!("failed to convert event: {event_debug}")); match self.queue.flush() { Err(WaylandError::Io(e)) if e.kind() == io::ErrorKind::WouldBlock => { self.last_flush_failed = true; - log::warn!("can't keep up, discarding event: ({handle}) - {event:?}"); + log::warn!("can't keep up, discarding event: ({handle}) - {event_debug}"); } Err(WaylandError::Protocol(e)) => panic!("wayland protocol violation: {e}"), Ok(()) => self.last_flush_failed = false, @@ -246,6 +247,10 @@ impl VirtualInput { .modifiers(mods_depressed, mods_latched, mods_locked, group); } }, + Event::Clipboard(_) => { + // Clipboard events are not supported by wlroots emulation + log::debug!("ignoring clipboard event in wlroots emulation"); + } } Ok(()) } diff --git a/input-emulation/src/xdg_desktop_portal.rs b/input-emulation/src/xdg_desktop_portal.rs index 962a23f54..a75c780b2 100644 --- a/input-emulation/src/xdg_desktop_portal.rs +++ b/input-emulation/src/xdg_desktop_portal.rs @@ -9,7 +9,7 @@ use async_trait::async_trait; use futures::FutureExt; use input_event::{ - Event::{Keyboard, Pointer}, + Event::{self, Keyboard, Pointer}, KeyboardEvent, PointerEvent, }; @@ -125,6 +125,10 @@ impl Emulation for DesktopPortalEmulation<'_> { } } } + Event::Clipboard(_) => { + // Clipboard events are not supported by desktop portal emulation + log::debug!("ignoring clipboard event in desktop portal emulation"); + } } Ok(()) } diff --git a/input-event/src/lib.rs b/input-event/src/lib.rs index 1d8c9ffb1..7b690df7c 100644 --- a/input-event/src/lib.rs +++ b/input-event/src/lib.rs @@ -38,12 +38,20 @@ pub enum KeyboardEvent { }, } -#[derive(PartialEq, Debug, Clone, Copy)] +#[derive(Debug, PartialEq, Clone)] +pub enum ClipboardEvent { + /// text content from clipboard + Text(String), +} + +#[derive(PartialEq, Debug, Clone)] pub enum Event { /// pointer event (motion / button / axis) Pointer(PointerEvent), /// keyboard events (key / modifiers) Keyboard(KeyboardEvent), + /// clipboard events + Clipboard(ClipboardEvent), } impl Display for PointerEvent { @@ -109,11 +117,27 @@ impl Display for KeyboardEvent { } } +impl Display for ClipboardEvent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ClipboardEvent::Text(text) => { + let preview = if text.len() > 50 { + format!("{}...", &text[..50]) + } else { + text.clone() + }; + write!(f, "clipboard(text: {})", preview) + } + } + } +} + impl Display for Event { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Event::Pointer(p) => write!(f, "{p}"), Event::Keyboard(k) => write!(f, "{k}"), + Event::Clipboard(c) => write!(f, "{c}"), } } } diff --git a/input-event/src/libei.rs b/input-event/src/libei.rs index f79048987..10d3cf048 100644 --- a/input-event/src/libei.rs +++ b/input-event/src/libei.rs @@ -46,7 +46,7 @@ impl Iterator for EventIterator { let res = if self.pos >= self.events.len() { None } else { - self.events[self.pos] + self.events[self.pos].take() }; self.pos += 1; res diff --git a/lan-mouse-proto/src/lib.rs b/lan-mouse-proto/src/lib.rs index 41f2efbf4..3824f247c 100644 --- a/lan-mouse-proto/src/lib.rs +++ b/lan-mouse-proto/src/lib.rs @@ -1,4 +1,4 @@ -use input_event::{Event as InputEvent, KeyboardEvent, PointerEvent}; +use input_event::{ClipboardEvent, Event as InputEvent, KeyboardEvent, PointerEvent}; use num_enum::{IntoPrimitive, TryFromPrimitive, TryFromPrimitiveError}; use paste::paste; use std::{ @@ -8,10 +8,15 @@ use std::{ use thiserror::Error; /// defines the maximum size an encoded event can take up -/// this is currently the pointer motion event -/// type: u8, time: u32, dx: f64, dy: f64 +/// For most events this is the pointer motion event: type: u8, time: u32, dx: f64, dy: f64 +/// For clipboard events, we have a separate MAX_CLIPBOARD_SIZE limit pub const MAX_EVENT_SIZE: usize = size_of::() + size_of::() + 2 * size_of::(); +/// maximum clipboard data size (4KB - limited by UDP MTU) +/// UDP datagrams have MTU limits (~1400 bytes on most networks) +/// 4KB is conservative and should work on all networks +pub const MAX_CLIPBOARD_SIZE: usize = 4 * 1024; + /// error type for protocol violations #[derive(Debug, Error)] pub enum ProtocolError { @@ -21,6 +26,15 @@ pub enum ProtocolError { /// position type does not exist #[error("invalid event id: `{0}`")] InvalidPosition(#[from] TryFromPrimitiveError), + /// clipboard data too large + #[error("clipboard data exceeds maximum size: {0} bytes")] + ClipboardTooLarge(usize), + /// invalid UTF-8 in clipboard text + #[error("invalid UTF-8 in clipboard text")] + InvalidUtf8(#[from] std::string::FromUtf8Error), + /// buffer too small for clipboard data + #[error("buffer too small for clipboard data")] + BufferTooSmall, } /// Position of a client @@ -46,7 +60,7 @@ impl Display for Position { } /// main lan-mouse protocol event type -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Debug)] pub enum ProtoEvent { /// notify a client that the cursor entered its region at the given position /// [`ProtoEvent::Ack`] with the same serial is used for synchronization between devices @@ -84,7 +98,7 @@ impl Display for ProtoEvent { } } -#[derive(TryFromPrimitive, IntoPrimitive)] +#[derive(TryFromPrimitive, IntoPrimitive, Debug)] #[repr(u8)] pub enum EventType { PointerMotion, @@ -98,6 +112,7 @@ pub enum EventType { Enter, Leave, Ack, + ClipboardText, } impl ProtoEvent { @@ -114,6 +129,9 @@ impl ProtoEvent { KeyboardEvent::Key { .. } => EventType::KeyboardKey, KeyboardEvent::Modifiers { .. } => EventType::KeyboardModifiers, }, + InputEvent::Clipboard(c) => match c { + ClipboardEvent::Text(_) => EventType::ClipboardText, + }, }, ProtoEvent::Ping => EventType::Ping, ProtoEvent::Pong(_) => EventType::Pong, @@ -174,6 +192,11 @@ impl TryFrom<[u8; MAX_EVENT_SIZE]> for ProtoEvent { EventType::Enter => Ok(Self::Enter(decode_u8(&mut buf)?.try_into()?)), EventType::Leave => Ok(Self::Leave(decode_u32(&mut buf)?)), EventType::Ack => Ok(Self::Ack(decode_u32(&mut buf)?)), + EventType::ClipboardText => { + // Clipboard events use variable-length encoding + // This path should not be reached for fixed-size buffer decoding + Err(ProtocolError::BufferTooSmall) + } } } } @@ -232,6 +255,9 @@ impl From for ([u8; MAX_EVENT_SIZE], usize) { encode_u32(buf, len, group); } }, + InputEvent::Clipboard(_) => { + panic!("Clipboard events must use encode_clipboard_event"); + } }, ProtoEvent::Ping => {} ProtoEvent::Pong(alive) => encode_u8(buf, len, alive as u8), @@ -280,3 +306,51 @@ encode_impl!(u8); encode_impl!(u32); encode_impl!(i32); encode_impl!(f64); + +/// Encode a clipboard event into a Vec +/// Format: [event_type: u8][length: u32][data: utf8 bytes] +pub fn encode_clipboard_event(event: &ProtoEvent) -> Result, ProtocolError> { + match event { + ProtoEvent::Input(InputEvent::Clipboard(ClipboardEvent::Text(text))) => { + let text_bytes = text.as_bytes(); + if text_bytes.len() > MAX_CLIPBOARD_SIZE { + return Err(ProtocolError::ClipboardTooLarge(text_bytes.len())); + } + let mut buf = Vec::with_capacity(1 + 4 + text_bytes.len()); + buf.push(EventType::ClipboardText as u8); + buf.extend_from_slice(&(text_bytes.len() as u32).to_be_bytes()); + buf.extend_from_slice(text_bytes); + Ok(buf) + } + _ => panic!("encode_clipboard_event called on non-clipboard event"), + } +} + +/// Decode a clipboard event from a byte slice +/// Format: [event_type: u8][length: u32][data: utf8 bytes] +pub fn decode_clipboard_event(buf: &[u8]) -> Result { + if buf.is_empty() { + return Err(ProtocolError::BufferTooSmall); + } + let event_type = buf[0]; + if event_type != EventType::ClipboardText as u8 { + return Err(ProtocolError::InvalidEventId( + EventType::try_from(event_type).unwrap_err(), + )); + } + if buf.len() < 5 { + return Err(ProtocolError::BufferTooSmall); + } + let length = u32::from_be_bytes([buf[1], buf[2], buf[3], buf[4]]) as usize; + if length > MAX_CLIPBOARD_SIZE { + return Err(ProtocolError::ClipboardTooLarge(length)); + } + if buf.len() < 5 + length { + return Err(ProtocolError::BufferTooSmall); + } + let text_bytes = &buf[5..5 + length]; + let text = String::from_utf8(text_bytes.to_vec())?; + Ok(ProtoEvent::Input(InputEvent::Clipboard( + ClipboardEvent::Text(text), + ))) +} diff --git a/src/capture.rs b/src/capture.rs index f2c95b134..5c7189ad8 100644 --- a/src/capture.rs +++ b/src/capture.rs @@ -37,6 +37,8 @@ pub(crate) enum ICaptureEvent { /// either the remote client leaving its device region, /// a new device entering the screen or the release bind. ClientEntered(u64), + /// clipboard data received from remote + ClipboardReceived(input_event::ClipboardEvent), } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -262,26 +264,35 @@ impl CaptureTask { None => return Ok(()), }, (handle, event) = self.conn.recv() => { - if let Some(active) = self.active_client { - if handle != active { - // we only care about events coming from the client we are currently connected to - // only `Ack` and `Leave` are relevant - continue + match &event { + // Handle clipboard events from any client + ProtoEvent::Input(input_event::Event::Clipboard(clipboard_event)) => { + self.event_tx.send(ICaptureEvent::ClipboardReceived(clipboard_event.clone())).expect("channel closed"); } - } - - match event { - // connection acknowlegded => set state to Sending - ProtoEvent::Ack(_) => { - log::info!("client {handle} acknowledged the connection!"); - self.state = State::Sending; + _ => { + // For other events, only handle if from active client + if let Some(active) = self.active_client { + if handle != active { + // we only care about events coming from the client we are currently connected to + // only `Ack` and `Leave` are relevant + continue + } + } + + match event { + // connection acknowlegded => set state to Sending + ProtoEvent::Ack(_) => { + log::info!("client {handle} acknowledged the connection!"); + self.state = State::Sending; + } + // client disconnected + ProtoEvent::Leave(_) => { + log::info!("releasing capture: left remote client device region"); + self.release_capture(capture).await?; + }, + _ => {} + } } - // client disconnected - ProtoEvent::Leave(_) => { - log::info!("releasing capture: left remote client device region"); - self.release_capture(capture).await?; - }, - _ => {} } }, e = self.request_rx.recv() => match e.expect("channel closed") { diff --git a/src/config.rs b/src/config.rs index 41f442ddc..5ba1f06af 100644 --- a/src/config.rs +++ b/src/config.rs @@ -53,6 +53,7 @@ struct ConfigToml { cert_path: Option, clients: Option>, authorized_fingerprints: Option>, + enable_clipboard: Option, } #[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq)] @@ -384,4 +385,12 @@ impl Config { .and_then(|c| c.release_bind.clone()) .unwrap_or(Vec::from_iter(DEFAULT_RELEASE_KEYS.iter().cloned())) } + + /// whether clipboard sharing is enabled (default: true) + pub fn clipboard_enabled(&self) -> bool { + self.config_toml + .as_ref() + .and_then(|c| c.enable_clipboard) + .unwrap_or(true) + } } diff --git a/src/connect.rs b/src/connect.rs index 4fccc75a2..207839bff 100644 --- a/src/connect.rs +++ b/src/connect.rs @@ -91,28 +91,37 @@ async fn connect_any( } } -pub(crate) struct LanMouseConnection { +#[derive(Clone)] +pub(crate) struct LanMouseConnectionSender { cert: Certificate, client_manager: ClientManager, conns: Rc>>>, connecting: Rc>>, - recv_rx: Receiver<(ClientHandle, ProtoEvent)>, recv_tx: Sender<(ClientHandle, ProtoEvent)>, ping_response: Rc>>, } +pub(crate) struct LanMouseConnection { + sender: LanMouseConnectionSender, + recv_rx: Receiver<(ClientHandle, ProtoEvent)>, +} + impl LanMouseConnection { pub(crate) fn new(cert: Certificate, client_manager: ClientManager) -> Self { let (recv_tx, recv_rx) = channel(); - Self { + let sender = LanMouseConnectionSender { cert, client_manager, conns: Default::default(), connecting: Default::default(), - recv_rx, recv_tx, ping_response: Default::default(), - } + }; + Self { sender, recv_rx } + } + + pub(crate) fn sender(&self) -> LanMouseConnectionSender { + self.sender.clone() } pub(crate) async fn recv(&mut self) -> (ClientHandle, ProtoEvent) { @@ -124,6 +133,17 @@ impl LanMouseConnection { event: ProtoEvent, handle: ClientHandle, ) -> Result<(), LanMouseConnectionError> { + self.sender.send(event, handle).await + } +} + +impl LanMouseConnectionSender { + pub(crate) async fn send( + &self, + event: ProtoEvent, + handle: ClientHandle, + ) -> Result<(), LanMouseConnectionError> { + let event_str = format!("{event}"); let (buf, len): ([u8; MAX_EVENT_SIZE], usize) = event.into(); let buf = &buf[..len]; if let Some(addr) = self.client_manager.active_addr(handle) { @@ -142,7 +162,7 @@ impl LanMouseConnection { disconnect(&self.client_manager, handle, addr, &self.conns).await; } } - log::trace!("{event} >->->->->- {addr}"); + log::trace!("{event_str} >->->->->- {addr}"); return Ok(()); } } @@ -164,6 +184,48 @@ impl LanMouseConnection { } Err(LanMouseConnectionError::NotConnected) } + + /// Send clipboard event with variable-length encoding + pub(crate) async fn send_clipboard( + &self, + event: ProtoEvent, + handle: ClientHandle, + ) -> Result<(), LanMouseConnectionError> { + use lan_mouse_proto::encode_clipboard_event; + + let buf = encode_clipboard_event(&event).map_err(|e| { + log::error!("Failed to encode clipboard event: {}", e); + LanMouseConnectionError::NotConnected + })?; + + if let Some(addr) = self.client_manager.active_addr(handle) { + let conn = { + let conns = self.conns.lock().await; + conns.get(&addr).cloned() + }; + if let Some(conn) = conn { + if !self.client_manager.alive(handle) { + return Err(LanMouseConnectionError::TargetEmulationDisabled); + } + match conn.send(&buf).await { + Ok(_) => {} + Err(e) => { + log::warn!("client {handle} failed to send clipboard: {e}"); + disconnect(&self.client_manager, handle, addr, &self.conns).await; + } + } + log::trace!("{event} >->->->->- {addr}"); + return Ok(()); + } + } + + // Not connected yet - clipboard will sync when connection is established + log::debug!( + "Client {} not connected, clipboard will sync when connection is established", + handle + ); + Ok(()) + } } async fn connect_to_handle( @@ -249,20 +311,58 @@ async fn receive_loop( tx: Sender<(ClientHandle, ProtoEvent)>, ping_response: Rc>>, ) { - let mut buf = [0u8; MAX_EVENT_SIZE]; - while conn.recv(&mut buf).await.is_ok() { - if let Ok(event) = buf.try_into() { - log::trace!("{addr} <==<==<== {event}"); - match event { - ProtoEvent::Pong(b) => { - client_manager.set_active_addr(handle, Some(addr)); - client_manager.set_alive(handle, b); - ping_response.borrow_mut().insert(addr); + use lan_mouse_proto::{decode_clipboard_event, EventType, MAX_CLIPBOARD_SIZE}; + + // Buffer needs to be large enough for clipboard data + // Use Vec instead of array for large buffers to avoid stack overflow + let mut buf = vec![0u8; MAX_CLIPBOARD_SIZE + 5]; + + loop { + let n = match conn.recv(&mut buf).await { + Ok(n) => n, + Err(_) => break, + }; + + if n == 0 { + break; + } + + // Check if this is a clipboard event + let event = if n > 0 && buf[0] == EventType::ClipboardText as u8 { + // Variable-length clipboard event + match decode_clipboard_event(&buf[..n]) { + Ok(event) => event, + Err(e) => { + log::warn!("Failed to decode clipboard from {}: {:?}", addr, e); + continue; + } + } + } else { + // Standard fixed-size event - need to convert to fixed-size array + // Pad with zeros if message is smaller than MAX_EVENT_SIZE + let mut fixed_buf = [0u8; MAX_EVENT_SIZE]; + let copy_len = n.min(MAX_EVENT_SIZE); + fixed_buf[..copy_len].copy_from_slice(&buf[..copy_len]); + match fixed_buf.try_into() { + Ok(event) => event, + Err(e) => { + log::warn!("Failed to decode event from {}: {:?}", addr, e); + continue; } - event => tx.send((handle, event)).expect("channel closed"), } + }; + + log::trace!("{addr} <==<==<== {event}"); + match event { + ProtoEvent::Pong(b) => { + client_manager.set_active_addr(handle, Some(addr)); + client_manager.set_alive(handle, b); + ping_response.borrow_mut().insert(addr); + } + event => tx.send((handle, event)).expect("channel closed"), } } + log::warn!("recv error"); disconnect(&client_manager, handle, addr, &conns).await; } diff --git a/src/emulation.rs b/src/emulation.rs index 468955630..974a5a0c0 100644 --- a/src/emulation.rs +++ b/src/emulation.rs @@ -52,6 +52,8 @@ pub(crate) enum EmulationEvent { EmulationEnabled, /// capture should be released ReleaseNotify, + /// clipboard data received from remote + ClipboardReceived(input_event::ClipboardEvent), } enum EmulationRequest { @@ -59,6 +61,7 @@ enum EmulationRequest { Release(SocketAddr), ChangePort(u16), Terminate, + SendClipboard(SocketAddr, input_event::ClipboardEvent), } impl Emulation { @@ -89,6 +92,12 @@ impl Emulation { .expect("channel closed"); } + pub(crate) fn send_clipboard(&self, addr: SocketAddr, clipboard: input_event::ClipboardEvent) { + self.request_tx + .send(EmulationRequest::SendClipboard(addr, clipboard)) + .expect("channel closed"); + } + pub(crate) fn reenable(&self) { self.request_tx .send(EmulationRequest::Reenable) @@ -147,7 +156,19 @@ impl ListenTask { self.emulation_proxy.remove(addr); self.listener.reply(addr, ProtoEvent::Ack(0)).await; } - ProtoEvent::Input(event) => self.emulation_proxy.consume(event, addr), + ProtoEvent::Input(event) => { + // Check if this is a clipboard event + match &event { + input_event::Event::Clipboard(clipboard_event) => { + // Send clipboard event directly to service for processing + self.event_tx.send(EmulationEvent::ClipboardReceived(clipboard_event.clone())).expect("channel closed"); + } + _ => { + // Handle normal input events through emulation proxy + self.emulation_proxy.consume(event, addr); + } + } + } ProtoEvent::Ping => self.listener.reply(addr, ProtoEvent::Pong(self.emulation_proxy.emulation_active.get())).await, _ => {} } @@ -168,6 +189,11 @@ impl ListenTask { EmulationRequest::Reenable => self.emulation_proxy.reenable(), // notify the other end that we hit a barrier (should release capture) EmulationRequest::Release(addr) => self.listener.reply(addr, ProtoEvent::Leave(0)).await, + // send clipboard to a specific address + EmulationRequest::SendClipboard(addr, clipboard_event) => { + let proto_event = ProtoEvent::Input(input_event::Event::Clipboard(clipboard_event)); + self.listener.reply_clipboard(addr, proto_event).await; + } EmulationRequest::ChangePort(port) => { self.listener.request_port_change(port); let result = self.listener.port_changed().await; diff --git a/src/listen.rs b/src/listen.rs index bf0653dab..41f669692 100644 --- a/src/listen.rs +++ b/src/listen.rs @@ -214,6 +214,34 @@ impl LanMouseListener { } } + pub(crate) async fn reply_clipboard(&self, addr: SocketAddr, event: ProtoEvent) { + use lan_mouse_proto::encode_clipboard_event; + + let buf = match encode_clipboard_event(&event) { + Ok(b) => b, + Err(e) => { + log::error!("Failed to encode clipboard event: {}", e); + return; + } + }; + + log::info!( + "Sending clipboard ({} bytes) >=>=>=>=>=> {}", + buf.len(), + addr + ); + + let conns = self.conns.lock().await; + for (a, conn) in conns.iter() { + if *a == addr { + match conn.send(&buf).await { + Ok(_) => log::debug!("Clipboard sent successfully to {}", addr), + Err(e) => log::error!("Failed to send clipboard to {}: {:?}", addr, e), + } + } + } + } + pub(crate) async fn get_certificate_fingerprint(&self, addr: SocketAddr) -> Option { if let Some(conn) = self .conns @@ -251,19 +279,113 @@ async fn read_loop( conn: ArcConn, dtls_tx: Sender, ) -> Result<(), Error> { - let mut b = [0u8; MAX_EVENT_SIZE]; + use lan_mouse_proto::{decode_clipboard_event, EventType, MAX_CLIPBOARD_SIZE}; - while conn.recv(&mut b).await.is_ok() { - match b.try_into() { - Ok(event) => dtls_tx - .send(ListenEvent::Msg { event, addr }) - .expect("channel closed"), + // Buffer needs to be large enough for clipboard data + // Use Vec instead of array for large buffers to avoid stack overflow + let mut b = vec![0u8; MAX_CLIPBOARD_SIZE + 5]; + + loop { + // Read first byte to determine event type + let n = match conn.recv(&mut b).await { + Ok(n) => n, Err(e) => { - log::warn!("error receiving event: {e}"); + log::warn!("recv error from {}: {:?}", addr, e); break; } + }; + + if n == 0 { + break; } + + log::trace!("Received {} bytes from {}", n, addr); + + // Check if this is a clipboard event (variable length) + let event_type = b[0]; + let event = if event_type == EventType::ClipboardText as u8 { + // This is a clipboard event - need to read full message + if n < 5 { + log::warn!("Clipboard event too short: {} bytes", n); + break; + } + + // Parse length from bytes 1-4 + let length = u32::from_be_bytes([b[1], b[2], b[3], b[4]]) as usize; + + if length > MAX_CLIPBOARD_SIZE { + log::warn!("Clipboard data too large: {} bytes", length); + break; + } + + let total_size = 5 + length; + log::debug!( + "Clipboard event: received {} bytes, total expected {}", + n, + total_size + ); + + // Check if we already have all the data + if n >= total_size { + // All data received in one packet + match decode_clipboard_event(&b[..total_size]) { + Ok(event) => event, + Err(e) => { + log::warn!("error decoding clipboard event: {e}"); + break; + } + } + } else { + // Need to read more data + let mut clipboard_buf = vec![0u8; total_size]; + clipboard_buf[..n].copy_from_slice(&b[..n]); + + let mut read_so_far = n; + let mut read_failed = false; + while read_so_far < total_size { + match conn.recv(&mut clipboard_buf[read_so_far..]).await { + Ok(n) if n > 0 => read_so_far += n, + _ => { + log::warn!("Connection closed while reading clipboard data"); + read_failed = true; + break; + } + } + } + + if read_failed || read_so_far < total_size { + log::warn!("Incomplete clipboard data received, closing connection"); + break; + } + + match decode_clipboard_event(&clipboard_buf) { + Ok(event) => event, + Err(e) => { + log::warn!("error decoding clipboard event: {e}"); + break; + } + } + } + } else { + // Standard fixed-size event - need to convert to fixed-size array + // Pad with zeros if message is smaller than MAX_EVENT_SIZE + let mut fixed_buf = [0u8; MAX_EVENT_SIZE]; + let copy_len = n.min(MAX_EVENT_SIZE); + fixed_buf[..copy_len].copy_from_slice(&b[..copy_len]); + match fixed_buf.try_into() { + Ok(event) => event, + Err(e) => { + log::warn!("error receiving event: {e}"); + break; + } + } + }; + + dtls_tx + .send(ListenEvent::Msg { event, addr }) + .expect("channel closed"); } + log::info!("dtls client disconnected {addr:?}"); let mut conns = conns.lock().await; let index = conns diff --git a/src/service.rs b/src/service.rs index f708193e6..64b6e341d 100644 --- a/src/service.rs +++ b/src/service.rs @@ -2,7 +2,7 @@ use crate::{ capture::{Capture, CaptureType, ICaptureEvent}, client::ClientManager, config::Config, - connect::LanMouseConnection, + connect::{LanMouseConnection, LanMouseConnectionSender}, crypto, dns::{DnsEvent, DnsResolver}, emulation::{Emulation, EmulationEvent}, @@ -10,6 +10,8 @@ use crate::{ }; use futures::StreamExt; use hickory_resolver::ResolveError; +use input_capture::clipboard::ClipboardMonitor; +use input_emulation::clipboard::ClipboardEmulation; use lan_mouse_ipc::{ AsyncFrontendListener, ClientConfig, ClientHandle, ClientState, FrontendEvent, FrontendRequest, IpcError, IpcListenerCreationError, Position, Status, @@ -43,6 +45,12 @@ pub struct Service { capture: Capture, /// input emulation emulation: Emulation, + /// clipboard monitor + clipboard_monitor: Option, + /// clipboard emulation + clipboard_emulation: Option, + /// clipboard enabled + _clipboard_enabled: bool, /// dns resolver resolver: DnsResolver, /// frontend listener @@ -51,6 +59,8 @@ pub struct Service { authorized_keys: Arc>>, /// (outgoing) client information client_manager: ClientManager, + /// lan mouse connection sender (for clipboard) + conn_sender: LanMouseConnectionSender, /// current port port: u16, /// the public key fingerprint for (D)TLS @@ -110,6 +120,7 @@ impl Service { let listener = LanMouseListener::new(config.port(), cert.clone(), authorized_keys.clone()).await?; let conn = LanMouseConnection::new(cert.clone(), client_manager.clone()); + let conn_sender = conn.sender(); // input capture + emulation let capture_backend = config.capture_backend().map(|b| b.into()); @@ -117,6 +128,39 @@ impl Service { let emulation_backend = config.emulation_backend().map(|b| b.into()); let emulation = Emulation::new(emulation_backend, listener); + // clipboard monitor + emulation + let clipboard_enabled = config.clipboard_enabled(); + let clipboard_monitor = if clipboard_enabled { + match ClipboardMonitor::new() { + Ok(monitor) => { + log::info!("Clipboard monitoring enabled"); + Some(monitor) + } + Err(e) => { + log::warn!("Failed to create clipboard monitor: {}", e); + None + } + } + } else { + log::info!("Clipboard sharing disabled by configuration"); + None + }; + + let clipboard_emulation = if clipboard_enabled { + match ClipboardEmulation::new() { + Ok(emulation) => { + log::info!("Clipboard emulation enabled"); + Some(emulation) + } + Err(e) => { + log::warn!("Failed to create clipboard emulation: {}", e); + None + } + } + } else { + None + }; + // create dns resolver let resolver = DnsResolver::new()?; @@ -124,11 +168,15 @@ impl Service { let service = Self { capture, emulation, + clipboard_monitor, + clipboard_emulation, + _clipboard_enabled: clipboard_enabled, frontend_listener, resolver, authorized_keys, public_key_fingerprint, - client_manager, + client_manager: client_manager.clone(), + conn_sender, frontend_event_pending: Default::default(), port, pending_frontend_events: Default::default(), @@ -158,9 +206,15 @@ impl Service { tokio::select! { request = self.frontend_listener.next() => self.handle_frontend_request(request), _ = self.frontend_event_pending.notified() => self.handle_frontend_pending().await, - event = self.emulation.event() => self.handle_emulation_event(event), + event = self.emulation.event() => self.handle_emulation_event(event).await, event = self.capture.event() => self.handle_capture_event(event), event = self.resolver.event() => self.handle_resolver_event(event), + event = async { + match &mut self.clipboard_monitor { + Some(monitor) => monitor.recv().await, + None => std::future::pending().await, + } + } => self.handle_clipboard_event(event).await, r = signal::ctrl_c() => break r.expect("failed to wait for CTRL+C"), } } @@ -209,7 +263,7 @@ impl Service { } } - fn handle_emulation_event(&mut self, event: EmulationEvent) { + async fn handle_emulation_event(&mut self, event: EmulationEvent) { match event { EmulationEvent::ConnectionAttempt { fingerprint } => { self.notify_frontend(FrontendEvent::ConnectionAttempt { fingerprint }); @@ -256,6 +310,14 @@ impl Service { EmulationEvent::Connected { addr, fingerprint } => { self.notify_frontend(FrontendEvent::DeviceConnected { addr, fingerprint }); } + EmulationEvent::ClipboardReceived(clipboard_event) => { + // Received clipboard data from a remote machine - set it locally + if let Some(ref clipboard_emulation) = self.clipboard_emulation { + if let Err(e) = clipboard_emulation.set(clipboard_event).await { + log::warn!("Failed to set clipboard: {}", e); + } + } + } } } @@ -280,6 +342,52 @@ impl Service { log::info!("entering client {handle} ..."); self.spawn_hook_command(handle); } + ICaptureEvent::ClipboardReceived(clipboard_event) => { + // Received clipboard data from a remote machine - set it locally + if let Some(ref clipboard_emulation) = self.clipboard_emulation { + // Spawn async task to set clipboard + let clipboard_emulation = clipboard_emulation.clone(); + tokio::task::spawn_local(async move { + if let Err(e) = clipboard_emulation.set(clipboard_event).await { + log::warn!("Failed to set clipboard: {}", e); + } + }); + } + } + } + } + + async fn handle_clipboard_event(&mut self, event: Option) { + use input_capture::CaptureEvent; + use input_event::Event; + + if let Some(CaptureEvent::Input(Event::Clipboard(clipboard_event))) = event { + log::info!("Clipboard changed locally, sending to all connected peers"); + + // Send clipboard to all active clients (machines we're controlling) + let active_clients: Vec<_> = self.client_manager.active_clients().into_iter().collect(); + + for handle in active_clients { + let proto_event = lan_mouse_proto::ProtoEvent::Input( + input_event::Event::Clipboard(clipboard_event.clone()), + ); + + if let Err(e) = self.conn_sender.send_clipboard(proto_event, handle).await { + log::warn!("Failed to send clipboard to client {}: {}", handle, e); + } + } + + // Also send clipboard to all incoming connections (machines controlling us) + let incoming_addrs: Vec<_> = self + .incoming_conn_info + .values() + .map(|incoming| incoming.addr) + .collect(); + + for addr in incoming_addrs { + log::info!("Sending clipboard to incoming connection {}", addr); + self.emulation.send_clipboard(addr, clipboard_event.clone()); + } } }