From f36d30bb666a4ce4d45f80a2af7f0f3046aaf490 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Sat, 6 Jun 2026 18:01:54 -0300 Subject: [PATCH 1/9] feat(hook): add Wayland frontmost-window backends (wlr + GNOME Shell) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces a FrontmostSource trait so display-server backends can be selected at startup without touching callers, then ships two backends: - wlr_foreign_toplevel: uses zwlr_foreign_toplevel_management_v1 for wlroots compositors (sway, Hyprland, river). Drains the event queue each poll (~1 Hz) and tracks per-toplevel app_id / activated state. Emits warn! on compositor Finished (e.g. sway config reload). - gnome_shell: talks to a companion GNOME Shell extension over D-Bus (session bus, blocking proxy). Returns WM_CLASS to keep profile keys consistent with the X11 backend. Backend selection order on Wayland: wlr → gnome-shell → X11/XWayland → NullSource. X11 sessions and unknown sessions skip straight to X11. Also adds gnome-shell-extension/ with the extension source (ESM, targets GNOME Shell 45+) and Cargo deps wayland-client, wayland-protocols-wlr, zbus. Co-Authored-By: Claude Sonnet 4.6 --- Cargo.lock | 959 ++++++++++++------ crates/openlogi-hook/Cargo.toml | 3 + .../gnome-shell-extension/README.md | 59 ++ .../extension.js | 55 + .../metadata.json | 8 + crates/openlogi-hook/src/linux.rs | 262 ++++- crates/openlogi-hook/src/linux/gnome_shell.rs | 97 ++ .../src/linux/wlr_foreign_toplevel.rs | 269 +++++ 8 files changed, 1348 insertions(+), 364 deletions(-) create mode 100644 crates/openlogi-hook/gnome-shell-extension/README.md create mode 100644 crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/extension.js create mode 100644 crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/metadata.json create mode 100644 crates/openlogi-hook/src/linux/gnome_shell.rs create mode 100644 crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs diff --git a/Cargo.lock b/Cargo.lock index ca1cba99..13722605 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,95 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "accesskit" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5351dcebb14b579ccab05f288596b2ae097005be7ee50a7c3d4ca9d0d5a66f6a" +dependencies = [ + "uuid", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8c61bee90b42a772d39d06a740207dc71a4e780004ace1db8d99fb1baaa954" +dependencies = [ + "accesskit", + "accesskit_consumer 0.36.0", + "atspi-common", + "phf 0.13.1", + "serde", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e0d7e25d06f4dc21d1774d67146e9e80d6789216cbd4d1e88185b0095dba60" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_macos" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c5c87e8d94f2ec10cce590aadff24c76f576dab5502d45d0aed9fc3065d4451" +dependencies = [ + "accesskit", + "accesskit_consumer 0.36.0", + "hashbrown 0.16.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b016ca8db0ea0ea2ceff29a9d6240391492d960716aa471967c00e8cc8cb197c" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel 2.5.0", + "async-executor", + "async-task", + "atspi", + "futures-lite 2.6.1", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", + "static_assertions", + "windows 0.62.2", + "windows-core 0.62.2", +] + [[package]] name = "addr2line" version = "0.25.1" @@ -324,7 +413,7 @@ checksum = "3633346d0989f6a13133ebce8cbd7b17d8f971513172397c452d438e1e0841e6" dependencies = [ "async-io", "atomic-waker", - "block2", + "block2 0.6.2", "crossbeam-queue", "dispatch2", "futures-lite 2.6.1", @@ -506,6 +595,43 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atspi" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" +dependencies = [ + "atspi-common", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-proxies" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" +dependencies = [ + "atspi-common", + "serde", + "zbus", +] + [[package]] name = "autocfg" version = "1.5.1" @@ -606,7 +732,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -616,7 +742,7 @@ dependencies = [ "quote", "regex", "rustc-hash 2.1.2", - "shlex", + "shlex 1.3.0", "syn", ] @@ -649,9 +775,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "bitstream-io" @@ -698,13 +824,22 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + [[package]] name = "block2" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2", + "objc2 0.6.4", ] [[package]] @@ -742,9 +877,9 @@ dependencies = [ [[package]] name = "built" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" [[package]] name = "bumpalo" @@ -805,7 +940,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "polling", "rustix 1.1.4", "slab", @@ -853,14 +988,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -895,9 +1030,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -991,7 +1126,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "block", "cocoa-foundation 0.2.0", "core-foundation 0.10.0", @@ -1021,7 +1156,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "block", "core-foundation 0.10.0", "core-graphics-types 0.2.0", @@ -1043,8 +1178,9 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ + "gpui_util", "indexmap", "rustc-hash 2.1.2", ] @@ -1212,7 +1348,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", @@ -1225,7 +1361,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", @@ -1238,7 +1374,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.9.4", "core-graphics-types 0.1.3", "foreign-types", @@ -1262,7 +1398,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.10.0", "libc", ] @@ -1273,7 +1409,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4416167a69126e617f8d0a214af0e3c1dbdeffcb100ddf72dcd1a1ac9893c146" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "block", "cfg-if", "core-foundation 0.10.0", @@ -1321,7 +1457,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "fontdb", "harfrust", "linebender_resource_handle", @@ -1329,7 +1465,7 @@ dependencies = [ "rangemap", "rustc-hash 2.1.2", "self_cell", - "skrifa", + "skrifa 0.40.0", "smol_str", "swash", "sys-locale", @@ -1409,20 +1545,14 @@ dependencies = [ [[package]] name = "ctor" -version = "0.4.3" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +checksum = "01334b89b69ff726750c5ce5073fc8bd860e99aa9a8fc5ca11b04730e3aee97a" dependencies = [ - "ctor-proc-macro", - "dtor", + "link-section", + "linktime-proc-macro", ] -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - [[package]] name = "ctrlc" version = "3.5.2" @@ -1547,7 +1677,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "proc-macro2", "quote", @@ -1598,17 +1728,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "libc", - "objc2", + "objc2 0.6.4", ] [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -1645,21 +1775,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "dtor" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" - [[package]] name = "dunce" version = "1.0.5" @@ -2465,7 +2580,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2476,19 +2591,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", ] [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ + "accesskit", "anyhow", "async-channel 2.5.0", "async-task", "bindgen", - "bitflags 2.11.1", + "bitflags 2.13.0", "block", "cbindgen", "chrono", @@ -2511,6 +2627,7 @@ dependencies = [ "gpui_macros", "gpui_shared_string", "gpui_util", + "heapless", "http_client", "image", "inventory", @@ -2645,12 +2762,14 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ + "accesskit", + "accesskit_unix", "anyhow", "as-raw-xcb-connection", "ashpd", - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "calloop", "calloop-wayland-source", @@ -2694,8 +2813,10 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ + "accesskit", + "accesskit_macos", "anyhow", "async-task", "block", @@ -2722,7 +2843,7 @@ dependencies = [ "media", "metal", "objc", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "parking_lot", "pathfinder_geometry", "raw-window-handle", @@ -2737,7 +2858,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2748,7 +2869,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "console_error_panic_hook", "gpui", @@ -2761,7 +2882,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "schemars", "serde", @@ -2771,7 +2892,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "log", @@ -2780,7 +2901,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "console_error_panic_hook", @@ -2804,7 +2925,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "bytemuck", @@ -2833,8 +2954,10 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ + "accesskit", + "accesskit_windows", "anyhow", "collections", "etagere", @@ -2898,10 +3021,10 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "core_maths", - "read-fonts", + "read-fonts 0.37.0", "smallvec", ] @@ -3039,9 +3162,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -3073,7 +3196,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "async-compression", @@ -3199,12 +3322,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -3212,9 +3336,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -3225,9 +3349,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -3239,15 +3363,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -3259,15 +3383,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -3303,9 +3427,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -3313,9 +3437,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +checksum = "b915661dd01db3f05050265b2477bcc6527b3792388e2749b41623cc592be67d" dependencies = [ "crossbeam-deque", "globset", @@ -3369,9 +3493,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "indexmap" @@ -3578,13 +3702,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -3607,9 +3730,9 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kqueue" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ "kqueue-sys", "libc", @@ -3621,7 +3744,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "libc", ] @@ -3692,9 +3815,9 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ "arbitrary", "cc", @@ -3718,9 +3841,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "libc", ] @@ -3731,6 +3854,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" +[[package]] +name = "link-section" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2b1dd6fe32e55c0fc0ea9493aa57459ca3cf4ff3c857c7d0302290150da6e4f" + +[[package]] +name = "linktime-proc-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7b0a3383c2a1002d11349c92c85a666a5fb679e96c79d782cf0dbe557fd6ee" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3766,9 +3901,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" dependencies = [ "serde_core", "value-bag", @@ -3895,7 +4030,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" dependencies = [ "log", - "phf", + "phf 0.11.3", "phf_codegen", "string_cache", "string_cache_codegen", @@ -3946,7 +4081,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "bindgen", @@ -3960,9 +4095,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memmap2" @@ -3988,7 +4123,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -4037,9 +4172,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", @@ -4064,7 +4199,7 @@ source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9 dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.1", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -4112,7 +4247,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "libc", @@ -4125,7 +4260,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "libc", @@ -4180,7 +4315,7 @@ version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "filetime", "fsevent-sys", "inotify", @@ -4272,9 +4407,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" @@ -4381,6 +4516,22 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + [[package]] name = "objc2" version = "0.6.4" @@ -4390,25 +4541,41 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + [[package]] name = "objc2-app-kit" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "libc", - "objc2", + "objc2 0.6.4", "objc2-cloud-kit", - "objc2-core-data", + "objc2-core-data 0.3.2", "objc2-core-foundation", "objc2-core-graphics", - "objc2-core-image", + "objc2-core-image 0.3.2", "objc2-core-text", "objc2-core-video", - "objc2-foundation", - "objc2-quartz-core", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -4417,9 +4584,21 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.11.1", - "objc2", - "objc2-foundation", + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -4428,9 +4607,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.11.1", - "objc2", - "objc2-foundation", + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -4439,11 +4618,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "dispatch2", "libc", - "objc2", + "objc2 0.6.4", ] [[package]] @@ -4452,21 +4631,33 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "dispatch2", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", "objc2-io-surface", ] +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + [[package]] name = "objc2-core-image" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -4475,8 +4666,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.11.1", - "objc2", + "bitflags 2.13.0", + "objc2 0.6.4", "objc2-core-foundation", "objc2-core-graphics", ] @@ -4487,8 +4678,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.11.1", - "objc2", + "bitflags 2.13.0", + "objc2 0.6.4", "objc2-core-foundation", "objc2-core-graphics", "objc2-io-surface", @@ -4500,16 +4691,28 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + [[package]] name = "objc2-foundation" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "libc", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", ] @@ -4519,11 +4722,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "dispatch2", "libc", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", ] @@ -4533,21 +4736,46 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.1", - "objc2", + "bitflags 2.13.0", + "objc2 0.6.4", "objc2-core-foundation", ] +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + [[package]] name = "objc2-metal" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "bitflags 2.11.1", - "block2", - "objc2", - "objc2-foundation", + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", ] [[package]] @@ -4556,11 +4784,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.11.1", - "objc2", + "bitflags 2.13.0", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", ] [[package]] @@ -4663,9 +4891,9 @@ version = "0.6.6" dependencies = [ "futures", "interprocess", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", "openlogi-agent-core", "openlogi-core", "openlogi-hid", @@ -4748,9 +4976,9 @@ dependencies = [ "gpui_platform", "image", "interprocess", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", "openlogi-agent-core", "openlogi-assets", "openlogi-core", @@ -4810,14 +5038,17 @@ dependencies = [ "ctrlc", "evdev", "libc", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", "openlogi-core", "thiserror 2.0.18", "tracing", + "wayland-client", + "wayland-protocols-wlr", "windows-sys 0.61.2", "x11rb", + "zbus", ] [[package]] @@ -4971,7 +5202,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "collections", "serde", @@ -4984,7 +5215,18 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared 0.13.1", + "serde", ] [[package]] @@ -4993,8 +5235,8 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -5003,10 +5245,33 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", "rand 0.8.6", ] +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand 2.4.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "phf_shared" version = "0.11.3" @@ -5016,6 +5281,15 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -5090,7 +5364,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "crc32fast", "fdeflate", "flate2", @@ -5207,7 +5481,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "toml_edit 0.25.12+spec-1.1.0", ] [[package]] @@ -5307,6 +5581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", + "serde", ] [[package]] @@ -5361,7 +5636,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -5524,10 +5799,10 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" dependencies = [ - "objc2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -5561,6 +5836,16 @@ dependencies = [ "font-types", ] +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types", +] + [[package]] name = "recvmsg" version = "1.0.0" @@ -5582,7 +5867,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", ] [[package]] @@ -5619,16 +5904,16 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "derive_refineable", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -5649,9 +5934,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "renderdoc-sys" @@ -5752,9 +6037,9 @@ dependencies = [ [[package]] name = "rust-i18n" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21031bf5e6f2c0ae745d831791c403608e99a8bd3776c7e5e5535acd70c3b7ba" +checksum = "55691a65892c33ee2de49c15ea5600c6f4a70e8eeb8e6c3cd96d2a231d230c40" dependencies = [ "globwalk", "regex", @@ -5765,9 +6050,9 @@ dependencies = [ [[package]] name = "rust-i18n-macro" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fe5295763b358606f7ca26a564e20f4469775a57ec1f09431249a33849ff52" +checksum = "30de488acadcf767d97cd48518a8da8ea9777b1c9a5beca4eab78bbf77d07309" dependencies = [ "glob", "proc-macro2", @@ -5781,18 +6066,15 @@ dependencies = [ [[package]] name = "rust-i18n-support" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69bcc115c8eea2803aa3d85362e339776f4988a0349f2f475af572e497443f6f" +checksum = "aea0fef8a93c06326b66392c95a115120e609674cb2132d37d276a6b05b545b4" dependencies = [ "arc-swap", "base62", "globwalk", "itertools 0.11.0", - "lazy_static", "normpath", - "proc-macro2", - "regex", "serde", "serde_json", "serde_yaml", @@ -5834,7 +6116,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -5847,7 +6129,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.12.1", @@ -5871,9 +6153,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -5923,7 +6205,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "core_maths", "log", @@ -5962,7 +6244,7 @@ dependencies = [ [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "async-task", "backtrace", @@ -6047,7 +6329,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -6262,6 +6544,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -6309,7 +6597,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.37.0", +] + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts 0.39.2", ] [[package]] @@ -6394,7 +6692,7 @@ version = "0.4.0+sdk-1.4.341.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", ] [[package]] @@ -6472,7 +6770,7 @@ checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.11.3", "precomputed-hash", "serde", ] @@ -6483,8 +6781,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", ] @@ -6525,7 +6823,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "heapless", "log", @@ -6536,15 +6834,15 @@ dependencies = [ [[package]] name = "sval" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05195a68cb8336336413c3f52ea0467c7666f5f652e01ba807319ffcc090f2" +checksum = "5fb9efbae90f97301f4d25f3be63dfd99d6b7af9d088228a52ec960d649b2e7d" [[package]] name = "sval_buffer" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2887fd5e2454319f2f170860427f615451bb057fc9b3fd7f28b7a99ac2ccf0e4" +checksum = "ff5c0280ea0af40b3a1fd0b532680b5067482ffb81412ee66ec04b1d9952b49a" dependencies = [ "sval", "sval_ref", @@ -6552,18 +6850,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ddf3833aa407554ad40be081aea9cc3ea6d6798832ec83dd35022b45373896" +checksum = "59b9067f2e68f58e110cf8019a268057e3791cf74b0fdb1b3c7c6e49104f44e6" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94398bdd2ee99eee108e0b7b0df9081700a96cdefac3add5c09ad3e6f2376bcb" +checksum = "96ebdbf0e4b175884aa587fcf551c16dabe245ea04235abdd8cbbd160b27ed5a" dependencies = [ "itoa", "ryu", @@ -6572,9 +6870,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f51ae40f37b541fdf81531e51d5071e8edc7c5a191cc23d288b654995b9eaba" +checksum = "1e448d9fa216a6c16670b28d624fbbcf5c04e41eb187bd7c52e01222ffa72a12" dependencies = [ "itoa", "ryu", @@ -6583,9 +6881,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abe05be8455348e3f6edc14a85fd2fcf32f801a14f0126ce025e63851b4f13b" +checksum = "021de5b5c26efd544c694cef9b8a9abe8633481bf3be1ea145a18a740818b291" dependencies = [ "sval", "sval_buffer", @@ -6594,18 +6892,18 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36361fa3c42c9fd129f4c5023a812d5b275742b28a672c758ec70049c61df00" +checksum = "54ef5ffec8bc52ded04ee424ab8d959e25e64fd40a48a16d21f8991ce824c1bb" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.19.0" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb76707179eccecab345902a803aacacab6889f3af675dbe89766bc790b1a6cb" +checksum = "b983833a8a2390f89ebcf9b9acd06883017014b4ffd72ee28e0c9de6852039f5" dependencies = [ "serde_core", "sval", @@ -6630,11 +6928,11 @@ dependencies = [ [[package]] name = "swash" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" +checksum = "d1804632b66a35ca2b1d277eb0a138e10f46cb365b9a6d297e876b69ef79de43" dependencies = [ - "skrifa", + "skrifa 0.42.1", "yazi", "zeno", ] @@ -6699,7 +6997,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6884,9 +7182,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", "itoa", @@ -6899,15 +7197,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" dependencies = [ "num-conv", "time-core", @@ -7111,9 +7409,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap", "toml_datetime 1.1.1+spec-1.1.0", @@ -7311,9 +7609,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "uds_windows" @@ -7382,9 +7680,9 @@ checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-vo" @@ -7513,7 +7811,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "async-fs", @@ -7538,7 +7836,7 @@ dependencies = [ "serde", "serde_json", "serde_json_lenient", - "shlex", + "shlex 1.3.0", "smol", "take-until", "tempfile", @@ -7552,7 +7850,7 @@ dependencies = [ [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "perf", "quote", @@ -7561,9 +7859,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -7684,11 +7982,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen 0.46.0", + "wit-bindgen 0.57.1", ] [[package]] @@ -7702,9 +8000,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" dependencies = [ "cfg-if", "once_cell", @@ -7715,9 +8013,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" dependencies = [ "js-sys", "wasm-bindgen", @@ -7725,9 +8023,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7735,9 +8033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" dependencies = [ "bumpalo", "proc-macro2", @@ -7748,9 +8046,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" dependencies = [ "unicode-ident", ] @@ -7808,7 +8106,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -7834,7 +8132,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -7857,7 +8155,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7869,7 +8167,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7882,7 +8180,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7914,9 +8212,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" dependencies = [ "js-sys", "wasm-bindgen", @@ -7953,7 +8251,7 @@ version = "29.0.3" source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9daea5d2eaa83150b79e88#357a0c56e0070480ad9daea5d2eaa83150b79e88" dependencies = [ "arrayvec", - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "cfg-if", "cfg_aliases", @@ -7984,7 +8282,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "cfg_aliases", "document-features", @@ -8041,8 +8339,8 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.1", - "block2", + "bitflags 2.13.0", + "block2 0.6.2", "bytemuck", "cfg-if", "cfg_aliases", @@ -8058,11 +8356,11 @@ dependencies = [ "log", "naga", "ndk-sys", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", "once_cell", "ordered-float", "parking_lot", @@ -8099,7 +8397,7 @@ name = "wgpu-types" version = "29.0.3" source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9daea5d2eaa83150b79e88#357a0c56e0070480ad9daea5d2eaa83150b79e88" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "bytemuck", "js-sys", "log", @@ -8452,6 +8750,15 @@ 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.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -8651,12 +8958,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -8666,6 +8967,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -8715,7 +9022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.13.0", "indexmap", "log", "serde", @@ -8846,7 +9153,7 @@ name = "xim-parser" version = "0.2.1" source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", ] [[package]] @@ -8927,9 +9234,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -8950,9 +9257,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.13.2" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" dependencies = [ "async-broadcast", "async-executor", @@ -8977,17 +9284,41 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 0.7.15", + "winnow 1.0.3", "zbus_macros", "zbus_names", "zvariant", ] +[[package]] +name = "zbus-lockstep" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + [[package]] name = "zbus_macros" -version = "5.13.2" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9000,12 +9331,24 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" dependencies = [ "serde", - "winnow 0.7.15", + "winnow 1.0.3", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" +dependencies = [ + "quick-xml 0.39.4", + "serde", + "zbus_names", "zvariant", ] @@ -9014,7 +9357,7 @@ name = "zed-font-kit" version = "0.14.1-zed" source = "git+https://github.com/zed-industries/font-kit?rev=94b0f28166665e8fd2f53ff6d268a14955c82269#94b0f28166665e8fd2f53ff6d268a14955c82269" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "byteorder", "core-foundation 0.10.0", "core-graphics 0.24.0", @@ -9136,18 +9479,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", @@ -9231,7 +9574,7 @@ dependencies = [ [[package]] name = "zlog" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "anyhow", "chrono", @@ -9248,7 +9591,7 @@ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "ztracing" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" dependencies = [ "tracing", "tracing-subscriber", @@ -9259,7 +9602,7 @@ dependencies = [ [[package]] name = "ztracing_macro" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" +source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" [[package]] name = "zune-core" @@ -9302,24 +9645,24 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.9.2" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" dependencies = [ "endi", "enumflags2", "serde", "serde_bytes", - "winnow 0.7.15", + "winnow 1.0.3", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.9.2" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9330,13 +9673,13 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" dependencies = [ "proc-macro2", "quote", "serde", "syn", - "winnow 0.7.15", + "winnow 1.0.3", ] diff --git a/crates/openlogi-hook/Cargo.toml b/crates/openlogi-hook/Cargo.toml index 1a67adfe..a2ab0fc1 100644 --- a/crates/openlogi-hook/Cargo.toml +++ b/crates/openlogi-hook/Cargo.toml @@ -16,7 +16,10 @@ tracing = { workspace = true } [target.'cfg(target_os = "linux")'.dependencies] evdev = "0.13" libc = "0.2" +wayland-client = "0.31" +wayland-protocols-wlr = { version = "0.3", features = ["client"] } x11rb = "0.13" +zbus = "5" [target.'cfg(target_os = "linux")'.dev-dependencies] ctrlc = "3" diff --git a/crates/openlogi-hook/gnome-shell-extension/README.md b/crates/openlogi-hook/gnome-shell-extension/README.md new file mode 100644 index 00000000..e58cd26a --- /dev/null +++ b/crates/openlogi-hook/gnome-shell-extension/README.md @@ -0,0 +1,59 @@ +# OpenLogi Frontmost Window — GNOME Shell extension + +GNOME (Mutter) does not let ordinary clients see which window is focused on +Wayland, and it implements neither `wlr-foreign-toplevel` nor a focused-window +portal. This minimal extension bridges that gap: it exports the WM_CLASS of the +focused window over D-Bus so OpenLogi's `gnome-shell` frontmost backend can +drive per-app mouse-profile switching. + +It reads only `global.display.focus_window.get_wm_class()`. No titles, no window +contents, no input, no UI. + +## D-Bus surface + +- name: `org.openlogi.Frontmost` +- path: `/org/openlogi/Frontmost` +- method: `GetFocusedWmClass() -> s` (empty string when nothing is focused) + +## Install + +```sh +UUID=openlogi-frontmost@openlogi.dev +DEST="$HOME/.local/share/gnome-shell/extensions/$UUID" +mkdir -p "$DEST" +cp metadata.json extension.js "$DEST"/ +``` + +On Wayland the shell cannot be reloaded in place, so **log out and back in** to +let GNOME pick up the newly added extension, then enable it: + +```sh +gnome-extensions enable "$UUID" +gnome-extensions info "$UUID" # State should be ACTIVE +``` + +## Verify + +```sh +# Introspect the service: +busctl --user introspect org.openlogi.Frontmost /org/openlogi/Frontmost + +# Focus a window, then query it: +gdbus call --session \ + -d org.openlogi.Frontmost \ + -o /org/openlogi/Frontmost \ + -m org.openlogi.Frontmost.GetFocusedWmClass +``` + +If `gdbus call` prints the focused window's WM_CLASS, OpenLogi's GNOME backend +will pick it up automatically the next time the hook starts. + +## Notes + +- The `shell-version` list in `metadata.json` covers GNOME 45–50. Newer GNOME + releases may need an added entry; the API used here (`Gio.DBusExportedObject`, + `global.display.focus_window`, `Meta.Window.get_wm_class`) has been stable + across these versions. +- The extension name/UUID and the D-Bus name (`org.openlogi.*`) are placeholders + that should track the project's namespace; if they change, update the matching + constants in `crates/openlogi-hook/src/linux/gnome_shell.rs`. diff --git a/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/extension.js b/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/extension.js new file mode 100644 index 00000000..a0f9e4a8 --- /dev/null +++ b/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/extension.js @@ -0,0 +1,55 @@ +// OpenLogi Frontmost Window — GNOME Shell extension. +// +// Exports a tiny D-Bus service that returns the WM_CLASS of the currently +// focused window. OpenLogi's `gnome_shell` frontmost backend polls this to +// drive per-app mouse-profile switching on GNOME Wayland, where the focused +// window is otherwise not visible to ordinary clients. +// +// It reads only `global.display.focus_window.get_wm_class()` — no titles, no +// window contents, no input. ESM module style; targets GNOME Shell 45+. + +import Gio from 'gi://Gio'; +import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; + +const DBUS_NAME = 'org.openlogi.Frontmost'; +const DBUS_PATH = '/org/openlogi/Frontmost'; +const DBUS_INTERFACE = ` + + + + + + +`; + +export default class OpenLogiFrontmostExtension extends Extension { + enable() { + this._dbus = Gio.DBusExportedObject.wrapJSObject(DBUS_INTERFACE, this); + this._dbus.export(Gio.DBus.session, DBUS_PATH); + this._nameId = Gio.bus_own_name_on_connection( + Gio.DBus.session, + DBUS_NAME, + Gio.BusNameOwnerFlags.NONE, + null, + null); + } + + disable() { + if (this._nameId) { + Gio.bus_unown_name(this._nameId); + this._nameId = 0; + } + if (this._dbus) { + this._dbus.unexport(); + this._dbus = null; + } + } + + // D-Bus method org.openlogi.Frontmost.GetFocusedWmClass. + GetFocusedWmClass() { + const win = global.display.focus_window; + if (!win) + return ''; + return win.get_wm_class() || ''; + } +} diff --git a/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/metadata.json b/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/metadata.json new file mode 100644 index 00000000..068f8493 --- /dev/null +++ b/crates/openlogi-hook/gnome-shell-extension/openlogi-frontmost@openlogi.dev/metadata.json @@ -0,0 +1,8 @@ +{ + "uuid": "openlogi-frontmost@openlogi.dev", + "name": "OpenLogi Frontmost Window", + "description": "Exposes the focused window's WM_CLASS over D-Bus so OpenLogi can switch per-app mouse profiles on GNOME Wayland. Read-only; no UI, no window contents.", + "shell-version": ["45", "46", "47", "48", "49", "50"], + "url": "https://github.com/AprilNEA/OpenLogi", + "version": 1 +} diff --git a/crates/openlogi-hook/src/linux.rs b/crates/openlogi-hook/src/linux.rs index a36913bc..1ce40cc2 100644 --- a/crates/openlogi-hook/src/linux.rs +++ b/crates/openlogi-hook/src/linux.rs @@ -379,70 +379,220 @@ fn device_thread( // ── frontmost_bundle_id ────────────────────────────────────────────────────── -struct X11State { +// The frontmost-app reader is backend-driven so that Wayland support can be +// added without touching callers. Exactly one backend is selected at startup +// from the session environment (see `detect_frontmost_source`) and cached in +// `FRONTMOST_SOURCE` for the process lifetime. Today only the X11 backend +// exists; Wayland-native backends slot into `wayland_candidates`. + +mod gnome_shell; +mod wlr_foreign_toplevel; + +/// A backend that reports which application is currently frontmost. +/// +/// Implementations are display-server / desktop specific. The string returned +/// by `frontmost_bundle_id` is compared against per-app profile keys by exact +/// match (`openlogi_core::Config::effective_bindings`), so its exact form +/// matters and is backend-specific. The X11 and gnome-shell backends both +/// return the `WM_CLASS` class component (e.g. "Firefox"); the wlr backend +/// returns the xdg-shell `app_id` (e.g. "org.mozilla.firefox"). These two +/// namespaces do not map onto each other by any simple string rule, so a +/// per-app profile created under wlroots will not match under GNOME/X11 and +/// vice versa. This is a known limitation: reconciling it needs a canonical-id +/// scheme or per-profile aliases rather than naive normalization, and is +/// deliberately out of scope for the backends themselves. +trait FrontmostSource: Send + Sync { + /// Opaque identifier of the frontmost application, or `None` when there is + /// no frontmost window or it cannot be read. + fn frontmost_bundle_id(&self) -> Option; + + /// Short backend identifier, for diagnostics / logging only. + fn name(&self) -> &'static str; +} + +/// Frontmost backend backed by X11 `_NET_ACTIVE_WINDOW` + `WM_CLASS`. +/// +/// Works on an X11 session, and on a Wayland session for XWayland windows; +/// native Wayland windows are invisible through this path and yield `None`. +struct X11Source { conn: RustConnection, root: Window, net_active_window: Atom, } -static X11_STATE: LazyLock> = LazyLock::new(|| { - let (conn, screen_num) = RustConnection::connect(None) - .map_err(|e| debug!("X11 not available, frontmost_bundle_id will return None: {e}")) - .ok()?; - let root = conn.setup().roots[screen_num].root; - let net_active_window = conn - .intern_atom(false, b"_NET_ACTIVE_WINDOW") - .ok()? - .reply() - .ok()? - .atom; - Some(X11State { - conn, - root, - net_active_window, - }) -}); +impl X11Source { + /// Connect to the X server and resolve the `_NET_ACTIVE_WINDOW` atom. + /// Returns `None` when no X display is reachable (a Wayland session without + /// XWayland, or `$DISPLAY` unset). + fn connect() -> Option { + let (conn, screen_num) = RustConnection::connect(None) + .map_err(|e| debug!("X11 not available, frontmost will return None: {e}")) + .ok()?; + let root = conn.setup().roots[screen_num].root; + let net_active_window = conn + .intern_atom(false, b"_NET_ACTIVE_WINDOW") + .ok()? + .reply() + .ok()? + .atom; + Some(Self { + conn, + root, + net_active_window, + }) + } +} + +impl FrontmostSource for X11Source { + fn frontmost_bundle_id(&self) -> Option { + // _NET_ACTIVE_WINDOW on the root window holds the focused window's XID. + let window: Window = self + .conn + .get_property( + false, + self.root, + self.net_active_window, + AtomEnum::WINDOW, + 0, + 1, + ) + .ok()? + .reply() + .ok()? + .value32()? + .next()?; + if window == 0 { + return None; + } + + // WM_CLASS is instance_name\0class_name\0; the class component is more + // stable across window instances and is what profiles should key on + // (e.g. "Firefox", not "Navigator"). + let wm = WmClass::get(&self.conn, window) + .ok()? + .reply_unchecked() + .ok()??; + std::str::from_utf8(wm.class()) + .ok() + .filter(|s| !s.is_empty()) + .map(str::to_owned) + } + + fn name(&self) -> &'static str { + "x11" + } +} + +/// Fallback used when no backend is available (e.g. a pure Wayland session +/// before any Wayland backend lands). Always reports `None`, so per-app +/// profile switching simply no-ops rather than erroring. +struct NullSource; + +impl FrontmostSource for NullSource { + fn frontmost_bundle_id(&self) -> Option { + None + } + + fn name(&self) -> &'static str { + "null" + } +} + +/// Coarse classification of the graphical session, used to order the frontmost +/// backend candidates. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum SessionKind { + X11, + Wayland, + Unknown, +} + +/// Classify the session from the environment. `XDG_SESSION_TYPE` is +/// authoritative when set to `x11` or `wayland`; otherwise fall back to the +/// presence of `WAYLAND_DISPLAY` / `DISPLAY`. +fn detect_session_kind() -> SessionKind { + if let Ok(kind) = std::env::var("XDG_SESSION_TYPE") { + match kind.as_str() { + "wayland" => return SessionKind::Wayland, + "x11" => return SessionKind::X11, + _ => {} + } + } + if std::env::var_os("WAYLAND_DISPLAY").is_some() { + SessionKind::Wayland + } else if std::env::var_os("DISPLAY").is_some() { + SessionKind::X11 + } else { + SessionKind::Unknown + } +} + +/// A backend constructor: returns the backend if it can initialize on this +/// system, or `None` to fall through to the next candidate. +type Candidate = fn() -> Option>; + +fn x11_candidate() -> Option> { + X11Source::connect().map(|s| Box::new(s) as Box) +} + +/// Wayland-native frontmost backends, in priority order: the wlroots +/// foreign-toplevel protocol (sway, Hyprland, river, …) and the GNOME Shell +/// D-Bus extension (Mutter). AT-SPI remains a future fallback. Compositors that +/// support none of these fall through to the X11/XWayland path (which resolves +/// XWayland windows, `None` for native Wayland apps). +fn wayland_candidates() -> Vec { + vec![ + wlr_foreign_toplevel::candidate, + gnome_shell::candidate, + ] +} + +/// Pick the frontmost backend for this session, trying each candidate in order +/// and keeping the first that initializes. Called once, lazily, per process. +fn detect_frontmost_source() -> Box { + let session = detect_session_kind(); + debug!("frontmost: session kind = {session:?}"); + + let mut candidates: Vec = match session { + SessionKind::Wayland => wayland_candidates(), + SessionKind::X11 | SessionKind::Unknown => Vec::new(), + }; + // X11 / XWayland: the primary path on an X11 session and the universal + // fallback everywhere else. + candidates.push(x11_candidate); + + for candidate in candidates { + if let Some(source) = candidate() { + debug!("frontmost: using '{}' backend", source.name()); + // On Wayland, landing on the X11 backend means no native Wayland + // frontmost source was available, so native Wayland windows will + // report None (only XWayland windows resolve). Hint at the fix. + if session == SessionKind::Wayland && source.name() == "x11" { + debug!( + "frontmost: on Wayland but using the X11/XWayland backend; \ + native Wayland windows will report None. Install the OpenLogi \ + GNOME Shell extension (GNOME) or use a wlroots compositor." + ); + } + return source; + } + } + + debug!("frontmost: no usable backend; frontmost_bundle_id will return None"); + Box::new(NullSource) +} + +static FRONTMOST_SOURCE: LazyLock> = + LazyLock::new(detect_frontmost_source); -/// Return the X11 `WM_CLASS` class component of the currently active window, -/// e.g. `"Firefox"` or `"Code"`. +/// Return an opaque identifier of the currently frontmost application, or +/// `None` when unavailable. Dispatches to the backend chosen at startup. /// -/// Returns `None` when there is no active window, when the X11 display is -/// unavailable (Wayland-only session without XWayland), or on read error. -/// Native Wayland windows are not visible through this path. +/// On an X11 session this is the `WM_CLASS` class component (e.g. "Firefox"). +/// On a pure Wayland session it is currently `None` until a Wayland backend is +/// added; XWayland windows are still resolved via the X11 backend. pub(crate) fn frontmost_bundle_id() -> Option { - let state = X11_STATE.as_ref()?; - - // _NET_ACTIVE_WINDOW on the root window holds the focused window's XID. - let window: Window = state - .conn - .get_property( - false, - state.root, - state.net_active_window, - AtomEnum::WINDOW, - 0, - 1, - ) - .ok()? - .reply() - .ok()? - .value32()? - .next()?; - if window == 0 { - return None; - } - - // WM_CLASS is instance_name\0class_name\0; the class component is more - // stable across window instances and is what profiles should key on - // (e.g. "Firefox", not "Navigator"). - let wm = WmClass::get(&state.conn, window) - .ok()? - .reply_unchecked() - .ok()??; - std::str::from_utf8(wm.class()) - .ok() - .filter(|s| !s.is_empty()) - .map(str::to_owned) + FRONTMOST_SOURCE.frontmost_bundle_id() } #[cfg(test)] diff --git a/crates/openlogi-hook/src/linux/gnome_shell.rs b/crates/openlogi-hook/src/linux/gnome_shell.rs new file mode 100644 index 00000000..8e14c434 --- /dev/null +++ b/crates/openlogi-hook/src/linux/gnome_shell.rs @@ -0,0 +1,97 @@ +//! Frontmost backend for GNOME Shell (Wayland and X11), via a small companion +//! GNOME Shell extension that exports the focused window's WM_CLASS over D-Bus. +//! +//! GNOME (Mutter) implements neither wlr-foreign-toplevel nor any portal for +//! the focused window, and `org.gnome.Shell.Eval` is disabled by default, so a +//! privileged GNOME Shell extension is the only way to read the focused window +//! on a GNOME Wayland session. The extension lives in `gnome-shell-extension/` +//! in this crate and must be installed and enabled for this backend to +//! activate. When it is absent, [`GnomeShellSource::connect`] fails and backend +//! selection falls through to the next candidate (XWayland via X11). +//! +//! The extension returns the WM_CLASS — not the `.desktop` id — so the +//! identifier matches the X11 backend's, keeping per-app profile keys +//! consistent across X11, XWayland, and GNOME Wayland sessions. +//! +//! Only the session-bus connection is held in the backend; a lightweight proxy +//! is built per poll (no extra D-Bus traffic beyond the method call itself). + +use std::time::Duration; + +use tracing::debug; +use zbus::blocking::Connection; +use zbus::blocking::connection::Builder; +use zbus::proxy; + +use super::FrontmostSource; + +/// Cap on every D-Bus call to the extension. Without it, a stalled GNOME Shell +/// would block the polling thread forever (the probe runs inside the +/// `FRONTMOST_SOURCE` initializer, so a stall there would block every thread +/// that touches it). +const METHOD_TIMEOUT: Duration = Duration::from_secs(5); + +/// D-Bus proxy for the OpenLogi GNOME Shell extension. Only the blocking proxy +/// is generated (`gen_async = false`), matching the synchronous poll contract. +#[proxy( + interface = "org.openlogi.Frontmost", + default_service = "org.openlogi.Frontmost", + default_path = "/org/openlogi/Frontmost", + gen_async = false +)] +trait Frontmost { + /// WM_CLASS of the focused window, or "" when nothing is focused. + #[zbus(name = "GetFocusedWmClass")] + fn get_focused_wm_class(&self) -> zbus::Result; +} + +/// Frontmost backend talking to the OpenLogi GNOME Shell extension over the +/// session bus. +struct GnomeShellSource { + conn: Connection, +} + +impl GnomeShellSource { + fn connect() -> Option { + let conn = Builder::session() + .map_err(|e| debug!("gnome-shell: no session bus: {e}")) + .ok()? + .method_timeout(METHOD_TIMEOUT) + .build() + .map_err(|e| debug!("gnome-shell: connection build failed: {e}")) + .ok()?; + // Probe reachability: a successful call (even an empty result) means the + // OpenLogi extension is installed and exporting the service. An error + // means it is absent/disabled, so this backend must not be selected. + let proxy = FrontmostProxy::new(&conn) + .map_err(|e| debug!("gnome-shell: proxy build failed: {e}")) + .ok()?; + proxy + .get_focused_wm_class() + .map_err(|e| debug!("gnome-shell: OpenLogi extension not reachable: {e}")) + .ok()?; + Some(Self { conn }) + } +} + +impl FrontmostSource for GnomeShellSource { + fn frontmost_bundle_id(&self) -> Option { + let proxy = FrontmostProxy::new(&self.conn) + .map_err(|e| debug!("gnome-shell: proxy build failed: {e}")) + .ok()?; + let wm_class = proxy + .get_focused_wm_class() + .map_err(|e| debug!("gnome-shell: poll failed (extension gone or bus down?): {e}")) + .ok()?; + (!wm_class.is_empty()).then_some(wm_class) + } + + fn name(&self) -> &'static str { + "gnome-shell" + } +} + +/// Candidate constructor registered in [`super::wayland_candidates`]. +pub(super) fn candidate() -> Option> { + GnomeShellSource::connect().map(|s| Box::new(s) as Box) +} diff --git a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs new file mode 100644 index 00000000..f7c6419a --- /dev/null +++ b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs @@ -0,0 +1,269 @@ +//! Frontmost backend using the wlroots `zwlr_foreign_toplevel_management_v1` +//! protocol. +//! +//! The manager hands out one handle per toplevel window; each handle reports +//! its `app_id` and a `state` set. The frontmost window is the toplevel whose +//! state set contains `activated`, and its `app_id` is what we return. +//! +//! Note on the returned identifier: this is the xdg-shell `app_id` (e.g. +//! "org.mozilla.firefox", "Alacritty", "foot"), which is a *different namespace* +//! from the `WM_CLASS` returned by the X11 and gnome-shell backends (e.g. +//! "Firefox"). Because profile lookup is an exact match, a per-app profile +//! created under wlroots will not match under GNOME/X11 and vice versa. We +//! deliberately return the native `app_id` rather than a lossy WM_CLASS +//! approximation (stripping reverse-DNS and capitalizing guesses wrong for many +//! apps); reconciling the two namespaces belongs in a single normalization +//! layer, not here. See the `FrontmostSource` trait doc in `linux.rs`. +//! +//! This protocol is implemented by wlroots-based compositors (sway, Hyprland, +//! river, Wayfire, …). GNOME (Mutter) and KDE (KWin) do not advertise it, so +//! [`connect`](WlrForeignToplevelSource::connect) returns `None` there and the +//! caller falls through to the next backend candidate. +//! +//! The protocol is event-driven, but the [`super::FrontmostSource`] contract is +//! a synchronous poll (~1 Hz from `openlogi-gui::app_watcher`). To bridge that, +//! the connection, event queue, and accumulated state are kept alive in the +//! backend and a `roundtrip` is performed on each poll to drain pending events +//! (focus changes, new / closed windows) before reading the active toplevel. + +use std::collections::HashMap; +use std::sync::Mutex; + +use tracing::{debug, warn}; +use wayland_client::backend::ObjectId; +use wayland_client::protocol::wl_registry::{self, WlRegistry}; +use wayland_client::{Connection, Dispatch, EventQueue, Proxy, QueueHandle, event_created_child}; +use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_handle_v1::{ + self, ZwlrForeignToplevelHandleV1, +}; +use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_manager_v1::{ + self, ZwlrForeignToplevelManagerV1, +}; + +use super::FrontmostSource; + +/// Highest protocol version this backend understands. The events it relies on +/// (`app_id`, `state`, `done`, `closed`) exist since v1, so binding is capped +/// here to stay within what `wayland-protocols-wlr` generates. +const MANAGER_MAX_VERSION: u32 = 3; + +/// Accumulated per-toplevel data. wlr sends individual property events and then +/// a `done` marking a consistent snapshot, so updates are staged in `pending_*` +/// and committed on `done`. +#[derive(Default)] +struct Toplevel { + app_id: Option, + activated: bool, + pending_app_id: Option, + pending_activated: bool, +} + +/// Dispatch state: the bound manager plus the toplevels seen so far. +#[derive(Default)] +struct State { + manager: Option, + toplevels: HashMap, + /// Set when the compositor sends `finished`; the manager is then defunct. + finished: bool, +} + +impl Dispatch for State { + fn event( + state: &mut Self, + registry: &WlRegistry, + event: wl_registry::Event, + (): &(), + _: &Connection, + qh: &QueueHandle, + ) { + if let wl_registry::Event::Global { + name, + interface, + version, + } = event + { + if interface == ZwlrForeignToplevelManagerV1::interface().name { + let version = version.min(MANAGER_MAX_VERSION); + let manager = + registry.bind::(name, version, qh, ()); + state.manager = Some(manager); + } + } + } +} + +impl Dispatch for State { + fn event( + state: &mut Self, + _: &ZwlrForeignToplevelManagerV1, + event: zwlr_foreign_toplevel_manager_v1::Event, + (): &(), + _: &Connection, + _: &QueueHandle, + ) { + match event { + zwlr_foreign_toplevel_manager_v1::Event::Toplevel { toplevel } => { + state.toplevels.insert(toplevel.id(), Toplevel::default()); + } + zwlr_foreign_toplevel_manager_v1::Event::Finished => { + // sway emits this on config reload and compositor restart. The + // manager is now defunct and the backend is cached for the + // process lifetime, so per-app profiles stay disabled until the + // hook is restarted. + warn!( + "wlr-foreign-toplevel: compositor sent Finished — per-app \ + profiles disabled until the hook restarts" + ); + state.finished = true; + state.manager = None; + } + _ => {} + } + } + + // The `toplevel` event creates a new handle object; tell the backend to + // route its events to this same `State` with `()` user data. + event_created_child!(State, ZwlrForeignToplevelManagerV1, [ + zwlr_foreign_toplevel_manager_v1::EVT_TOPLEVEL_OPCODE => (ZwlrForeignToplevelHandleV1, ()), + ]); +} + +impl Dispatch for State { + fn event( + state: &mut Self, + handle: &ZwlrForeignToplevelHandleV1, + event: zwlr_foreign_toplevel_handle_v1::Event, + (): &(), + _: &Connection, + _: &QueueHandle, + ) { + use zwlr_foreign_toplevel_handle_v1::Event; + + let id = handle.id(); + match event { + Event::AppId { app_id } => { + if let Some(toplevel) = state.toplevels.get_mut(&id) { + toplevel.pending_app_id = Some(app_id); + } + } + Event::State { state: states } => { + let activated = is_activated(&states); + if let Some(toplevel) = state.toplevels.get_mut(&id) { + toplevel.pending_activated = activated; + } + } + Event::Done => { + if let Some(toplevel) = state.toplevels.get_mut(&id) { + // app_id is sent only when it changes, and a compositor may + // emit State + Done before the first AppId. Committing + // `pending_app_id` unconditionally would clobber a known id + // (or the initial one) with None, so only overwrite when a + // value is actually pending. `activated` defaults to false, + // which is the correct state for a window that sent none. + if toplevel.pending_app_id.is_some() { + toplevel.app_id = toplevel.pending_app_id.clone(); + } + toplevel.activated = toplevel.pending_activated; + } + } + Event::Closed => { + state.toplevels.remove(&id); + handle.destroy(); + } + // Title, output enter/leave, and parent are not needed for frontmost. + _ => {} + } + } +} + +/// The `state` event carries a `wl_array` of native-endian `u32` state values. +/// A toplevel is frontmost iff the `activated` value is present in that set. +fn is_activated(states: &[u8]) -> bool { + use zwlr_foreign_toplevel_handle_v1::State; + + states.chunks_exact(4).any(|chunk| { + let value = u32::from_ne_bytes([chunk[0], chunk[1], chunk[2], chunk[3]]); + State::try_from(value).is_ok_and(|s| s == State::Activated) + }) +} + +/// Wayland frontmost backend. Holds the connection, event queue, and dispatch +/// state alive for the process; each poll drains events and reads the active +/// toplevel's `app_id`. +struct WlrForeignToplevelSource { + // Kept alive so the protocol objects owned by the queue stay valid. + #[allow(dead_code)] + conn: Connection, + // Behind a mutex because the trait polls through `&self` while `roundtrip` + // needs `&mut`. The queue is only ever touched here, at ~1 Hz. + dispatcher: Mutex, +} + +struct Dispatcher { + queue: EventQueue, + state: State, +} + +impl WlrForeignToplevelSource { + fn connect() -> Option { + let conn = Connection::connect_to_env() + .map_err(|e| debug!("wlr-foreign-toplevel: no Wayland connection: {e}")) + .ok()?; + let mut queue = conn.new_event_queue(); + let qh = queue.handle(); + + // Registering the registry triggers `global` events on the next + // round-trip, where the manager is bound if the compositor advertises + // it. The registry handle is only needed for that round-trip. + let _registry = conn.display().get_registry(&qh, ()); + let mut state = State::default(); + queue + .roundtrip(&mut state) + .map_err(|e| debug!("wlr-foreign-toplevel: registry roundtrip failed: {e}")) + .ok()?; + if state.manager.is_none() { + debug!("wlr-foreign-toplevel: compositor does not advertise the protocol"); + return None; + } + + // Second round-trip: receive the initial toplevel list and properties, + // so the first poll already has the active window. + queue + .roundtrip(&mut state) + .map_err(|e| debug!("wlr-foreign-toplevel: initial roundtrip failed: {e}")) + .ok()?; + + Some(Self { + conn, + dispatcher: Mutex::new(Dispatcher { queue, state }), + }) + } +} + +impl FrontmostSource for WlrForeignToplevelSource { + fn frontmost_bundle_id(&self) -> Option { + let mut guard = self.dispatcher.lock().ok()?; + let Dispatcher { queue, state } = &mut *guard; + + // Drain focus changes and new / closed windows since the last poll. + queue.roundtrip(state).ok()?; + if state.finished { + return None; + } + + state + .toplevels + .values() + .find(|toplevel| toplevel.activated) + .and_then(|toplevel| toplevel.app_id.clone()) + } + + fn name(&self) -> &'static str { + "wlr-foreign-toplevel" + } +} + +/// Candidate constructor registered in [`super::wayland_candidates`]. +pub(super) fn candidate() -> Option> { + WlrForeignToplevelSource::connect().map(|s| Box::new(s) as Box) +} From 93e69c40e00c1d8a8dd523279baa322e309b0143 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Tue, 9 Jun 2026 18:21:41 -0300 Subject: [PATCH 2/9] style: fix rustfmt on wayland_candidates vec literal Co-Authored-By: Claude Sonnet 4.6 --- crates/openlogi-hook/src/linux.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/openlogi-hook/src/linux.rs b/crates/openlogi-hook/src/linux.rs index 1ce40cc2..a4f9f766 100644 --- a/crates/openlogi-hook/src/linux.rs +++ b/crates/openlogi-hook/src/linux.rs @@ -541,10 +541,7 @@ fn x11_candidate() -> Option> { /// support none of these fall through to the X11/XWayland path (which resolves /// XWayland windows, `None` for native Wayland apps). fn wayland_candidates() -> Vec { - vec![ - wlr_foreign_toplevel::candidate, - gnome_shell::candidate, - ] + vec![wlr_foreign_toplevel::candidate, gnome_shell::candidate] } /// Pick the frontmost backend for this session, trying each candidate in order From 6c857a3a2af532b67ea57a7ad55443c861f32db3 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Tue, 9 Jun 2026 18:37:01 -0300 Subject: [PATCH 3/9] fix(hook): reconnect wlr backend after Finished; fix stale doc comments When the compositor sends `Finished` (e.g. on swaymsg reload), the wlr backend now tries to reopen the session on the next poll instead of permanently disabling per-app profiles. The session (conn + queue + state) is grouped behind a single mutex so the whole thing can be rebuilt atomically; a failed reconnect retries at the next 1 Hz tick. Also update two stale doc comments in linux.rs that still described the pre-PR state (X11-only / "None until a Wayland backend is added"). Co-Authored-By: Claude Sonnet 4.6 --- crates/openlogi-hook/src/linux.rs | 8 +- .../src/linux/wlr_foreign_toplevel.rs | 82 ++++++++++++------- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/crates/openlogi-hook/src/linux.rs b/crates/openlogi-hook/src/linux.rs index a4f9f766..0ef718c6 100644 --- a/crates/openlogi-hook/src/linux.rs +++ b/crates/openlogi-hook/src/linux.rs @@ -382,8 +382,8 @@ fn device_thread( // The frontmost-app reader is backend-driven so that Wayland support can be // added without touching callers. Exactly one backend is selected at startup // from the session environment (see `detect_frontmost_source`) and cached in -// `FRONTMOST_SOURCE` for the process lifetime. Today only the X11 backend -// exists; Wayland-native backends slot into `wayland_candidates`. +// `FRONTMOST_SOURCE` for the process lifetime. The X11, wlr-foreign-toplevel, +// and gnome-shell backends are all available; see `wayland_candidates`. mod gnome_shell; mod wlr_foreign_toplevel; @@ -586,8 +586,8 @@ static FRONTMOST_SOURCE: LazyLock> = /// `None` when unavailable. Dispatches to the backend chosen at startup. /// /// On an X11 session this is the `WM_CLASS` class component (e.g. "Firefox"). -/// On a pure Wayland session it is currently `None` until a Wayland backend is -/// added; XWayland windows are still resolved via the X11 backend. +/// On a Wayland session the wlr-foreign-toplevel or gnome-shell backend is used +/// when available; XWayland windows fall back to the X11 backend. pub(crate) fn frontmost_bundle_id() -> Option { FRONTMOST_SOURCE.frontmost_bundle_id() } diff --git a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs index f7c6419a..a1cb51fe 100644 --- a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs +++ b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs @@ -29,7 +29,7 @@ use std::collections::HashMap; use std::sync::Mutex; -use tracing::{debug, warn}; +use tracing::{debug, info, warn}; use wayland_client::backend::ObjectId; use wayland_client::protocol::wl_registry::{self, WlRegistry}; use wayland_client::{Connection, Dispatch, EventQueue, Proxy, QueueHandle, event_created_child}; @@ -63,7 +63,8 @@ struct Toplevel { struct State { manager: Option, toplevels: HashMap, - /// Set when the compositor sends `finished`; the manager is then defunct. + /// Set when the compositor sends `finished`; triggers a reconnect on the + /// next poll instead of permanently disabling the backend. finished: bool, } @@ -106,13 +107,11 @@ impl Dispatch for State { state.toplevels.insert(toplevel.id(), Toplevel::default()); } zwlr_foreign_toplevel_manager_v1::Event::Finished => { - // sway emits this on config reload and compositor restart. The - // manager is now defunct and the backend is cached for the - // process lifetime, so per-app profiles stay disabled until the - // hook is restarted. + // The compositor is reloading or restarting. Mark the session + // finished; the next poll will reconnect automatically. warn!( - "wlr-foreign-toplevel: compositor sent Finished — per-app \ - profiles disabled until the hook restarts" + "wlr-foreign-toplevel: compositor sent Finished — \ + will reconnect on next poll" ); state.finished = true; state.manager = None; @@ -187,25 +186,23 @@ fn is_activated(states: &[u8]) -> bool { }) } -/// Wayland frontmost backend. Holds the connection, event queue, and dispatch -/// state alive for the process; each poll drains events and reads the active -/// toplevel's `app_id`. -struct WlrForeignToplevelSource { - // Kept alive so the protocol objects owned by the queue stay valid. - #[allow(dead_code)] - conn: Connection, - // Behind a mutex because the trait polls through `&self` while `roundtrip` - // needs `&mut`. The queue is only ever touched here, at ~1 Hz. - dispatcher: Mutex, -} - -struct Dispatcher { +/// One live Wayland session: connection + event queue + dispatch state. +/// +/// Grouping all three behind a single mutex means the whole session can be +/// dropped and rebuilt atomically when the compositor sends `Finished`. +struct Session { + // Held for RAII — even though `Connection` is Arc-backed, keeping an + // explicit handle here ensures the connection outlives the queue. + _conn: Connection, queue: EventQueue, state: State, } -impl WlrForeignToplevelSource { - fn connect() -> Option { +impl Session { + /// Open a fresh connection, bind the manager, and do the initial two + /// round-trips to populate the toplevel list. Returns `None` when the + /// compositor doesn't advertise the protocol or the connection fails. + fn open() -> Option { let conn = Connection::connect_to_env() .map_err(|e| debug!("wlr-foreign-toplevel: no Wayland connection: {e}")) .ok()?; @@ -234,20 +231,49 @@ impl WlrForeignToplevelSource { .ok()?; Some(Self { - conn, - dispatcher: Mutex::new(Dispatcher { queue, state }), + _conn: conn, + queue, + state, + }) + } +} + +/// Wayland frontmost backend. Holds the session behind a mutex so the whole +/// connection can be rebuilt on compositor restart without touching callers. +struct WlrForeignToplevelSource { + // Active session, or `None` when the last reconnect attempt failed. + // The mutex bridges the event-driven Wayland runtime to the synchronous + // poll contract; the session is only ever touched here, at ~1 Hz. + session: Mutex>, +} + +impl WlrForeignToplevelSource { + fn connect() -> Option { + Session::open().map(|s| Self { + session: Mutex::new(Some(s)), }) } } impl FrontmostSource for WlrForeignToplevelSource { fn frontmost_bundle_id(&self) -> Option { - let mut guard = self.dispatcher.lock().ok()?; - let Dispatcher { queue, state } = &mut *guard; + let mut guard = self.session.lock().ok()?; + + // Reconnect when the compositor sent `Finished` (compositor reload / + // restart) or when a prior reconnect attempt failed. + let needs_reconnect = guard.as_ref().map_or(true, |s| s.state.finished); + if needs_reconnect { + *guard = Session::open(); + match &*guard { + Some(_) => info!("wlr-foreign-toplevel: reconnected"), + None => debug!("wlr-foreign-toplevel: reconnect pending, retrying next poll"), + } + } - // Drain focus changes and new / closed windows since the last poll. + let Session { queue, state, .. } = guard.as_mut()?; queue.roundtrip(state).ok()?; if state.finished { + // `Finished` arrived during this poll; reconnect on the next call. return None; } From 4a078ec02639f0da8630e1c95fa7aef3c6f620c3 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Tue, 9 Jun 2026 19:27:06 -0300 Subject: [PATCH 4/9] fix(hook): bound wlr frontmost dispatch with deadlines (review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three unbounded `EventQueue::roundtrip` calls are replaced by two deadline-aware primitives: - `timed_roundtrip` (init path): sends `wl_display.sync`, then loops `flush → poll(2) → read → dispatch_pending` until the `WlCallback::Done` fires or `INIT_TIMEOUT = 5 s` is reached. Symmetric to `gnome_shell::METHOD_TIMEOUT`; both guard the `FRONTMOST_SOURCE` `LazyLock` initializer so a stalled compositor socket makes the candidate fall through instead of blocking every thread that touches frontmost. - `drain_events` (poll path): the protocol is event-driven so no sync barrier is needed. Flushes outgoing writes, then does a non-blocking `prepare_read → poll(2, 25 ms cap) → read → dispatch_pending`. If nothing arrives within the cap the last known state is returned — millisecond-stale frontmost data is acceptable by design. Both paths use `poll(2)` via the existing `libc` dependency with `Instant`-based remaining-time accounting per iteration and `EINTR` retry. A read error marks the session finished, consistent with the existing reconnect behavior. A small `millis_until` helper converts an `Instant` deadline to a `poll(2)` timeout; two unit tests cover the boundary cases. Compositor death and reconnect behavior are unchanged from the prior commit. Runtime validation on a wlroots compositor is still pending (this machine runs GNOME/Mutter, which doesn't advertise the protocol). Co-Authored-By: Claude Sonnet 4.6 --- .../src/linux/wlr_foreign_toplevel.rs | 225 ++++++++++++++++-- 1 file changed, 202 insertions(+), 23 deletions(-) diff --git a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs index a1cb51fe..82d75340 100644 --- a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs +++ b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs @@ -20,17 +20,34 @@ //! [`connect`](WlrForeignToplevelSource::connect) returns `None` there and the //! caller falls through to the next backend candidate. //! +//! ## Dispatch model +//! //! The protocol is event-driven, but the [`super::FrontmostSource`] contract is -//! a synchronous poll (~1 Hz from `openlogi-gui::app_watcher`). To bridge that, -//! the connection, event queue, and accumulated state are kept alive in the -//! backend and a `roundtrip` is performed on each poll to drain pending events -//! (focus changes, new / closed windows) before reading the active toplevel. +//! a synchronous poll (~1 Hz from `openlogi-gui::app_watcher`). Two primitives +//! bridge that gap: +//! +//! - **`drain_events`** (poll path) — flushes pending writes, then attempts a +//! non-blocking `prepare_read` + `read` with a short 25 ms `poll(2)` cap. +//! If nothing arrives in time the last known state is returned unchanged; +//! millisecond-stale frontmost data is acceptable by design. +//! +//! - **`timed_roundtrip`** (init path) — sends `wl_display.sync`, then loops +//! `flush` → `poll(2)` → `read` → `dispatch_pending` until the sync callback +//! fires or `INIT_TIMEOUT` (5 s) expires. If the deadline is hit the candidate +//! returns `None` so backend selection falls through — the same contract as +//! every other backend. +//! +//! Both helpers use `poll(2)` via the `libc` crate (already a Linux dependency) +//! with `Instant`-based remaining-time accounting and `EINTR` retry. use std::collections::HashMap; +use std::os::unix::io::AsRawFd; use std::sync::Mutex; +use std::time::{Duration, Instant}; use tracing::{debug, info, warn}; use wayland_client::backend::ObjectId; +use wayland_client::protocol::wl_callback; use wayland_client::protocol::wl_registry::{self, WlRegistry}; use wayland_client::{Connection, Dispatch, EventQueue, Proxy, QueueHandle, event_created_child}; use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_handle_v1::{ @@ -47,6 +64,15 @@ use super::FrontmostSource; /// here to stay within what `wayland-protocols-wlr` generates. const MANAGER_MAX_VERSION: u32 = 3; +/// Deadline for the two `wl_display.sync` round-trips in `Session::open`. +/// Mirrors `gnome_shell::METHOD_TIMEOUT`: both guard the `FRONTMOST_SOURCE` +/// `LazyLock` initializer against a stalled compositor socket. +const INIT_TIMEOUT: Duration = Duration::from_secs(5); + +/// Maximum time the poll-path drain will wait for new Wayland events. Stale +/// frontmost data within this window is acceptable by design. +const POLL_CAP_MS: u64 = 25; + /// Accumulated per-toplevel data. wlr sends individual property events and then /// a `done` marking a consistent snapshot, so updates are staged in `pending_*` /// and committed on `done`. @@ -66,6 +92,9 @@ struct State { /// Set when the compositor sends `finished`; triggers a reconnect on the /// next poll instead of permanently disabling the backend. finished: bool, + /// Flipped to `true` by the `wl_callback::Done` handler; used by + /// `timed_roundtrip` to detect that the sync echo arrived. + sync_done: bool, } impl Dispatch for State { @@ -175,6 +204,21 @@ impl Dispatch for State { } } +impl Dispatch for State { + fn event( + state: &mut Self, + _: &wl_callback::WlCallback, + event: wl_callback::Event, + (): &(), + _: &Connection, + _: &QueueHandle, + ) { + if let wl_callback::Event::Done { .. } = event { + state.sync_done = true; + } + } +} + /// The `state` event carries a `wl_array` of native-endian `u32` state values. /// A toplevel is frontmost iff the `activated` value is present in that set. fn is_activated(states: &[u8]) -> bool { @@ -186,6 +230,116 @@ fn is_activated(states: &[u8]) -> bool { }) } +/// Returns the milliseconds remaining until `deadline`, clamped to `[0, i32::MAX]` +/// for use as a `libc::poll` timeout. Returns 0 when the deadline has passed. +fn millis_until(deadline: Instant) -> i32 { + i32::try_from( + deadline + .saturating_duration_since(Instant::now()) + .as_millis() + .min(i32::MAX as u128), + ) + .unwrap_or(i32::MAX) +} + +/// Calls `poll(2)` on `fd` (waiting for `POLLIN | POLLERR`) with a deadline. +/// Retries on `EINTR` with the remaining time. Returns `true` if the fd became +/// readable, `false` on timeout or error. +fn poll_fd(fd: libc::c_int, deadline: Instant) -> bool { + let mut pfd = libc::pollfd { + fd, + events: libc::POLLIN | libc::POLLERR, + revents: 0, + }; + loop { + let timeout_ms = millis_until(deadline); + if timeout_ms == 0 { + return false; + } + let r = unsafe { libc::poll(&raw mut pfd, 1, timeout_ms) }; + if r > 0 { + return true; + } + if r == 0 { + return false; + } + // r < 0 — check errno + let e = unsafe { *libc::__errno_location() }; + if e != libc::EINTR { + return false; + } + // EINTR: retry with remaining deadline + } +} + +/// Sends `wl_display.sync` and spins `flush → poll → read → dispatch_pending` +/// until the sync callback fires or `deadline` is reached. Returns `true` on +/// success, `false` on timeout or connection error. +fn timed_roundtrip( + conn: &Connection, + queue: &mut EventQueue, + state: &mut State, + deadline: Instant, +) -> bool { + state.sync_done = false; + let qh = queue.handle(); + conn.display().sync(&qh, ()); + + loop { + if queue.flush().is_err() { + return false; + } + if queue.dispatch_pending(state).is_err() { + return false; + } + if state.sync_done { + return true; + } + if millis_until(deadline) == 0 { + return false; + } + + match queue.prepare_read() { + None => { + // Events are already buffered; loop back to dispatch. + } + Some(guard) => { + let fd = guard.connection_fd().as_raw_fd(); + if !poll_fd(fd, deadline) { + // Timed out or error — candidate falls through. + return false; + } + if guard.read().is_err() { + return false; + } + } + } + } +} + +/// Drains pending compositor events without blocking longer than `POLL_CAP_MS`. +/// Used on every frontmost poll. Stale data within the cap is acceptable by +/// design; errors are silently ignored so the last known state is returned. +fn drain_events(queue: &mut EventQueue, state: &mut State) { + let _ = queue.flush(); + let _ = queue.dispatch_pending(state); + + let deadline = Instant::now() + Duration::from_millis(POLL_CAP_MS); + match queue.prepare_read() { + None => { + // Already had buffered events; dispatch_pending above handled them. + } + Some(guard) => { + let fd = guard.connection_fd().as_raw_fd(); + if poll_fd(fd, deadline) { + let _ = guard.read(); + let _ = queue.dispatch_pending(state); + } + // If poll timed out, guard is dropped here and we return stale state. + } + } +} + /// One live Wayland session: connection + event queue + dispatch state. /// /// Grouping all three behind a single mutex means the whole session can be @@ -200,8 +354,9 @@ struct Session { impl Session { /// Open a fresh connection, bind the manager, and do the initial two - /// round-trips to populate the toplevel list. Returns `None` when the - /// compositor doesn't advertise the protocol or the connection fails. + /// timed round-trips to populate the toplevel list. Returns `None` when + /// the compositor doesn't advertise the protocol, the connection fails, + /// or either round-trip exceeds `INIT_TIMEOUT`. fn open() -> Option { let conn = Connection::connect_to_env() .map_err(|e| debug!("wlr-foreign-toplevel: no Wayland connection: {e}")) @@ -209,15 +364,15 @@ impl Session { let mut queue = conn.new_event_queue(); let qh = queue.handle(); - // Registering the registry triggers `global` events on the next - // round-trip, where the manager is bound if the compositor advertises - // it. The registry handle is only needed for that round-trip. + // Registering the registry triggers `global` events on the first + // round-trip, where the manager is bound if the compositor advertises it. let _registry = conn.display().get_registry(&qh, ()); let mut state = State::default(); - queue - .roundtrip(&mut state) - .map_err(|e| debug!("wlr-foreign-toplevel: registry roundtrip failed: {e}")) - .ok()?; + + if !timed_roundtrip(&conn, &mut queue, &mut state, Instant::now() + INIT_TIMEOUT) { + debug!("wlr-foreign-toplevel: registry round-trip timed out or failed"); + return None; + } if state.manager.is_none() { debug!("wlr-foreign-toplevel: compositor does not advertise the protocol"); return None; @@ -225,10 +380,10 @@ impl Session { // Second round-trip: receive the initial toplevel list and properties, // so the first poll already has the active window. - queue - .roundtrip(&mut state) - .map_err(|e| debug!("wlr-foreign-toplevel: initial roundtrip failed: {e}")) - .ok()?; + if !timed_roundtrip(&conn, &mut queue, &mut state, Instant::now() + INIT_TIMEOUT) { + debug!("wlr-foreign-toplevel: initial toplevel round-trip timed out or failed"); + return None; + } Some(Self { _conn: conn, @@ -261,19 +416,20 @@ impl FrontmostSource for WlrForeignToplevelSource { // Reconnect when the compositor sent `Finished` (compositor reload / // restart) or when a prior reconnect attempt failed. - let needs_reconnect = guard.as_ref().map_or(true, |s| s.state.finished); + let needs_reconnect = guard.as_ref().is_none_or(|s| s.state.finished); if needs_reconnect { *guard = Session::open(); - match &*guard { - Some(_) => info!("wlr-foreign-toplevel: reconnected"), - None => debug!("wlr-foreign-toplevel: reconnect pending, retrying next poll"), + if guard.is_some() { + info!("wlr-foreign-toplevel: reconnected"); + } else { + debug!("wlr-foreign-toplevel: reconnect pending, retrying next poll"); } } let Session { queue, state, .. } = guard.as_mut()?; - queue.roundtrip(state).ok()?; + drain_events(queue, state); if state.finished { - // `Finished` arrived during this poll; reconnect on the next call. + // `Finished` arrived during this drain; reconnect on the next call. return None; } @@ -293,3 +449,26 @@ impl FrontmostSource for WlrForeignToplevelSource { pub(super) fn candidate() -> Option> { WlrForeignToplevelSource::connect().map(|s| Box::new(s) as Box) } + +#[cfg(test)] +mod tests { + use std::time::{Duration, Instant}; + + use super::millis_until; + + #[test] + fn millis_until_elapsed_deadline_is_zero() { + // `deadline` is captured before the call; by the time `millis_until` + // reads `Instant::now()` the deadline is at or before now, so + // `saturating_duration_since` returns `Duration::ZERO` → 0 ms. + let deadline = Instant::now(); + assert_eq!(millis_until(deadline), 0); + } + + #[test] + fn millis_until_future_deadline_is_positive() { + let future = Instant::now() + Duration::from_secs(10); + let ms = millis_until(future); + assert!(ms > 0 && ms <= 10_000); + } +} From 14f632cf1cf1ce37eea94d01a1ae3a1aa38d74db Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Wed, 10 Jun 2026 23:04:41 -0300 Subject: [PATCH 5/9] fix(deps): restore master Cargo.lock to keep gpui at the working rev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cargo generate-lockfile during the rebase upgraded gpui to cafbf4b5 (HEAD of zed), which broke gpui-component. Restore master's lockfile (gpui at eb2223c0) — all new deps from the branch are already present. Co-Authored-By: Claude Sonnet 4.6 --- Cargo.lock | 956 +++++++++++++++++------------------------------------ 1 file changed, 308 insertions(+), 648 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13722605..c7f35889 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,95 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "accesskit" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351dcebb14b579ccab05f288596b2ae097005be7ee50a7c3d4ca9d0d5a66f6a" -dependencies = [ - "uuid", -] - -[[package]] -name = "accesskit_atspi_common" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8c61bee90b42a772d39d06a740207dc71a4e780004ace1db8d99fb1baaa954" -dependencies = [ - "accesskit", - "accesskit_consumer 0.36.0", - "atspi-common", - "phf 0.13.1", - "serde", - "zvariant", -] - -[[package]] -name = "accesskit_consumer" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" -dependencies = [ - "accesskit", - "hashbrown 0.16.1", -] - -[[package]] -name = "accesskit_consumer" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e0d7e25d06f4dc21d1774d67146e9e80d6789216cbd4d1e88185b0095dba60" -dependencies = [ - "accesskit", - "hashbrown 0.16.1", -] - -[[package]] -name = "accesskit_macos" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c5c87e8d94f2ec10cce590aadff24c76f576dab5502d45d0aed9fc3065d4451" -dependencies = [ - "accesskit", - "accesskit_consumer 0.36.0", - "hashbrown 0.16.1", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "accesskit_unix" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b016ca8db0ea0ea2ceff29a9d6240391492d960716aa471967c00e8cc8cb197c" -dependencies = [ - "accesskit", - "accesskit_atspi_common", - "async-channel 2.5.0", - "async-executor", - "async-task", - "atspi", - "futures-lite 2.6.1", - "futures-util", - "serde", - "zbus", -] - -[[package]] -name = "accesskit_windows" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" -dependencies = [ - "accesskit", - "accesskit_consumer 0.35.0", - "hashbrown 0.16.1", - "static_assertions", - "windows 0.62.2", - "windows-core 0.62.2", -] - [[package]] name = "addr2line" version = "0.25.1" @@ -413,7 +324,7 @@ checksum = "3633346d0989f6a13133ebce8cbd7b17d8f971513172397c452d438e1e0841e6" dependencies = [ "async-io", "atomic-waker", - "block2 0.6.2", + "block2", "crossbeam-queue", "dispatch2", "futures-lite 2.6.1", @@ -595,43 +506,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atspi" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" -dependencies = [ - "atspi-common", - "atspi-proxies", -] - -[[package]] -name = "atspi-common" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" -dependencies = [ - "enumflags2", - "serde", - "static_assertions", - "zbus", - "zbus-lockstep", - "zbus-lockstep-macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "atspi-proxies" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" -dependencies = [ - "atspi-common", - "serde", - "zbus", -] - [[package]] name = "autocfg" version = "1.5.1" @@ -732,7 +606,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.13.0", @@ -742,7 +616,7 @@ dependencies = [ "quote", "regex", "rustc-hash 2.1.2", - "shlex 1.3.0", + "shlex", "syn", ] @@ -775,9 +649,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitstream-io" @@ -824,22 +698,13 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - [[package]] name = "block2" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.4", + "objc2", ] [[package]] @@ -877,9 +742,9 @@ dependencies = [ [[package]] name = "built" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" @@ -940,7 +805,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "polling", "rustix 1.1.4", "slab", @@ -988,14 +853,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.63" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex 2.0.1", + "shlex", ] [[package]] @@ -1030,9 +895,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.45" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -1126,7 +991,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "block", "cocoa-foundation 0.2.0", "core-foundation 0.10.0", @@ -1156,7 +1021,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "block", "core-foundation 0.10.0", "core-graphics-types 0.2.0", @@ -1178,9 +1043,8 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ - "gpui_util", "indexmap", "rustc-hash 2.1.2", ] @@ -1348,7 +1212,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", @@ -1361,7 +1225,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", @@ -1374,7 +1238,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.9.4", "core-graphics-types 0.1.3", "foreign-types", @@ -1398,7 +1262,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.10.0", "libc", ] @@ -1409,7 +1273,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4416167a69126e617f8d0a214af0e3c1dbdeffcb100ddf72dcd1a1ac9893c146" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "block", "cfg-if", "core-foundation 0.10.0", @@ -1457,7 +1321,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "fontdb", "harfrust", "linebender_resource_handle", @@ -1465,7 +1329,7 @@ dependencies = [ "rangemap", "rustc-hash 2.1.2", "self_cell", - "skrifa 0.40.0", + "skrifa", "smol_str", "swash", "sys-locale", @@ -1545,14 +1409,20 @@ dependencies = [ [[package]] name = "ctor" -version = "1.0.7" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01334b89b69ff726750c5ce5073fc8bd860e99aa9a8fc5ca11b04730e3aee97a" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" dependencies = [ - "link-section", - "linktime-proc-macro", + "ctor-proc-macro", + "dtor", ] +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + [[package]] name = "ctrlc" version = "3.5.2" @@ -1677,7 +1547,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "proc-macro2", "quote", @@ -1728,17 +1598,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "libc", - "objc2 0.6.4", + "objc2", ] [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", @@ -1775,6 +1645,21 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dtor" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + [[package]] name = "dunce" version = "1.0.5" @@ -2580,7 +2465,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2591,20 +2476,19 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", ] [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ - "accesskit", "anyhow", "async-channel 2.5.0", "async-task", "bindgen", - "bitflags 2.13.0", + "bitflags 2.11.1", "block", "cbindgen", "chrono", @@ -2627,7 +2511,6 @@ dependencies = [ "gpui_macros", "gpui_shared_string", "gpui_util", - "heapless", "http_client", "image", "inventory", @@ -2762,14 +2645,12 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ - "accesskit", - "accesskit_unix", "anyhow", "as-raw-xcb-connection", "ashpd", - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "calloop", "calloop-wayland-source", @@ -2813,10 +2694,8 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ - "accesskit", - "accesskit_macos", "anyhow", "async-task", "block", @@ -2843,7 +2722,7 @@ dependencies = [ "media", "metal", "objc", - "objc2-app-kit 0.3.2", + "objc2-app-kit", "parking_lot", "pathfinder_geometry", "raw-window-handle", @@ -2858,7 +2737,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2869,7 +2748,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "console_error_panic_hook", "gpui", @@ -2882,7 +2761,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "schemars", "serde", @@ -2892,7 +2771,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "log", @@ -2901,7 +2780,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "console_error_panic_hook", @@ -2925,7 +2804,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "bytemuck", @@ -2954,10 +2833,8 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ - "accesskit", - "accesskit_windows", "anyhow", "collections", "etagere", @@ -3021,10 +2898,10 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "core_maths", - "read-fonts 0.37.0", + "read-fonts", "smallvec", ] @@ -3162,9 +3039,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", "itoa", @@ -3196,7 +3073,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "async-compression", @@ -3322,13 +3199,12 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", - "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -3336,9 +3212,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -3349,9 +3225,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -3363,15 +3239,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -3383,15 +3259,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", @@ -3427,9 +3303,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3437,9 +3313,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.26" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b915661dd01db3f05050265b2477bcc6527b3792388e2749b41623cc592be67d" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -3493,9 +3369,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.2" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" +checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" [[package]] name = "indexmap" @@ -3702,12 +3578,13 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.100" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ "cfg-if", "futures-util", + "once_cell", "wasm-bindgen", ] @@ -3730,9 +3607,9 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kqueue" -version = "1.2.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" dependencies = [ "kqueue-sys", "libc", @@ -3744,7 +3621,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "libc", ] @@ -3815,9 +3692,9 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" -version = "0.4.13" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" dependencies = [ "arbitrary", "cc", @@ -3841,9 +3718,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ "libc", ] @@ -3854,18 +3731,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" -[[package]] -name = "link-section" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2b1dd6fe32e55c0fc0ea9493aa57459ca3cf4ff3c857c7d0302290150da6e4f" - -[[package]] -name = "linktime-proc-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7b0a3383c2a1002d11349c92c85a666a5fb679e96c79d782cf0dbe557fd6ee" - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3901,9 +3766,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.32" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ "serde_core", "value-bag", @@ -4030,7 +3895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" dependencies = [ "log", - "phf 0.11.3", + "phf", "phf_codegen", "string_cache", "string_cache_codegen", @@ -4081,7 +3946,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "bindgen", @@ -4095,9 +3960,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" @@ -4123,7 +3988,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -4172,9 +4037,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", @@ -4199,7 +4064,7 @@ source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9 dependencies = [ "arrayvec", "bit-set", - "bitflags 2.13.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -4247,7 +4112,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", @@ -4260,7 +4125,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", @@ -4315,7 +4180,7 @@ version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "filetime", "fsevent-sys", "inotify", @@ -4407,9 +4272,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-derive" @@ -4516,22 +4381,6 @@ dependencies = [ "objc_id", ] -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - [[package]] name = "objc2" version = "0.6.4" @@ -4541,41 +4390,25 @@ dependencies = [ "objc2-encode", ] -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.13.0", - "block2 0.5.1", - "libc", - "objc2 0.5.2", - "objc2-core-data 0.2.2", - "objc2-core-image 0.2.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", -] - [[package]] name = "objc2-app-kit" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "libc", - "objc2 0.6.4", + "objc2", "objc2-cloud-kit", - "objc2-core-data 0.3.2", + "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", - "objc2-core-image 0.3.2", + "objc2-core-image", "objc2-core-text", "objc2-core-video", - "objc2-foundation 0.3.2", - "objc2-quartz-core 0.3.2", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] @@ -4584,21 +4417,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.13.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "bitflags 2.11.1", + "objc2", + "objc2-foundation", ] [[package]] @@ -4607,9 +4428,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", - "objc2-foundation 0.3.2", + "bitflags 2.11.1", + "objc2", + "objc2-foundation", ] [[package]] @@ -4618,11 +4439,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "dispatch2", "libc", - "objc2 0.6.4", + "objc2", ] [[package]] @@ -4631,33 +4452,21 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "dispatch2", - "objc2 0.6.4", + "objc2", "objc2-core-foundation", "objc2-io-surface", ] -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal 0.2.2", -] - [[package]] name = "objc2-core-image" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2 0.6.4", - "objc2-foundation 0.3.2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4666,8 +4475,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", + "bitflags 2.11.1", + "objc2", "objc2-core-foundation", "objc2-core-graphics", ] @@ -4678,8 +4487,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", + "bitflags 2.11.1", + "objc2", "objc2-core-foundation", "objc2-core-graphics", "objc2-io-surface", @@ -4691,28 +4500,16 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.13.0", - "block2 0.5.1", - "libc", - "objc2 0.5.2", -] - [[package]] name = "objc2-foundation" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "libc", - "objc2 0.6.4", + "objc2", "objc2-core-foundation", ] @@ -4722,11 +4519,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "dispatch2", "libc", - "objc2 0.6.4", + "objc2", "objc2-core-foundation", ] @@ -4736,46 +4533,21 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", + "bitflags 2.11.1", + "objc2", "objc2-core-foundation", ] -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.13.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - [[package]] name = "objc2-metal" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "bitflags 2.13.0", - "block2 0.6.2", - "objc2 0.6.4", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.13.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal 0.2.2", + "bitflags 2.11.1", + "block2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4784,11 +4556,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.13.0", - "objc2 0.6.4", + "bitflags 2.11.1", + "objc2", "objc2-core-foundation", - "objc2-foundation 0.3.2", - "objc2-metal 0.3.2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -4891,9 +4663,9 @@ version = "0.6.6" dependencies = [ "futures", "interprocess", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-foundation 0.3.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "openlogi-agent-core", "openlogi-core", "openlogi-hid", @@ -4976,9 +4748,9 @@ dependencies = [ "gpui_platform", "image", "interprocess", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-foundation 0.3.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "openlogi-agent-core", "openlogi-assets", "openlogi-core", @@ -5038,9 +4810,9 @@ dependencies = [ "ctrlc", "evdev", "libc", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-foundation 0.3.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "openlogi-core", "thiserror 2.0.18", "tracing", @@ -5202,7 +4974,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "collections", "serde", @@ -5215,18 +4987,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros", - "phf_shared 0.13.1", - "serde", + "phf_shared", ] [[package]] @@ -5235,8 +4996,8 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", + "phf_generator", + "phf_shared", ] [[package]] @@ -5245,33 +5006,10 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.3", + "phf_shared", "rand 0.8.6", ] -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand 2.4.1", - "phf_shared 0.13.1", -] - -[[package]] -name = "phf_macros" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "phf_shared" version = "0.11.3" @@ -5281,15 +5019,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - [[package]] name = "pico-args" version = "0.5.0" @@ -5364,7 +5093,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "crc32fast", "fdeflate", "flate2", @@ -5481,7 +5210,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.12+spec-1.1.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -5581,7 +5310,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", - "serde", ] [[package]] @@ -5636,7 +5364,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -5799,10 +5527,10 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" dependencies = [ - "objc2 0.6.4", + "objc2", "objc2-core-foundation", - "objc2-foundation 0.3.2", - "objc2-quartz-core 0.3.2", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] @@ -5836,16 +5564,6 @@ dependencies = [ "font-types", ] -[[package]] -name = "read-fonts" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" -dependencies = [ - "bytemuck", - "font-types", -] - [[package]] name = "recvmsg" version = "1.0.0" @@ -5867,7 +5585,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", ] [[package]] @@ -5904,16 +5622,16 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "derive_refineable", ] [[package]] name = "regex" -version = "1.12.4" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -5934,9 +5652,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.11" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "renderdoc-sys" @@ -6037,9 +5755,9 @@ dependencies = [ [[package]] name = "rust-i18n" -version = "4.1.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55691a65892c33ee2de49c15ea5600c6f4a70e8eeb8e6c3cd96d2a231d230c40" +checksum = "21031bf5e6f2c0ae745d831791c403608e99a8bd3776c7e5e5535acd70c3b7ba" dependencies = [ "globwalk", "regex", @@ -6050,9 +5768,9 @@ dependencies = [ [[package]] name = "rust-i18n-macro" -version = "4.1.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30de488acadcf767d97cd48518a8da8ea9777b1c9a5beca4eab78bbf77d07309" +checksum = "51fe5295763b358606f7ca26a564e20f4469775a57ec1f09431249a33849ff52" dependencies = [ "glob", "proc-macro2", @@ -6066,15 +5784,18 @@ dependencies = [ [[package]] name = "rust-i18n-support" -version = "4.1.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aea0fef8a93c06326b66392c95a115120e609674cb2132d37d276a6b05b545b4" +checksum = "69bcc115c8eea2803aa3d85362e339776f4988a0349f2f475af572e497443f6f" dependencies = [ "arc-swap", "base62", "globwalk", "itertools 0.11.0", + "lazy_static", "normpath", + "proc-macro2", + "regex", "serde", "serde_json", "serde_yaml", @@ -6116,7 +5837,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6129,7 +5850,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -6153,9 +5874,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -6205,7 +5926,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "core_maths", "log", @@ -6244,7 +5965,7 @@ dependencies = [ [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "async-task", "backtrace", @@ -6329,7 +6050,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -6544,12 +6265,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -6597,17 +6312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" dependencies = [ "bytemuck", - "read-fonts 0.37.0", -] - -[[package]] -name = "skrifa" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" -dependencies = [ - "bytemuck", - "read-fonts 0.39.2", + "read-fonts", ] [[package]] @@ -6692,7 +6397,7 @@ version = "0.4.0+sdk-1.4.341.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", ] [[package]] @@ -6770,7 +6475,7 @@ checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared 0.11.3", + "phf_shared", "precomputed-hash", "serde", ] @@ -6781,8 +6486,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", + "phf_generator", + "phf_shared", "proc-macro2", "quote", ] @@ -6823,7 +6528,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "heapless", "log", @@ -6834,15 +6539,15 @@ dependencies = [ [[package]] name = "sval" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb9efbae90f97301f4d25f3be63dfd99d6b7af9d088228a52ec960d649b2e7d" +checksum = "4a05195a68cb8336336413c3f52ea0467c7666f5f652e01ba807319ffcc090f2" [[package]] name = "sval_buffer" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff5c0280ea0af40b3a1fd0b532680b5067482ffb81412ee66ec04b1d9952b49a" +checksum = "2887fd5e2454319f2f170860427f615451bb057fc9b3fd7f28b7a99ac2ccf0e4" dependencies = [ "sval", "sval_ref", @@ -6850,18 +6555,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b9067f2e68f58e110cf8019a268057e3791cf74b0fdb1b3c7c6e49104f44e6" +checksum = "12ddf3833aa407554ad40be081aea9cc3ea6d6798832ec83dd35022b45373896" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ebdbf0e4b175884aa587fcf551c16dabe245ea04235abdd8cbbd160b27ed5a" +checksum = "94398bdd2ee99eee108e0b7b0df9081700a96cdefac3add5c09ad3e6f2376bcb" dependencies = [ "itoa", "ryu", @@ -6870,9 +6575,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e448d9fa216a6c16670b28d624fbbcf5c04e41eb187bd7c52e01222ffa72a12" +checksum = "3f51ae40f37b541fdf81531e51d5071e8edc7c5a191cc23d288b654995b9eaba" dependencies = [ "itoa", "ryu", @@ -6881,9 +6586,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021de5b5c26efd544c694cef9b8a9abe8633481bf3be1ea145a18a740818b291" +checksum = "3abe05be8455348e3f6edc14a85fd2fcf32f801a14f0126ce025e63851b4f13b" dependencies = [ "sval", "sval_buffer", @@ -6892,18 +6597,18 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ef5ffec8bc52ded04ee424ab8d959e25e64fd40a48a16d21f8991ce824c1bb" +checksum = "a36361fa3c42c9fd129f4c5023a812d5b275742b28a672c758ec70049c61df00" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.20.0" +version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b983833a8a2390f89ebcf9b9acd06883017014b4ffd72ee28e0c9de6852039f5" +checksum = "fb76707179eccecab345902a803aacacab6889f3af675dbe89766bc790b1a6cb" dependencies = [ "serde_core", "sval", @@ -6928,11 +6633,11 @@ dependencies = [ [[package]] name = "swash" -version = "0.2.8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1804632b66a35ca2b1d277eb0a138e10f46cb365b9a6d297e876b69ef79de43" +checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" dependencies = [ - "skrifa 0.42.1", + "skrifa", "yazi", "zeno", ] @@ -6997,7 +6702,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7182,9 +6887,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -7197,15 +6902,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -7409,9 +7114,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.12+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", "toml_datetime 1.1.1+spec-1.1.0", @@ -7609,9 +7314,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "uds_windows" @@ -7680,9 +7385,9 @@ checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" -version = "1.13.3" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-vo" @@ -7811,7 +7516,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "async-fs", @@ -7836,7 +7541,7 @@ dependencies = [ "serde", "serde_json", "serde_json_lenient", - "shlex 1.3.0", + "shlex", "smol", "take-until", "tempfile", @@ -7850,7 +7555,7 @@ dependencies = [ [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "perf", "quote", @@ -7859,9 +7564,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.23.3" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -7982,11 +7687,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen 0.57.1", + "wit-bindgen 0.46.0", ] [[package]] @@ -8000,9 +7705,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.123" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -8013,9 +7718,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.73" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" dependencies = [ "js-sys", "wasm-bindgen", @@ -8023,9 +7728,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.123" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8033,9 +7738,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.123" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -8046,9 +7751,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.123" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] @@ -8106,7 +7811,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -8132,7 +7837,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -8155,7 +7860,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -8167,7 +7872,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -8180,7 +7885,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -8212,9 +7917,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.100" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" dependencies = [ "js-sys", "wasm-bindgen", @@ -8251,7 +7956,7 @@ version = "29.0.3" source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9daea5d2eaa83150b79e88#357a0c56e0070480ad9daea5d2eaa83150b79e88" dependencies = [ "arrayvec", - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "cfg-if", "cfg_aliases", @@ -8282,7 +7987,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "cfg_aliases", "document-features", @@ -8339,8 +8044,8 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.13.0", - "block2 0.6.2", + "bitflags 2.11.1", + "block2", "bytemuck", "cfg-if", "cfg_aliases", @@ -8356,11 +8061,11 @@ dependencies = [ "log", "naga", "ndk-sys", - "objc2 0.6.4", + "objc2", "objc2-core-foundation", - "objc2-foundation 0.3.2", - "objc2-metal 0.3.2", - "objc2-quartz-core 0.3.2", + "objc2-foundation", + "objc2-metal", + "objc2-quartz-core", "once_cell", "ordered-float", "parking_lot", @@ -8397,7 +8102,7 @@ name = "wgpu-types" version = "29.0.3" source = "git+https://github.com/zed-industries/wgpu.git?rev=357a0c56e0070480ad9daea5d2eaa83150b79e88#357a0c56e0070480ad9daea5d2eaa83150b79e88" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "bytemuck", "js-sys", "log", @@ -8750,15 +8455,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.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -8958,6 +8654,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -8967,12 +8669,6 @@ dependencies = [ "wit-bindgen-rust-macro", ] -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -9022,7 +8718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.13.0", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -9153,7 +8849,7 @@ name = "xim-parser" version = "0.2.1" source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", ] [[package]] @@ -9234,9 +8930,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -9257,9 +8953,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.16.0" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" dependencies = [ "async-broadcast", "async-executor", @@ -9284,41 +8980,17 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 1.0.3", + "winnow 0.7.15", "zbus_macros", "zbus_names", "zvariant", ] -[[package]] -name = "zbus-lockstep" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" -dependencies = [ - "zbus_xml", - "zvariant", -] - -[[package]] -name = "zbus-lockstep-macros" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "zbus-lockstep", - "zbus_xml", - "zvariant", -] - [[package]] name = "zbus_macros" -version = "5.16.0" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9331,24 +9003,12 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" -dependencies = [ - "serde", - "winnow 1.0.3", - "zvariant", -] - -[[package]] -name = "zbus_xml" -version = "5.1.1" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ - "quick-xml 0.39.4", "serde", - "zbus_names", + "winnow 0.7.15", "zvariant", ] @@ -9357,7 +9017,7 @@ name = "zed-font-kit" version = "0.14.1-zed" source = "git+https://github.com/zed-industries/font-kit?rev=94b0f28166665e8fd2f53ff6d268a14955c82269#94b0f28166665e8fd2f53ff6d268a14955c82269" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.11.1", "byteorder", "core-foundation 0.10.0", "core-graphics 0.24.0", @@ -9479,18 +9139,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.52" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.52" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -9574,7 +9234,7 @@ dependencies = [ [[package]] name = "zlog" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "anyhow", "chrono", @@ -9591,7 +9251,7 @@ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "ztracing" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" dependencies = [ "tracing", "tracing-subscriber", @@ -9602,7 +9262,7 @@ dependencies = [ [[package]] name = "ztracing_macro" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#cafbf4b5df7fedb67fc0f248850a5654efcec5d9" +source = "git+https://github.com/zed-industries/zed#eb2223c0802c4e864caac1687631ac0c45af4dee" [[package]] name = "zune-core" @@ -9645,24 +9305,24 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.12.0" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" dependencies = [ "endi", "enumflags2", "serde", "serde_bytes", - "winnow 1.0.3", + "winnow 0.7.15", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.12.0" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9673,13 +9333,13 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", "syn", - "winnow 1.0.3", + "winnow 0.7.15", ] From 8a7760f23364a58f4ee6e89654fa4f6e9fe8c712 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Wed, 10 Jun 2026 23:14:14 -0300 Subject: [PATCH 6/9] fix(hook): collapse nested if into if-let-and guard (clippy) Co-Authored-By: Claude Sonnet 4.6 --- .../openlogi-hook/src/linux/wlr_foreign_toplevel.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs index 82d75340..c5fc0e72 100644 --- a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs +++ b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs @@ -111,13 +111,12 @@ impl Dispatch for State { interface, version, } = event + && interface == ZwlrForeignToplevelManagerV1::interface().name { - if interface == ZwlrForeignToplevelManagerV1::interface().name { - let version = version.min(MANAGER_MAX_VERSION); - let manager = - registry.bind::(name, version, qh, ()); - state.manager = Some(manager); - } + let version = version.min(MANAGER_MAX_VERSION); + let manager = + registry.bind::(name, version, qh, ()); + state.manager = Some(manager); } } } From 28cdca30d1170c7f64645be94513241cf054064c Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Wed, 10 Jun 2026 23:25:02 -0300 Subject: [PATCH 7/9] fix(hook): share a single INIT_TIMEOUT deadline across both round-trips MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously each timed_roundtrip call created its own Instant::now() + INIT_TIMEOUT, allowing Session::open() to block for up to 2×INIT_TIMEOUT (10 s) — double the stated guard. A single shared deadline keeps the total wall-clock exposure within INIT_TIMEOUT regardless of how many round-trips are needed. Co-Authored-By: Claude Sonnet 4.6 --- crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs index c5fc0e72..99f25662 100644 --- a/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs +++ b/crates/openlogi-hook/src/linux/wlr_foreign_toplevel.rs @@ -367,8 +367,9 @@ impl Session { // round-trip, where the manager is bound if the compositor advertises it. let _registry = conn.display().get_registry(&qh, ()); let mut state = State::default(); + let deadline = Instant::now() + INIT_TIMEOUT; - if !timed_roundtrip(&conn, &mut queue, &mut state, Instant::now() + INIT_TIMEOUT) { + if !timed_roundtrip(&conn, &mut queue, &mut state, deadline) { debug!("wlr-foreign-toplevel: registry round-trip timed out or failed"); return None; } @@ -379,7 +380,7 @@ impl Session { // Second round-trip: receive the initial toplevel list and properties, // so the first poll already has the active window. - if !timed_roundtrip(&conn, &mut queue, &mut state, Instant::now() + INIT_TIMEOUT) { + if !timed_roundtrip(&conn, &mut queue, &mut state, deadline) { debug!("wlr-foreign-toplevel: initial toplevel round-trip timed out or failed"); return None; } From 4900500007023f808b6aeda9ce9d4ecab076760c Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Sun, 14 Jun 2026 12:55:03 -0300 Subject: [PATCH 8/9] fix(gui): set Wayland app_id so OpenLogi's own window is identifiable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The GUI shipped no xdg-toplevel app_id (X11 WM_CLASS), so on GNOME Wayland Mutter's get_wm_class() returned empty for our own window — the gnome_shell frontmost backend then reported OpenLogi as None, and the dash couldn't group the window under its launcher icon. Set app_id to the bundle identifier (org.openlogi.openlogi) in main_window_options, and add a matching StartupWMClass to the Linux desktop entry so GNOME ties the running window back to the launcher. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/openlogi-gui/src/main.rs | 6 ++++++ packaging/linux/desktop/openlogi.desktop | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/crates/openlogi-gui/src/main.rs b/crates/openlogi-gui/src/main.rs index 1a97ee25..42df6bef 100644 --- a/crates/openlogi-gui/src/main.rs +++ b/crates/openlogi-gui/src/main.rs @@ -547,6 +547,12 @@ fn main_window_options(cx: &mut gpui::App) -> WindowOptions { let bounds = Bounds::centered(None, Size::new(px(1100.), px(750.)), cx); WindowOptions { window_bounds: Some(WindowBounds::Windowed(bounds)), + // Advertise a Wayland xdg-toplevel app_id (and X11 WM_CLASS). Without it + // the window ships no app_id, so GNOME's `get_wm_class()` returns empty + // and our own `gnome_shell` frontmost backend reports OpenLogi as `None` + // (and the dash can't group the window under its launcher icon). The id + // matches the bundle identifier and the desktop file's `StartupWMClass`. + app_id: Some("org.openlogi.openlogi".into()), // Min height keeps the buttons tab's mouse model above its scale floor // (`MODEL_MIN_H` + the chrome/padding reserve) so its side labels never // overlap; below this the model can't shrink further without crowding. diff --git a/packaging/linux/desktop/openlogi.desktop b/packaging/linux/desktop/openlogi.desktop index 35117cad..d45626c6 100644 --- a/packaging/linux/desktop/openlogi.desktop +++ b/packaging/linux/desktop/openlogi.desktop @@ -5,6 +5,10 @@ Comment=Logitech HID++ device control — remap buttons, DPI, SmartShift Exec=openlogi-gui Icon=openlogi Terminal=false +# Ties the running window (Wayland xdg-toplevel app_id / X11 WM_CLASS, set in +# main_window_options) back to this launcher so GNOME groups it under the +# OpenLogi icon instead of a generic one. +StartupWMClass=org.openlogi.openlogi Categories=Settings;HardwareSettings; Keywords=logitech;mouse;hid;remap;dpi; StartupNotify=true From b45e191550b1de54a2daebd4e0a762bf3351c508 Mon Sep 17 00:00:00 2001 From: Piero Recchia Date: Tue, 16 Jun 2026 00:02:06 -0300 Subject: [PATCH 9/9] refactor(brand): hoist the app id into brand::APP_ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Wayland app_id / X11 WM_CLASS was a bare literal in main_window_options and the .desktop StartupWMClass — two copies that could drift, and a merge hazard against the Linux-port PR which sets its own value. Define it once as openlogi_core::brand::APP_ID and reference it from the GUI; the .desktop file keeps a documented literal copy since it can't import Rust. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/openlogi-core/src/brand.rs | 9 +++++++++ crates/openlogi-gui/src/main.rs | 7 ++++--- packaging/linux/desktop/openlogi.desktop | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/crates/openlogi-core/src/brand.rs b/crates/openlogi-core/src/brand.rs index 0c36d944..17d09bc7 100644 --- a/crates/openlogi-core/src/brand.rs +++ b/crates/openlogi-core/src/brand.rs @@ -14,6 +14,15 @@ pub const HELP_URL: &str = "https://github.com/AprilNEA/OpenLogi#readme"; /// The "latest release" page. pub const RELEASES_URL: &str = "https://github.com/AprilNEA/OpenLogi/releases/latest"; +/// The application identifier: the Wayland xdg-toplevel `app_id` (and X11 +/// `WM_CLASS`) the GUI advertises, the root of the macOS bundle-id family +/// (`org.openlogi.agent`, `org.openlogi.openlogi.dev`), and the value the Linux +/// `.desktop` file pins as `StartupWMClass`. Defined once here so the window the +/// compositor sees, the launcher that groups it, and the frontmost backend that +/// self-identifies OpenLogi can never disagree. The `.desktop` file carries its +/// own literal copy (it can't reference Rust) — keep the two in sync. +pub const APP_ID: &str = "org.openlogi.openlogi"; + /// The release page for a specific version tag (e.g. the running build). #[must_use] pub fn release_tag_url(version: &str) -> String { diff --git a/crates/openlogi-gui/src/main.rs b/crates/openlogi-gui/src/main.rs index 42df6bef..e2c96924 100644 --- a/crates/openlogi-gui/src/main.rs +++ b/crates/openlogi-gui/src/main.rs @@ -59,7 +59,7 @@ use gpui::{ WindowBounds, WindowOptions, px, }; use gpui_component::{ActiveTheme, Root, Theme, ThemeMode}; -use openlogi_core::brand::DeeplinkCommand; +use openlogi_core::brand::{APP_ID, DeeplinkCommand}; use openlogi_core::config::Config; use openlogi_core::device::{DeviceInventory, DeviceModelInfo}; use tracing::{info, warn}; @@ -551,8 +551,9 @@ fn main_window_options(cx: &mut gpui::App) -> WindowOptions { // the window ships no app_id, so GNOME's `get_wm_class()` returns empty // and our own `gnome_shell` frontmost backend reports OpenLogi as `None` // (and the dash can't group the window under its launcher icon). The id - // matches the bundle identifier and the desktop file's `StartupWMClass`. - app_id: Some("org.openlogi.openlogi".into()), + // is the shared `brand::APP_ID`, matching the desktop file's + // `StartupWMClass` and the macOS bundle-id family. + app_id: Some(APP_ID.into()), // Min height keeps the buttons tab's mouse model above its scale floor // (`MODEL_MIN_H` + the chrome/padding reserve) so its side labels never // overlap; below this the model can't shrink further without crowding. diff --git a/packaging/linux/desktop/openlogi.desktop b/packaging/linux/desktop/openlogi.desktop index d45626c6..59c0d298 100644 --- a/packaging/linux/desktop/openlogi.desktop +++ b/packaging/linux/desktop/openlogi.desktop @@ -5,9 +5,9 @@ Comment=Logitech HID++ device control — remap buttons, DPI, SmartShift Exec=openlogi-gui Icon=openlogi Terminal=false -# Ties the running window (Wayland xdg-toplevel app_id / X11 WM_CLASS, set in -# main_window_options) back to this launcher so GNOME groups it under the -# OpenLogi icon instead of a generic one. +# Ties the running window (Wayland xdg-toplevel app_id / X11 WM_CLASS) back to +# this launcher so GNOME groups it under the OpenLogi icon instead of a generic +# one. Must match `openlogi_core::brand::APP_ID`, the value the GUI advertises. StartupWMClass=org.openlogi.openlogi Categories=Settings;HardwareSettings; Keywords=logitech;mouse;hid;remap;dpi;