From f005960bdc3cd6af768347990322771c5b57af0d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 6 Jul 2026 11:34:03 -0700 Subject: [PATCH 01/16] Improve backtrace trimming for cranelift (#8294) When using the cranelift backend we would get stack traces that would contain a lot of egui callstacks. This should solve it. --- crates/egui/src/callstack.rs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/crates/egui/src/callstack.rs b/crates/egui/src/callstack.rs index b1239db01..6b0c35380 100644 --- a/crates/egui/src/callstack.rs +++ b/crates/egui/src/callstack.rs @@ -88,16 +88,36 @@ pub fn capture() -> String { return false; } - // Remove stuff that isn't user calls: + // Remove frames that are part of egui itself, since they are not useful to the user. + let skip_crates = [ + "alloc", + "backtrace", + "core", + "eframe", + "egui_extras", + "egui_plot", + "egui", + "epaint", + "std", + "winit", + ]; + for crate_name in skip_crates { + let name = frame.name.trim_start_matches('<'); + if name.starts_with(crate_name) + && name + .as_bytes() + .get(crate_name.len()) + .copied() + .is_none_or(|b| b.is_ascii_punctuation() && b != b'_') + { + return false; + } + } + let skip_prefixes = [ // "backtrace::", // not needed, since we cut at egui::callstack::capture - "egui::", - "", - "egui_plot::", - "egui_extras::", "core::ptr::drop_in_place", - "eframe::", "core::ops::function::FnOnce::call_once", " as core::ops::function::FnOnce>::call_once", ]; From 765d5ea8a8d3c747da74e3dab499c744145ea174 Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Tue, 7 Jul 2026 10:59:40 +0200 Subject: [PATCH 02/16] Fix cargo deny (#8300) Updates crossbeam and ignores the others as there are no possible yet --- Cargo.lock | 4 ++-- deny.toml | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2085fa955..ad93f0e43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1029,9 +1029,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] diff --git a/deny.toml b/deny.toml index e926cdb19..830991a21 100644 --- a/deny.toml +++ b/deny.toml @@ -33,6 +33,9 @@ version = 2 ignore = [ "RUSTSEC-2024-0320", # unmaintained yaml-rust pulled in by syntect "RUSTSEC-2025-0141", # https://rustsec.org/advisories/RUSTSEC-2025-0141 - bincode is unmaintained - https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md + "RUSTSEC-2026-0192", # ttf-parser is unmaintained. Only brought in via winit/sctk-adwaita (wayland window frame rendering) + "RUSTSEC-2026-0194", # quick-xml DoS - fix is in >=0.41, but held back transitively by zbus_xml (accesskit) and wayland-scanner (winit) + "RUSTSEC-2026-0195", # quick-xml DoS - same as above ] [bans] @@ -111,6 +114,4 @@ license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }] unknown-registry = "deny" unknown-git = "deny" -allow-git = [ - "https://github.com/rerun-io/kittest", # TODO(lucasmerlin): remove this once the kittest crate is published" -] +allow-git = [] From d3850a9ca7c9b989d1ea3900d43305e7032a4e3b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 7 Jul 2026 10:34:44 -0700 Subject: [PATCH 03/16] Update crates (#8301) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Semver-compatible dependency updates (~200 transitive crates in `Cargo.lock`), plus housekeeping of the version pins in `Cargo.toml`. ## Changes * Normalize version strings in `[workspace.dependencies]` (`similar-asserts = "2.0"`, `unicode_names2 = "3.1"`) * `cargo update`: bump all semver-compatible transitive dependencies * `itertools` 0.14 → 0.15; the duplicate with puffin's 0.14 / criterion's 0.13 is now allowed in `deny.toml` * `rand_core` duplicate (0.6 via phf_generator's rand 0.8, 0.10 via getrandom 0.4/chacha20) also allowed in `deny.toml` — rand ecosystem is mid-migration * `toml` lock moved to 1.1.2 — the old winnow-duplicate blocker is gone (winit's `toml_edit` now uses winnow 1.x), so the stale comment is removed * `wgpu` got a lock-only patch bump 29.0.1 → 29.0.4 (still on the 29.x line; wgpu 30 intentionally not taken) ## Held back (would fail `cargo deny` with duplicate crates) * `env_logger` 0.11.8 — newer pulls env_filter 1.x, duplicating the 0.1.x that android_logger needs * `image` 0.25.6 — needs png 0.18, blocked on resvg * `smithay-clipboard` 0.7.2 — pulls calloop 0.14, duplicating winit's 0.13 * accesskit platform adapters — newer ones need accesskit_consumer 0.36/0.37, duplicating the 0.35 that kittest 0.4 pins (comments added for `accesskit_consumer`/`accesskit_winit`) * wasm-bindgen family kept at 0.2.108 per the sync comment Majors still blocked (documented in `Cargo.toml`): `font-types`/`skrifa`/`harfrust` (vello_cpu 0.0.9), `resvg` (winit 0.30). Verified: `scripts/cargo_deny.sh` green on all targets, `cargo clippy --all-features --all-targets` clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 --- Cargo.lock | 1011 +++++++++++++++++++++++----------------------------- Cargo.toml | 14 +- deny.toml | 2 + 3 files changed, 463 insertions(+), 564 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad93f0e43..a377329a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -241,9 +241,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" @@ -256,29 +256,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arboard" @@ -296,7 +296,7 @@ dependencies = [ "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", - "windows-sys 0.60.2", + "windows-sys 0.52.0", "x11rb", ] @@ -308,9 +308,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "as-raw-xcb-connection" @@ -329,9 +329,9 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -353,41 +353,41 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] [[package]] name = "async-io" -version = "2.3.4" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.1.4", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", @@ -396,9 +396,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -409,8 +409,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 0.38.44", - "tracing", + "rustix 1.1.4", ] [[package]] @@ -426,9 +425,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" dependencies = [ "async-io", "async-lock", @@ -436,10 +435,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.1.4", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -504,9 +503,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "backtrace" @@ -603,9 +602,9 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -616,20 +615,20 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.3" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +checksum = "5cee35f73844aa3014bb606320a6c1f010249dbdf43342fe54b5a4f6a8ed4b79" dependencies = [ "memchr", "regex-automata", - "serde", + "serde_core", ] [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" @@ -665,9 +664,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" [[package]] name = "calloop" @@ -680,7 +679,7 @@ dependencies = [ "polling", "rustix 0.38.44", "slab", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -703,9 +702,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.57" +version = "1.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" dependencies = [ "find-msvc-tools", "jobserver", @@ -736,9 +735,9 @@ dependencies = [ [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures", @@ -780,18 +779,18 @@ checksum = "7a0e87cdf78571d9fbeff16861c37a006cd718d2433dc6d5b80beaae367d899a" [[package]] name = "clap" -version = "4.5.20" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstyle", "clap_lex", @@ -799,15 +798,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -846,9 +845,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "colored" @@ -857,7 +856,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -889,9 +888,9 @@ dependencies = [ [[package]] name = "console" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ "encode_unicode", "libc", @@ -1010,18 +1009,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1038,21 +1037,21 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cursor-icon" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "custom_3d_glow" @@ -1108,15 +1107,15 @@ dependencies = [ [[package]] name = "data-url" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "defmt" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" dependencies = [ "bitflags 1.3.2", "defmt-macros", @@ -1124,12 +1123,11 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" dependencies = [ "defmt-parser", - "proc-macro-error2", "proc-macro2", "quote", "syn", @@ -1146,12 +1144,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" -dependencies = [ - "powerfmt", -] +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "dify" @@ -1195,9 +1190,9 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.13.0", "block2 0.6.2", @@ -1207,9 +1202,9 @@ dependencies = [ [[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", @@ -1242,9 +1237,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" [[package]] name = "ecolor" @@ -1309,7 +1304,7 @@ dependencies = [ "document-features", "emath", "epaint", - "itertools 0.14.0", + "itertools 0.15.0", "log", "nohash-hasher", "profiling", @@ -1402,7 +1397,7 @@ dependencies = [ "jiff", "log", "mimalloc", - "rand 0.10.1", + "rand 0.10.2", "serde", "unicode_names2", ] @@ -1417,7 +1412,7 @@ dependencies = [ "ehttp", "enum-map", "image", - "itertools 0.14.0", + "itertools 0.15.0", "jiff", "log", "mime_guess2", @@ -1504,9 +1499,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "emath" @@ -1526,9 +1521,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enum-map" @@ -1553,9 +1548,9 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1563,9 +1558,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", @@ -1585,9 +1580,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -1641,25 +1636,25 @@ version = "0.35.0" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "euclid" @@ -1672,9 +1667,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1683,9 +1678,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", @@ -1724,24 +1719,24 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "fearless_simd" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76258897e51fd156ee03b6246ea53f3e0eb395d0b327e9961c4fc4c8b2fa151a" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" [[package]] name = "file_dialog" @@ -1782,9 +1777,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foldhash" @@ -1812,9 +1807,9 @@ dependencies = [ [[package]] name = "fontconfig-parser" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ "roxmltree", ] @@ -1861,9 +1856,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1925,19 +1920,19 @@ dependencies = [ [[package]] name = "gethostname" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ "rustix 1.1.4", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "getopts" -version = "0.2.21" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" dependencies = [ "unicode-width", ] @@ -1979,9 +1974,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -2120,7 +2115,7 @@ checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.13.0", "gpu-descriptor-types", - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -2143,13 +2138,14 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", "num-traits", + "zerocopy", ] [[package]] @@ -2166,11 +2162,11 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash 0.1.4", + "foldhash 0.1.5", ] [[package]] @@ -2233,9 +2229,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2260,9 +2256,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", @@ -2276,12 +2272,13 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -2289,9 +2286,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -2302,11 +2299,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -2317,42 +2313,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -2362,9 +2354,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2373,9 +2365,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", @@ -2401,9 +2393,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.0" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ "byteorder-lite", "quick-error", @@ -2427,12 +2419,12 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", ] [[package]] @@ -2456,9 +2448,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -2478,6 +2470,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -2486,9 +2487,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +checksum = "ccfe6121cbe750cf81efa362d85c0bde7ea298ec43092d3a193baca59cdbd634" dependencies = [ "defmt", "jiff-static", @@ -2503,9 +2504,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +checksum = "e165e897f662d428f3cd3828a919dbe067c2d42bb1031eede74ef9d27ecdedd2" dependencies = [ "proc-macro2", "quote", @@ -2572,10 +2573,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ + "getrandom 0.4.3", "libc", ] @@ -2632,11 +2634,12 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ "arrayvec", + "euclid", "smallvec", ] @@ -2660,25 +2663,25 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libmimalloc-sys" @@ -2691,13 +2694,14 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "bitflags 2.13.0", "libc", - "redox_syscall 0.5.18", + "plain", + "redox_syscall 0.9.0", ] [[package]] @@ -2726,9 +2730,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -2759,15 +2763,15 @@ checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ "libc", ] @@ -2845,9 +2849,9 @@ dependencies = [ [[package]] name = "naga" -version = "29.0.1" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2630921705b9b01dcdd0b6864b9562ca3c1951eecd0f0c4f5f04f61e412647" +checksum = "b2bf919621e7975acb27d881bae2fb993e0d45c8e0446e85e6272971e00dc8df" dependencies = [ "arrayvec", "bit-set 0.9.1", @@ -2881,7 +2885,7 @@ dependencies = [ "ndk-sys", "num_enum", "raw-window-handle", - "thiserror 1.0.66", + "thiserror 1.0.69", ] [[package]] @@ -2899,19 +2903,6 @@ dependencies = [ "jni-sys 0.3.1", ] -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.13.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2920,9 +2911,9 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-traits" @@ -2936,18 +2927,19 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3282,25 +3274,24 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "oorandom" -version = "11.1.4" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "open" -version = "5.3.5" +version = "5.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a" dependencies = [ "is-wsl", "libc", - "pathdiff", ] [[package]] @@ -3311,18 +3302,19 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbclient" -version = "0.3.48" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" dependencies = [ + "libc", "libredox", ] [[package]] name = "ordered-float" -version = "4.6.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", ] @@ -3339,9 +3331,9 @@ dependencies = [ [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser", ] @@ -3385,12 +3377,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - [[package]] name = "peniko" version = "0.6.1" @@ -3515,18 +3501,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", @@ -3541,9 +3527,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -3552,19 +3538,25 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plist" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" dependencies = [ "base64", "indexmap", - "quick-xml 0.38.4", + "quick-xml 0.41.0", "serde", "time", ] @@ -3594,17 +3586,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] @@ -3632,24 +3623,24 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3684,28 +3675,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -3784,9 +3753,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.38.4" +version = "0.39.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", "serde", @@ -3794,18 +3763,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -3835,9 +3804,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -3871,9 +3840,9 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "range-alloc" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" [[package]] name = "raw-window-handle" @@ -3941,6 +3910,15 @@ dependencies = [ "bitflags 2.13.0", ] +[[package]] +name = "redox_syscall" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -3954,9 +3932,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -3966,9 +3944,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -3977,9 +3955,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "renderdoc-sys" @@ -4030,9 +4008,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" dependencies = [ "bytemuck", ] @@ -4092,9 +4070,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -4104,9 +4082,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -4127,7 +4105,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4145,9 +4123,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.38" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "log", "once_cell", @@ -4160,9 +4138,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "zeroize", ] @@ -4180,9 +4158,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rustybuzz" @@ -4253,9 +4231,9 @@ checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -4299,9 +4277,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -4312,9 +4290,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", @@ -4323,9 +4301,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -4341,24 +4319,25 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_cesu8" @@ -4398,18 +4377,18 @@ dependencies = [ [[package]] name = "simplecss" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" dependencies = [ "log", ] [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "skrifa" @@ -4429,9 +4408,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" -version = "1.0.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ "version_check", ] @@ -4459,7 +4438,7 @@ dependencies = [ "log", "memmap2", "rustix 0.38.44", - "thiserror 1.0.66", + "thiserror 1.0.69", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -4511,9 +4490,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -4542,15 +4521,15 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.1", + "kurbo 0.11.3", "siphasher", ] [[package]] name = "syn" -version = "2.0.117" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -4559,9 +4538,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -4662,11 +4641,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.66", + "thiserror-impl 1.0.69", ] [[package]] @@ -4680,9 +4659,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -4713,12 +4692,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -4728,15 +4706,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -4770,9 +4748,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4790,9 +4768,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4818,9 +4796,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.6+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399b1124a3c9e16766831c6bba21e50192572cdd98706ea114f9502509686ffc" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "serde_core", "serde_spanned", @@ -4831,18 +4809,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap", "toml_datetime", @@ -4852,9 +4830,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] @@ -4892,9 +4870,9 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" dependencies = [ "core_maths", ] @@ -4905,7 +4883,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" dependencies = [ - "rustc-hash 2.1.1", + "rustc-hash 2.1.3", ] [[package]] @@ -4927,9 +4905,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -4963,15 +4941,15 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-script" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" @@ -4987,9 +4965,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode_names2" @@ -5048,13 +5026,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -5076,7 +5055,7 @@ dependencies = [ "flate2", "fontdb", "imagesize", - "kurbo 0.11.1", + "kurbo 0.11.3", "log", "pico-args", "roxmltree", @@ -5112,9 +5091,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" dependencies = [ "js-sys", "serde_core", @@ -5173,9 +5152,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] @@ -5289,9 +5268,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.9" +version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ "bitflags 2.13.0", "wayland-backend", @@ -5301,9 +5280,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ "bitflags 2.13.0", "wayland-backend", @@ -5314,9 +5293,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.5" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ "bitflags 2.13.0", "wayland-backend", @@ -5386,24 +5365,24 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "29.0.3" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250" +checksum = "76e8840e1ba2881d4cbb18d2147627a56af426ff064c0401eb0c8410c6325d07" dependencies = [ "arrayvec", "bitflags 2.13.0", @@ -5431,9 +5410,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "29.0.1" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e80ac6cf1895df6342f87d975162108f9d98772a0d74bc404ab7304ac29469e" +checksum = "2f519832254e56965a9940c4af57dcb75f702b6f6fa4a0b172f685395843a4d7" dependencies = [ "arrayvec", "bit-set 0.9.1", @@ -5465,45 +5444,45 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "29.0.0" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43acd053312501689cd92a01a9638d37f3e41a5fd9534875efa8917ee2d11ac0" +checksum = "f5e39e26c4c0e07589e67d18546cf79ff45383659fc72fca4dd293358a0347f3" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "29.0.0" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef043bf135cc68b6f667c55ff4e345ce2b5924d75bad36a47921b0287ca4b24a" +checksum = "01e09be551dc939498bdd5f6b2c66e55ab275dad25825267a08605a80fc9f0af" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-wasm" -version = "29.0.0" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7b75e72f49035f000dd5262e4126242e92a090a4fd75931ecfe7e60784e6fa" +checksum = "af1fb1798be2a912497d4c224f72d39bb0cb34af50e8bcc29865bc339c943059" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "29.0.0" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "725d5c006a8c02967b6d93ef04f6537ec4593313e330cfe86d9d3f946eb90f28" +checksum = "4e592c1bbef6ad047647ae6e666ebd8cee7a32bb4544d9700ec96cbf73230257" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "29.0.1" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a47aef47636562f3937285af4c44b4b5b404b46577471411cc5313a921da7e" +checksum = "97ace1c17727311c22a46e4e3faf56ea6de81af99dcc839bdfb54857b94d448d" dependencies = [ "android_system_properties", "arrayvec", @@ -5550,13 +5529,14 @@ dependencies = [ "wgpu-types", "windows", "windows-core", + "windows-result", ] [[package]] name = "wgpu-naga-bridge" -version = "29.0.1" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4684f4410da0cf95a4cb63bb5edaac022461dedb6adf0b64d0d9b5f6890d51" +checksum = "95226013f547544b223281cd16a4fb549aa9dcb562adbda0faae4c73ffbbc161" dependencies = [ "naga", "wgpu-types", @@ -5564,9 +5544,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "29.0.1" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2675540fb1a5cfa5ef122d3d5f390e2c75711a0b946410f2d6ac3a0f77d1f6" +checksum = "84bf84cd9ca8ca45e2b223a3868f1adf9bfc0c66aeac212e76ee7e40fdadf8f5" dependencies = [ "bitflags 2.13.0", "bytemuck", @@ -5594,11 +5574,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5714,25 +5694,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -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", + "windows-targets", ] [[package]] @@ -5750,31 +5712,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -5792,96 +5737,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winit" version = "0.30.13" @@ -5936,24 +5833,24 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.13" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.51.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x11-dl" @@ -5989,9 +5886,9 @@ checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "xcursor" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] name = "xkbcommon-dl" @@ -6014,9 +5911,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xmlwriter" @@ -6039,11 +5936,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -6051,9 +5947,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -6063,9 +5959,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.12.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" dependencies = [ "async-broadcast", "async-executor", @@ -6081,8 +5977,9 @@ dependencies = [ "futures-core", "futures-lite", "hex", - "nix", + "libc", "ordered-stream", + "rustix 1.1.4", "serde", "serde_repr", "tracing", @@ -6121,9 +6018,9 @@ dependencies = [ [[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", @@ -6136,9 +6033,9 @@ 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", @@ -6147,11 +6044,11 @@ dependencies = [ [[package]] name = "zbus_xml" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" +checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" dependencies = [ - "quick-xml 0.38.4", + "quick-xml 0.39.4", "serde", "zbus_names", "zvariant", @@ -6159,18 +6056,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" dependencies = [ "proc-macro2", "quote", @@ -6179,18 +6076,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -6200,15 +6097,15 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -6217,9 +6114,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -6228,9 +6125,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -6260,9 +6157,9 @@ 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", @@ -6274,9 +6171,9 @@ dependencies = [ [[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", @@ -6287,9 +6184,9 @@ 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", diff --git a/Cargo.toml b/Cargo.toml index 0879ce464..ff8c02003 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,8 +71,8 @@ egui_kittest = { version = "0.35.0", path = "crates/egui_kittest", default-featu eframe = { version = "0.35.0", path = "crates/eframe", default-features = false } accesskit = "0.24.1" -accesskit_consumer = "0.35.0" -accesskit_winit = "0.32.0" +accesskit_consumer = "0.35.0" # Can't update to 0.36+: kittest 0.4 pins accesskit_consumer 0.35, so bumping splits it into two versions +accesskit_winit = "0.32.0" # Can't update to 0.33: it needs accesskit_macos 0.26.2, which pulls accesskit_consumer 0.37, duplicating the 0.35 that kittest 0.4 needs ahash = { version = "0.8.12", default-features = false, features = [ "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead "std", @@ -97,10 +97,10 @@ font-types = { version = "0.11.3", default-features = false, features = [ glow = "0.17.0" glutin = { version = "0.32.3", default-features = false } glutin-winit = { version = "0.5.0", default-features = false } -harfrust = "0.7.0" # Can't update to 0.10: it needs read-fonts 0.40/font-types 0.12, but vello_cpu's glifo 0.1.1 pins read-fonts 0.39/font-types 0.11, so bumping duplicates them +harfrust = "0.7.0" # Can't update to 0.8+: newer versions need read-fonts 0.40+/font-types 0.12, but vello_cpu's glifo 0.1.1 pins read-fonts 0.39/font-types 0.11, so bumping duplicates them home = "0.5.12" image = { version = "0.25.6", default-features = false } # Can't update to 0.25.7+: it needs png 0.18, which only matches resvg once resvg moves to tiny-skia 0.12 — blocked, see resvg below -itertools = "0.14.0" # 0.15 splits us from puffin 0.20's itertools 0.14, adding a cargo-deny duplicate +itertools = "0.15.0" jiff = { version = "0.2.29", default-features = false } js-sys = "0.3.77" kittest = { version = "0.4.0" } @@ -132,7 +132,7 @@ ron = "0.12.2" self_cell = "1.2" serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11.19" -similar-asserts = "2.0.0" +similar-asserts = "2.0" skrifa = { version = "0.42.1", default-features = false, features = [ "std", "autohint_shaping", @@ -144,9 +144,9 @@ syntect = { version = "5.3", default-features = false } tempfile = "3.27" thiserror = "2.0" tokio = "1.52" -toml = { version = "1.0", default-features = false } # 1.1+ pulls winnow 1.x, duplicating the winnow 0.7 that winit's toml_edit needs +toml = { version = "1.0", default-features = false } type-map = "0.5.1" -unicode_names2 = { version = "3.1.0", default-features = false } +unicode_names2 = { version = "3.1", default-features = false } unicode-general-category = "1.1" unicode-segmentation = "1.13" vello_cpu = { version = "0.0.9", default-features = false, features = [ diff --git a/deny.toml b/deny.toml index 830991a21..dc1e50be1 100644 --- a/deny.toml +++ b/deny.toml @@ -55,11 +55,13 @@ skip = [ { name = "foldhash" }, # pulled by the duplicated hashbrown versions { name = "getrandom" }, # ring / rustls (and thus ehttp) still depend on getrandom 0.2 { name = "hashbrown" }, # wgpu's naga depends on 0.16, accesskit depends on 0.15 + { name = "itertools" }, # puffin 0.20 depends on 0.14, criterion 0.8 on 0.13 { name = "jni-sys" }, # 0.3.1 depends on 0.4 { name = "kurbo" }, # Old version because of resvg { name = "phf" }, # mime_guess2 -> 0.11, unicode_names2 -> 0.13 { name = "phf_generator" }, # same phf split as phf { name = "phf_shared" }, # same phf split as phf + { name = "rand_core" }, # rand ecosystem is migrating 0.8 -> 0.10; phf_generator's rand 0.8 needs rand_core 0.6, getrandom 0.4/chacha20 need rand_core 0.10 { name = "redox_syscall" }, # old version via winit { name = "rustc-hash" }, # Small enough { name = "thiserror" }, # ecosystem is in the process of migrating from 1.x to 2.x From b865da1942ee2b2b4ebed9bdcadb67a1fbb5da1d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 8 Jul 2026 07:30:24 -0700 Subject: [PATCH 04/16] Web: don't scroll host page when text agent or canvas grabs focus (#8296) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Closes * [x] I have followed the instructions in the PR template When an eframe app is embedded in a scrollable host page, the host page jumped to the top whenever the app booted or grabbed keyboard focus. Cause: the hidden text-agent `` sat at (0,0) of `` with the `autofocus` attribute, and all focus calls (text agent and canvas) used plain `focus()`, so the browser scrolled the focused element into view — i.e. to the top of the page. Changes: * All focus calls in `eframe` web (text agent, canvas, Gboard blur/refocus workaround) now go through a new `focus_without_scroll()` helper that uses `focus_with_options` with `preventScroll: true` (supported by all evergreen browsers). * The `autofocus` attribute is replaced with an explicit focus call after DOM insertion — the browser-internal autofocus path always scrolls the element into view and cannot be prevented by any focus option. Boot-focus behavior is preserved. * The text-agent input is initially parked at the canvas origin instead of (0,0) of the page, so any residual scroll-into-view would target the canvas rather than the top of the host page. (`move_to` keeps repositioning it for IME as before.) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 --- crates/eframe/Cargo.toml | 1 + crates/eframe/src/web/app_runner.rs | 2 +- crates/eframe/src/web/events.rs | 2 +- crates/eframe/src/web/mod.rs | 11 ++++++++++ crates/eframe/src/web/text_agent.rs | 32 ++++++++++++++++++++--------- crates/eframe/src/web/web_runner.rs | 2 +- 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index 3439610dc..2e21fcc19 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -232,6 +232,7 @@ web-sys = { workspace = true, features = [ "File", "FileList", "FocusEvent", + "FocusOptions", "HtmlCanvasElement", "HtmlElement", "HtmlInputElement", diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index 8d3f6c9d7..3caa2428a 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -401,7 +401,7 @@ impl AppRunner { } else { // We are not editing text - give the focus to the canvas. self.text_agent.blur(); - self.canvas().focus().ok(); + super::focus_without_scroll(self.canvas()).ok(); } } diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index ec6bf2a07..f6ff078c5 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -599,7 +599,7 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), // not working when focusing on a text field in an egui app. // This attempts to fix that by forcing the focus on any // click on the canvas. - runner.canvas().focus().ok(); + super::focus_without_scroll(runner.canvas()).ok(); // In Safari we are only allowed to do certain things // (like playing audio, start a download, etc) diff --git a/crates/eframe/src/web/mod.rs b/crates/eframe/src/web/mod.rs index dc743ec49..67923987b 100644 --- a/crates/eframe/src/web/mod.rs +++ b/crates/eframe/src/web/mod.rs @@ -84,6 +84,17 @@ pub(crate) fn has_focus(element: &T) -> bool { try_has_focus(element).unwrap_or(false) } +/// Focus the given element without scrolling it into view. +/// +/// Scrolling the element into view would scroll the whole page when +/// the app is embedded in a larger scrollable page, +/// see . +pub(crate) fn focus_without_scroll(element: &web_sys::HtmlElement) -> Result<(), JsValue> { + let options = web_sys::FocusOptions::new(); + options.set_prevent_scroll(true); + element.focus_with_options(&options) +} + /// Current time in seconds (since undefined point in time). /// /// Monotonically increasing. diff --git a/crates/eframe/src/web/text_agent.rs b/crates/eframe/src/web/text_agent.rs index 60d617d81..73461e9e4 100644 --- a/crates/eframe/src/web/text_agent.rs +++ b/crates/eframe/src/web/text_agent.rs @@ -4,7 +4,7 @@ use std::cell::Cell; use wasm_bindgen::prelude::*; -use web_sys::{Document, Node}; +use web_sys::Document; use super::{AppRunner, WebRunner}; @@ -15,19 +15,23 @@ pub struct TextAgent { impl TextAgent { /// Attach the agent to the document. - pub fn attach(runner_ref: &WebRunner, root: Node) -> Result { + pub fn attach( + runner_ref: &WebRunner, + canvas: &web_sys::HtmlCanvasElement, + ) -> Result { let document = web_sys::window().unwrap().document().unwrap(); // create an `` element let input = document .create_element("input")? - .dyn_into::()?; - input.set_autofocus(true)?; - let input = input.dyn_into::()?; + .dyn_into::()?; input.set_type("text"); input.set_attribute("autocapitalize", "off")?; - // append it to `` and hide it outside of the viewport + // Hide the element, and park it over the canvas + // so that focusing it can never scroll some other part + // of the page into view. + let canvas_rect = super::canvas_content_rect(canvas); let style = input.style(); style.set_property("background-color", "transparent")?; style.set_property("border", "none")?; @@ -36,11 +40,12 @@ impl TextAgent { style.set_property("height", "1px")?; style.set_property("caret-color", "transparent")?; style.set_property("position", "absolute")?; - style.set_property("top", "0")?; - style.set_property("left", "0")?; + style.set_property("top", &format!("{}px", canvas_rect.min.y))?; + style.set_property("left", &format!("{}px", canvas_rect.min.x))?; // Prevent auto-zoom on mobile browsers (requires at least 16px). style.set_property("font-size", "16px")?; + let root = canvas.get_root_node(); if root.has_type::() { // root object is a document, append to its body root.dyn_into::()? @@ -52,6 +57,13 @@ impl TextAgent { root.append_child(&input)?; } + // Focus the app on startup, without scrolling the page. + // We do this instead of setting the `autofocus` attribute, + // since the browser scrolls the focused element into view when + // honoring `autofocus`, and there is no way to prevent that. + // See https://github.com/emilk/egui/issues/8295 + super::focus_without_scroll(&input).ok(); + // attach event listeners let on_input = { @@ -67,7 +79,7 @@ impl TextAgent { // between versions 14.7.09 and 17.0.12. if !event.is_composing() { input.blur().ok(); - input.focus().ok(); + super::focus_without_scroll(&input).ok(); } if event.is_composing() { @@ -221,7 +233,7 @@ impl TextAgent { log::trace!("Focusing text agent"); - if let Err(err) = self.input.focus() { + if let Err(err) = super::focus_without_scroll(&self.input) { log::error!("failed to set focus: {}", super::string_from_js_value(&err)); } } diff --git a/crates/eframe/src/web/web_runner.rs b/crates/eframe/src/web/web_runner.rs index 99615c97f..2bf842ab0 100644 --- a/crates/eframe/src/web/web_runner.rs +++ b/crates/eframe/src/web/web_runner.rs @@ -73,7 +73,7 @@ impl WebRunner { { // First set up the app runner: - let text_agent = TextAgent::attach(self, canvas.get_root_node())?; + let text_agent = TextAgent::attach(self, &canvas)?; let app_runner = AppRunner::new(canvas.clone(), web_options, app_creator, text_agent).await?; self.app_runner.replace(Some(app_runner)); From 3fcadda5ba186c9a0f8c1546e2a3fefae6b1e863 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Mon, 20 Jul 2026 12:07:29 +0300 Subject: [PATCH 05/16] Upgrade wgpu to v30 (#8289) --- .github/workflows/rust.yml | 2 +- Cargo.lock | 164 ++++++++------------ Cargo.toml | 10 +- crates/eframe/src/web/web_painter_wgpu.rs | 2 +- crates/egui-wgpu/src/capture.rs | 12 +- crates/egui-wgpu/src/lib.rs | 5 +- crates/egui-wgpu/src/renderer.rs | 4 +- crates/egui-wgpu/src/setup.rs | 1 + crates/egui-wgpu/src/winit.rs | 2 +- crates/egui_demo_app/src/backend_panel.rs | 7 +- crates/egui_kittest/src/texture_to_image.rs | 4 +- scripts/setup_web.sh | 4 +- 12 files changed, 103 insertions(+), 114 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 2122e5b99..18052710b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -94,7 +94,7 @@ jobs: - name: wasm-bindgen uses: jetli/wasm-bindgen-action@v0.1.0 with: - version: "0.2.108" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml + version: "0.2.126" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml - run: ./scripts/wasm_bindgen_check.sh --skip-setup diff --git a/Cargo.lock b/Cargo.lock index a377329a7..2ba363c26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -548,9 +548,9 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" +checksum = "09ec2f926cc3060f09db9ebc5b52823d85268d24bb917e472c0c4bea35780a7d" dependencies = [ "bit-vec 0.9.1", ] @@ -1775,12 +1775,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "foldhash" version = "0.2.0" @@ -2006,7 +2000,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d99fc21d493812643aae86d53b7bbd02f376434a90317e8a790bc209fdd6605e" dependencies = [ "bytemuck", - "foldhash 0.2.0", + "foldhash", "hashbrown 0.17.1", "log", "peniko", @@ -2107,26 +2101,6 @@ dependencies = [ "windows", ] -[[package]] -name = "gpu-descriptor" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" -dependencies = [ - "bitflags 2.13.0", - "gpu-descriptor-types", - "hashbrown 0.15.5", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags 2.13.0", -] - [[package]] name = "guillotiere" version = "0.7.0" @@ -2160,15 +2134,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - [[package]] name = "hashbrown" version = "0.16.1" @@ -2177,7 +2142,7 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash 0.2.0", + "foldhash", ] [[package]] @@ -2186,7 +2151,7 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ - "foldhash 0.2.0", + "foldhash", ] [[package]] @@ -2239,12 +2204,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - [[package]] name = "home" version = "0.5.12" @@ -2589,11 +2548,12 @@ checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -2849,22 +2809,22 @@ dependencies = [ [[package]] name = "naga" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bf919621e7975acb27d881bae2fb993e0d45c8e0446e85e6272971e00dc8df" +checksum = "23bf0a141a9ab6f07dbb492db53245e464bc9db42f407772d9ae03d83a2c1033" dependencies = [ "arrayvec", - "bit-set 0.9.1", + "bit-set 0.10.0", "bitflags 2.13.0", "cfg-if", "cfg_aliases", "codespan-reporting", "half", - "hashbrown 0.16.1", - "hexf-parse", + "hashbrown 0.17.1", "indexmap", "libm", "log", + "naga-types", "num-traits", "once_cell", "rustc-hash 1.1.0", @@ -2873,6 +2833,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "naga-types" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658200ddc25c6c7b860747516d132d1b284c0fafb7a380233acee9a72fb30e11" +dependencies = [ + "hashbrown 0.17.1", + "indexmap", + "rustc-hash 1.1.0", + "thiserror 2.0.18", +] + [[package]] name = "ndk" version = "0.9.0" @@ -3186,6 +3158,7 @@ dependencies = [ "bitflags 2.13.0", "objc2 0.6.4", "objc2-core-foundation", + "objc2-core-graphics", "objc2-foundation 0.3.2", "objc2-metal 0.3.2", ] @@ -4575,7 +4548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -5161,9 +5134,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -5174,23 +5147,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5198,9 +5167,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -5211,9 +5180,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] @@ -5329,9 +5298,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -5380,9 +5349,9 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e8840e1ba2881d4cbb18d2147627a56af426ff064c0401eb0c8410c6325d07" +checksum = "6d8f4bd44d92da5270f03409dba9f952dab24f128e05d6a554926101d1bf9114" dependencies = [ "arrayvec", "bitflags 2.13.0", @@ -5390,7 +5359,7 @@ dependencies = [ "cfg-if", "cfg_aliases", "document-features", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "js-sys", "log", "naga", @@ -5410,21 +5379,22 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f519832254e56965a9940c4af57dcb75f702b6f6fa4a0b172f685395843a4d7" +checksum = "08763620e76fc980bca7bf84de82568614487a53172dd968d89187282eb87fa2" dependencies = [ "arrayvec", - "bit-set 0.9.1", + "bit-set 0.10.0", "bit-vec 0.9.1", "bitflags 2.13.0", "bytemuck", "cfg_aliases", "document-features", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "indexmap", "log", "naga", + "naga-types", "once_cell", "parking_lot", "portable-atomic", @@ -5444,50 +5414,50 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e39e26c4c0e07589e67d18546cf79ff45383659fc72fca4dd293358a0347f3" +checksum = "3283b6da70d7fc892de95840215aa36381b5d0cbc479e88ee2b173c7b992b225" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01e09be551dc939498bdd5f6b2c66e55ab275dad25825267a08605a80fc9f0af" +checksum = "85dcf2b2e5c2afb9eda64c570a87a4e570304bf39e52eddbaaf222d655b656ad" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-wasm" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1fb1798be2a912497d4c224f72d39bb0cb34af50e8bcc29865bc339c943059" +checksum = "2b6c13228950f36a56023976a6c4ee6714b27fb40e3d52a33f7d3bb6d109c0b1" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e592c1bbef6ad047647ae6e666ebd8cee7a32bb4544d9700ec96cbf73230257" +checksum = "f76bc9c1c186ff3d9054e0d224c93c8c1c79d6653907c5249a5c1ea1a2cb1e43" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ace1c17727311c22a46e4e3faf56ea6de81af99dcc839bdfb54857b94d448d" +checksum = "cf765132d8d5f50e192e7880464890c13f4e7457aafe8e5466e8174586e9f101" dependencies = [ "android_system_properties", "arrayvec", "ash", - "bit-set 0.9.1", + "bit-set 0.10.0", "bitflags 2.13.0", "block2 0.6.2", "bytemuck", @@ -5496,17 +5466,18 @@ dependencies = [ "glow", "glutin_wgl_sys", "gpu-allocator", - "gpu-descriptor", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "js-sys", "khronos-egl", "libc", "libloading", "log", "naga", + "naga-types", "ndk-sys", "objc2 0.6.4", "objc2-core-foundation", + "objc2-core-graphics", "objc2-foundation 0.3.2", "objc2-metal 0.3.2", "objc2-quartz-core 0.3.2", @@ -5521,6 +5492,7 @@ dependencies = [ "raw-window-metal", "renderdoc-sys", "smallvec", + "static_assertions", "thiserror 2.0.18", "wasm-bindgen", "wayland-sys", @@ -5534,9 +5506,9 @@ dependencies = [ [[package]] name = "wgpu-naga-bridge" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95226013f547544b223281cd16a4fb549aa9dcb562adbda0faae4c73ffbbc161" +checksum = "c9eaac644e5008925c78567d272b9d66ef83da55a53cc17fc7daade7bb6e66e5" dependencies = [ "naga", "wgpu-types", @@ -5544,15 +5516,17 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "29.0.4" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84bf84cd9ca8ca45e2b223a3868f1adf9bfc0c66aeac212e76ee7e40fdadf8f5" +checksum = "1a9c93c2b35edde326df60ffdee4c0f5864eac3011d6768b70d43f028ad93565" dependencies = [ "bitflags 2.13.0", "bytemuck", "js-sys", "log", + "naga-types", "raw-window-handle", + "static_assertions", "web-sys", ] diff --git a/Cargo.toml b/Cargo.toml index ff8c02003..78606c8d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -102,7 +102,7 @@ home = "0.5.12" image = { version = "0.25.6", default-features = false } # Can't update to 0.25.7+: it needs png 0.18, which only matches resvg once resvg moves to tiny-skia 0.12 — blocked, see resvg below itertools = "0.15.0" jiff = { version = "0.2.29", default-features = false } -js-sys = "0.3.77" +js-sys = "0.3.103" kittest = { version = "0.4.0" } log = { version = "0.4.33", features = ["std"] } memoffset = "0.9.1" @@ -154,13 +154,13 @@ vello_cpu = { version = "0.0.9", default-features = false, features = [ "u8_pipeline", "f32_pipeline", ] } -wasm-bindgen = "0.2.108" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml. Don't update this spuriously, because of https://github.com/rerun-io/rerun/issues/8766 -wasm-bindgen-futures = "0.4.58" +wasm-bindgen = "0.2.126" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml. Don't update this spuriously, because of https://github.com/rerun-io/rerun/issues/8766 +wasm-bindgen-futures = "0.4.76" wayland-cursor = { version = "0.31.14", default-features = false } -web-sys = "0.3.77" +web-sys = "0.3.103" web-time = "1.1" # Timekeeping for native and web webbrowser = "1.2" -wgpu = { version = "29.0", default-features = false, features = ["std"] } +wgpu = { version = "30.0", default-features = false, features = ["std"] } windows-sys = "0.61.2" winit = { version = "0.30.13", default-features = false } diff --git a/crates/eframe/src/web/web_painter_wgpu.rs b/crates/eframe/src/web/web_painter_wgpu.rs index b16f98a9b..1728d7adc 100644 --- a/crates/eframe/src/web/web_painter_wgpu.rs +++ b/crates/eframe/src/web/web_painter_wgpu.rs @@ -380,7 +380,7 @@ impl WebPainter for WebPainterWgpu { ); } - frame.present(); + render_state.queue.present(frame); } // Free textures marked for destruction **after** queue submit since they might still be used in the current frame. diff --git a/crates/egui-wgpu/src/capture.rs b/crates/egui-wgpu/src/capture.rs index 7eb1bd3ca..193cb4cce 100644 --- a/crates/egui-wgpu/src/capture.rs +++ b/crates/egui-wgpu/src/capture.rs @@ -212,10 +212,14 @@ impl CaptureState { let buffer_slice = buffer.slice(..); let mut pixels = Vec::with_capacity((tex_extent.width * tex_extent.height) as usize); - for padded_row in buffer_slice - .get_mapped_range() - .chunks(padding.padded_bytes_per_row as usize) - { + let mapped_range = match buffer_slice.get_mapped_range() { + Ok(range) => range, + Err(err) => { + log::error!("Failed to get mapped range for reading: {err}"); + return; + } + }; + for padded_row in mapped_range.chunks(padding.padded_bytes_per_row as usize) { let row = &padded_row[..padding.unpadded_bytes_per_row as usize]; for color in row.chunks(4) { pixels.push(epaint::Color32::from_rgba_premultiplied( diff --git a/crates/egui-wgpu/src/lib.rs b/crates/egui-wgpu/src/lib.rs index 10cd7cf04..d48198ed7 100644 --- a/crates/egui-wgpu/src/lib.rs +++ b/crates/egui-wgpu/src/lib.rs @@ -150,6 +150,7 @@ async fn request_adapter( // * fails if there's no software rasterizer available // * can achieve the same with `native_adapter_selector` force_fallback_adapter: false, + apply_limit_buckets: false, }) .await .inspect_err(|_err| { @@ -473,6 +474,7 @@ pub fn adapter_info_summary(info: &wgpu::AdapterInfo) -> String { subgroup_min_size, subgroup_max_size, transient_saves_memory, + limit_bucket, } = &info; // Example values: @@ -523,9 +525,10 @@ pub fn adapter_info_summary(info: &wgpu::AdapterInfo) -> String { } write!( summary, - ", transient_saves_memory: {transient_saves_memory}" + ", transient_saves_memory: {transient_saves_memory:?}" ) .ok(); + write!(summary, ", limit_bucket: {limit_bucket:?}").ok(); summary } diff --git a/crates/egui-wgpu/src/renderer.rs b/crates/egui-wgpu/src/renderer.rs index ff850af33..2ff9f7e4a 100644 --- a/crates/egui-wgpu/src/renderer.rs +++ b/crates/egui-wgpu/src/renderer.rs @@ -375,14 +375,14 @@ impl Renderer { vertex: wgpu::VertexState { entry_point: Some("vs_main"), module: &module, - buffers: &[wgpu::VertexBufferLayout { + buffers: &[Some(wgpu::VertexBufferLayout { array_stride: 5 * 4, step_mode: wgpu::VertexStepMode::Vertex, // 0: vec2 position // 1: vec2 texture coordinates // 2: uint color attributes: &wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x2, 2 => Uint32], - }], + })], compilation_options: wgpu::PipelineCompilationOptions::default() }, primitive: wgpu::PrimitiveState { diff --git a/crates/egui-wgpu/src/setup.rs b/crates/egui-wgpu/src/setup.rs index cf8b652c2..f2733a6e7 100644 --- a/crates/egui-wgpu/src/setup.rs +++ b/crates/egui-wgpu/src/setup.rs @@ -39,6 +39,7 @@ where } #[derive(Clone)] +#[expect(clippy::large_enum_variant)] pub enum WgpuSetup { /// Construct a wgpu setup using some predefined settings & heuristics. /// This is the default option. You can customize most behaviours overriding the diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 0730f203b..1abf2d2fa 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -765,7 +765,7 @@ impl Painter { profiling::scope!("present"); // wgpu doesn't document where vsync can happen. Maybe here? let start = web_time::Instant::now(); - output_frame.present(); + render_state.queue.present(output_frame); vsync_sec += start.elapsed().as_secs_f32(); } diff --git a/crates/egui_demo_app/src/backend_panel.rs b/crates/egui_demo_app/src/backend_panel.rs index acd114ff4..4d6039a85 100644 --- a/crates/egui_demo_app/src/backend_panel.rs +++ b/crates/egui_demo_app/src/backend_panel.rs @@ -223,6 +223,7 @@ fn integration_ui(ui: &mut egui::Ui, _frame: &mut eframe::Frame) { subgroup_min_size, subgroup_max_size, transient_saves_memory, + limit_bucket, } = &info; // Example values: @@ -276,7 +277,11 @@ fn integration_ui(ui: &mut egui::Ui, _frame: &mut eframe::Frame) { ui.end_row(); } ui.label("Transient saves memory:"); - ui.label(format!("{transient_saves_memory}")); + ui.label(format!("{transient_saves_memory:?}")); + ui.end_row(); + + ui.label("Limit bucket:"); + ui.label(format!("{limit_bucket:?}")); ui.end_row(); }); }; diff --git a/crates/egui_kittest/src/texture_to_image.rs b/crates/egui_kittest/src/texture_to_image.rs index 5172555fe..289033fba 100644 --- a/crates/egui_kittest/src/texture_to_image.rs +++ b/crates/egui_kittest/src/texture_to_image.rs @@ -58,7 +58,9 @@ pub(crate) fn texture_to_image(device: &Device, queue: &Queue, texture: &Texture receiver.recv().unwrap().unwrap(); let buffer_slice = output_buffer.slice(..); - let data = buffer_slice.get_mapped_range(); + let data = buffer_slice + .get_mapped_range() + .expect("Failed to get mapped range"); let data = data .chunks_exact(buffer_dimensions.padded_bytes_per_row) .flat_map(|row| row.iter().take(buffer_dimensions.unpadded_bytes_per_row)) diff --git a/scripts/setup_web.sh b/scripts/setup_web.sh index 5ba11b665..0bd43e45a 100755 --- a/scripts/setup_web.sh +++ b/scripts/setup_web.sh @@ -10,6 +10,6 @@ rustup target add wasm32-unknown-unknown # For generating JS bindings: # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml -if ! cargo install --list | grep -q 'wasm-bindgen-cli v0.2.108'; then - cargo install --force --quiet wasm-bindgen-cli --version 0.2.108 --locked +if ! cargo install --list | grep -q 'wasm-bindgen-cli v0.2.126'; then + cargo install --force --quiet wasm-bindgen-cli --version 0.2.126 --locked fi From d28929ec7225205100590fce2836f885bc9ba688 Mon Sep 17 00:00:00 2001 From: Vitaly Kravchenko Date: Thu, 23 Jul 2026 15:58:26 +0100 Subject: [PATCH 06/16] Rerun `sizing_pass` when reopening popup (#8315) * Closes * [x] I have followed the instructions in the PR template ## Summary - Recalculate a menu popup's cached `Area` size when it reopens. - Preserve cached sizing for continuously open menus and leave tooltips and general popups unchanged. - Add a headless regression test covering a wider item added while the menu is closed. ## Root cause `Area` keeps its cached size after a menu closes. When that menu reopened with wider content, the cached width constrained the new item and caused it to wrap instead of allowing the popup to grow. The fix requests the same invisible sizing pass used for a first-open `Area` whenever a menu was not open during the previous frame. ## User impact Menus now expand to fit newly added wider items after reopening. Existing wrapping, explicit-width, alignment, screen-constraining, and continuously open menu behavior remain unchanged. ## Validation - `cargo test -p egui_kittest --test menu` - `cargo check -p egui` - `cargo fmt --all -- --check` --- crates/egui/src/containers/popup.rs | 1 + crates/egui_kittest/tests/popup.rs | 67 +++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/crates/egui/src/containers/popup.rs b/crates/egui/src/containers/popup.rs index 2a9335ede..080c00bd1 100644 --- a/crates/egui/src/containers/popup.rs +++ b/crates/egui/src/containers/popup.rs @@ -571,6 +571,7 @@ impl<'a> Popup<'a> { .fixed_pos(anchor) .sense(sense) .layout(layout) + .sizing_pass(!was_open_last_frame) .info(info.unwrap_or_else(|| { UiStackInfo::new(kind.into()).with_tag_value( MenuConfig::MENU_CONFIG_TAG, diff --git a/crates/egui_kittest/tests/popup.rs b/crates/egui_kittest/tests/popup.rs index a8d3bcc9d..4dbe33909 100644 --- a/crates/egui_kittest/tests/popup.rs +++ b/crates/egui_kittest/tests/popup.rs @@ -1,5 +1,72 @@ +use egui::{Align, Layout, Popup}; +use egui_kittest::Harness; use kittest::Queryable as _; +#[test] +fn reopened_popup_resizes_for_wider_items() { + const POPUP_BUTTON: &str = "Dynamic popup"; + const SHORT_ITEM: &str = "Short item"; + const WIDE_ITEM: &str = "Newly added item with a much wider label"; + + #[derive(Default)] + struct State { + open: bool, + show_wide_item: bool, + } + + let mut harness = Harness::builder() + .with_size(egui::Vec2::new(500.0, 300.0)) + .build_ui_state( + |ui, state| { + let response = ui.button(POPUP_BUTTON); + if response.clicked() { + state.open = !state.open; + } + + Popup::from_response(&response) + .open(state.open) + .layout(Layout::top_down_justified(Align::Min)) + .show(|ui| { + _ = ui.selectable_label(false, SHORT_ITEM); + _ = ui.selectable_label(false, "Another short item"); + if state.show_wide_item { + _ = ui.selectable_label(false, WIDE_ITEM); + } + }); + }, + State::default(), + ); + + harness.get_by_label(POPUP_BUTTON).click(); + harness.run(); + let initial_row_size = harness.get_by_label(SHORT_ITEM).rect().size(); + + harness.get_by_label(POPUP_BUTTON).click(); + harness.run(); + assert!(harness.query_by_label(SHORT_ITEM).is_none()); + + harness.state_mut().show_wide_item = true; + harness.run(); + harness.get_by_label(POPUP_BUTTON).click(); + harness.run(); + + let reopened_row_size = harness.get_by_label(SHORT_ITEM).rect().size(); + let wide_row_size = harness.get_by_label(WIDE_ITEM).rect().size(); + + assert!( + reopened_row_size.x > initial_row_size.x, + "reopened row width ({}) did not grow beyond its initial width ({})", + reopened_row_size.x, + initial_row_size.x + ); + assert!( + wide_row_size.y <= initial_row_size.y + 0.5, + "new row height ({}) exceeds the single-line row height ({})", + wide_row_size.y, + initial_row_size.y + ); +} + #[test] fn test_interactive_tooltip() { struct State { From b98f4b40344e2a815db32388510d2c0ad792d109 Mon Sep 17 00:00:00 2001 From: Davy <95214375+thedavidweng@users.noreply.github.com> Date: Fri, 24 Jul 2026 01:23:06 -0700 Subject: [PATCH 07/16] Ignore RUSTSEC-2026-0206 (rustybuzz unmaintained) in cargo-deny (#8334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - [x] I have followed the instructions in the PR template Fixes the 12 failing `cargo-deny` CI checks on `main` (introduced by #8289). ### Root cause `rustybuzz` was flagged as unmaintained by [RUSTSEC-2026-0206](https://rustsec.org/advisories/RUSTSEC-2026-0206), reported on 2026-07-12 — after the previous cargo-deny fix (#8300) was merged on 2026-07-07. The advisory fires on all 12 cargo-deny target triples. `rustybuzz` is pulled in transitively via `resvg` → `usvg`, which `egui_extras` uses for SVG support. ### Why ignore (not fix)? - `resvg` is pinned at `0.45.1` and cannot be bumped: `0.47` needs `tiny-skia 0.12`, but `winit 0.30`'s `sctk-adwaita` is stuck on `tiny-skia 0.11` (see comment in `Cargo.toml` line 128). - The advisory's recommended replacement is [`harfrust`](https://github.com/harfbuzz/harfrust), which `resvg` has not adopted yet. - This is the same pattern used for the other transitively-unmaintained advisories already in the ignore list (`ttf-parser` via winit, `quick-xml` via accesskit/wayland, `bincode`, `yaml-rust`). ### Change Added `RUSTSEC-2026-0206` to the `[advisories] ignore` list in `deny.toml` with an explanatory comment. ## Test plan - [x] `cargo deny check advisories` — passes (`advisories ok`) - [x] `cargo deny check` — all sections pass (`advisories ok, bans ok, licenses ok, sources ok`) --------- Co-authored-by: Lucas Meurer --- deny.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/deny.toml b/deny.toml index dc1e50be1..ff6c8e2ac 100644 --- a/deny.toml +++ b/deny.toml @@ -36,6 +36,7 @@ ignore = [ "RUSTSEC-2026-0192", # ttf-parser is unmaintained. Only brought in via winit/sctk-adwaita (wayland window frame rendering) "RUSTSEC-2026-0194", # quick-xml DoS - fix is in >=0.41, but held back transitively by zbus_xml (accesskit) and wayland-scanner (winit) "RUSTSEC-2026-0195", # quick-xml DoS - same as above + "RUSTSEC-2026-0206", # rustybuzz is unmaintained. Brought in via resvg. TODO(linebender/resvg#922): Remove once the PR lands and is released ] [bans] From e6eb00a31c7089d4458c55fcbe5f1253311a7176 Mon Sep 17 00:00:00 2001 From: Davy <95214375+thedavidweng@users.noreply.github.com> Date: Fri, 24 Jul 2026 01:24:33 -0700 Subject: [PATCH 08/16] Fix comment style: add space after // (#8333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - [x] I have followed the instructions in the PR template Fixes comment-style violations of the `CONTRIBUTING.md` code style rule: > `// Comment like this.` and not `//like this` ### Files changed - `crates/epaint/src/shapes/bezier_shape.rs`: `//temporary solution` → `// temporary solution`, and 22× `//add the start point` → `// add the start point` - `crates/egui/src/animation_manager.rs`: `//start new animation…` → `// start new animation…` - `crates/eframe/src/web/web_painter_wgpu.rs`: `//create_new.instance_descriptor…` → `// create_new.instance_descriptor…` No code logic changes — only adding the missing space after `//` in inline and standalone comments. ## Test plan - [x] `cargo fmt --check` - [x] `cargo clippy -p epaint -p egui` - [x] `cargo test -p epaint --lib` --- crates/eframe/src/web/web_painter_wgpu.rs | 2 +- crates/egui/src/animation_manager.rs | 2 +- crates/epaint/src/shapes/bezier_shape.rs | 46 +++++++++++------------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/crates/eframe/src/web/web_painter_wgpu.rs b/crates/eframe/src/web/web_painter_wgpu.rs index 1728d7adc..0665d99f9 100644 --- a/crates/eframe/src/web/web_painter_wgpu.rs +++ b/crates/eframe/src/web/web_painter_wgpu.rs @@ -90,7 +90,7 @@ impl WebPainterWgpu { && create_new.display_handle.is_none() { // Force WebGL, useful for quick & dirty testing: - //create_new.instance_descriptor.backends = wgpu::Backends::GL; + // create_new.instance_descriptor.backends = wgpu::Backends::GL; create_new.display_handle = Some(Box::new(WebDisplay)); } diff --git a/crates/egui/src/animation_manager.rs b/crates/egui/src/animation_manager.rs index 50f97e992..4dc21df09 100644 --- a/crates/egui/src/animation_manager.rs +++ b/crates/egui/src/animation_manager.rs @@ -95,7 +95,7 @@ impl AnimationManager { anim.from_value..=anim.to_value, ); if anim.to_value != value { - anim.from_value = current_value; //start new animation from current position of playing animation + anim.from_value = current_value; // start new animation from current position of playing animation anim.to_value = value; anim.toggle_time = input.time; } diff --git a/crates/epaint/src/shapes/bezier_shape.rs b/crates/epaint/src/shapes/bezier_shape.rs index b20c56691..dfeaae5ec 100644 --- a/crates/epaint/src/shapes/bezier_shape.rs +++ b/crates/epaint/src/shapes/bezier_shape.rs @@ -86,7 +86,7 @@ impl CubicBezierShape { /// Logical bounding rectangle (ignoring stroke width) pub fn logical_bounding_rect(&self) -> Rect { - //temporary solution + // temporary solution let (mut min_x, mut max_x) = if self.points[0].x < self.points[3].x { (self.points[0].x, self.points[3].x) } else { @@ -793,7 +793,7 @@ mod tests { assert!((bbox.max.x - 180.0).abs() < 0.01); assert!((bbox.max.y - 170.0).abs() < 0.01); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.1, &mut |pos, _t| { result.push(pos); }); @@ -817,7 +817,7 @@ mod tests { assert!((bbox.max.x - 130.42).abs() < 0.01); assert!((bbox.max.y - 170.0).abs() < 0.01); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.1, &mut |pos, _t| { result.push(pos); }); @@ -837,28 +837,28 @@ mod tests { fill: Default::default(), stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(1.0, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 9); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.1, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 25); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 77); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.001, &mut |pos, _t| { result.push(pos); }); @@ -938,35 +938,35 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(1.0, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 10); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.5, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 13); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.1, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 28); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 83); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.001, &mut |pos, _t| { result.push(pos); }); @@ -988,7 +988,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1007,7 +1007,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1026,7 +1026,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1045,7 +1045,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1064,7 +1064,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1083,7 +1083,7 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); @@ -1100,34 +1100,34 @@ mod tests { stroke: Default::default(), }; - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(1.0, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 9); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.5, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 11); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.1, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 24); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.01, &mut |pos, _t| { result.push(pos); }); assert_eq!(result.len(), 72); - let mut result = vec![curve.points[0]]; //add the start point + let mut result = vec![curve.points[0]]; // add the start point curve.for_each_flattened_with_t(0.001, &mut |pos, _t| { result.push(pos); }); From 2cb071f7f6d71e0f888ba31bec9b3eb5ed5428fe Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Mon, 27 Jul 2026 16:17:22 +0200 Subject: [PATCH 09/16] Remove `Modifiers` from `RawInput` and make it a `egui::Event` (#8336) - needs #8335 Previously it was impossible to correctly set modifiers via egui inspection, since that only passes egui::Event and egui::Event had no way to generally express modifiers. Now modifiers are passed to egui as a Event and not as a field of `RawInput`. --------- Co-authored-by: Emil Ernerfeldt --- crates/eframe/src/web/backend.rs | 20 ++++++++++- crates/eframe/src/web/events.rs | 20 +++++------ crates/egui-winit/src/lib.rs | 45 ++++++++++++++++--------- crates/egui/src/data/input/event.rs | 3 ++ crates/egui/src/data/input/raw_input.rs | 11 +----- crates/egui/src/input_state/mod.rs | 7 +++- crates/egui_kittest/src/lib.rs | 28 ++++++--------- crates/egui_kittest/src/node.rs | 41 +++++++++++++--------- 8 files changed, 106 insertions(+), 69 deletions(-) diff --git a/crates/eframe/src/web/backend.rs b/crates/eframe/src/web/backend.rs index e2724fc49..9c092b68d 100644 --- a/crates/eframe/src/web/backend.rs +++ b/crates/eframe/src/web/backend.rs @@ -20,6 +20,12 @@ pub(crate) struct WebInput { /// Helps to track the delta rotation from gesture events pub accumulated_rotation: f32, + /// The last modifier state we sent to egui. + /// + /// The web has no dedicated modifier event, so we derive the state from each DOM event and + /// emit [`egui::Event::ModifiersChanged`] when it changes (see [`Self::set_modifiers`]). + pub modifiers: egui::Modifiers, + /// The raw input to `egui`. pub raw: egui::RawInput, } @@ -53,11 +59,23 @@ impl WebInput { } // log::debug!("on_web_page_focus_change: {focused}"); - self.raw.modifiers = egui::Modifiers::default(); // Avoid sticky modifier keys on alt-tab: + self.modifiers = egui::Modifiers::default(); // Avoid sticky modifier keys on alt-tab: self.raw.focused = focused; self.raw.events.push(egui::Event::WindowFocused(focused)); self.primary_touch = None; } + + /// Update the modifier state, emitting [`egui::Event::ModifiersChanged`] if it changed. + /// + /// Call before pushing the DOM event itself so egui sees the new modifier state first. + pub fn set_modifiers(&mut self, modifiers: egui::Modifiers) { + if self.modifiers != modifiers { + self.modifiers = modifiers; + self.raw + .events + .push(egui::Event::ModifiersChanged(modifiers)); + } + } } // ---------------------------------------------------------------------------- diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index f6ff078c5..308c268a6 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -196,7 +196,7 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner) } let modifiers = modifiers_from_kb_event(&event); - runner.input.raw.modifiers = modifiers; + runner.input.set_modifiers(modifiers); let key = event.key(); let egui_key = translate_key(&key); @@ -287,7 +287,7 @@ fn install_keyup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsV #[expect(clippy::needless_pass_by_value)] // So that we can pass it directly to `add_event_listener` pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) { let modifiers = modifiers_from_kb_event(&event); - runner.input.raw.modifiers = modifiers; + runner.input.set_modifiers(modifiers); let mut should_stop_propagation = true; @@ -535,11 +535,11 @@ fn install_pointerdown(runner_ref: &WebRunner, target: &EventTarget) -> Result<( "pointerdown", |event: web_sys::PointerEvent, runner: &mut AppRunner| { let modifiers = modifiers_from_mouse_event(&event); - runner.input.raw.modifiers = modifiers; + runner.input.set_modifiers(modifiers); let mut should_stop_propagation = true; if let Some(button) = button_from_mouse_event(&event) { let pos = pos_from_mouse_event(runner.canvas(), &event, runner.egui_ctx()); - let modifiers = runner.input.raw.modifiers; + let modifiers = runner.input.modifiers; let egui_event = egui::Event::PointerButton { pos, button, @@ -572,7 +572,7 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), "pointerup", |event: web_sys::PointerEvent, runner| { let modifiers = modifiers_from_mouse_event(&event); - runner.input.raw.modifiers = modifiers; + runner.input.set_modifiers(modifiers); let pos = pos_from_mouse_event(runner.canvas(), &event, runner.egui_ctx()); @@ -581,7 +581,7 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), egui::pos2(event.client_x() as f32, event.client_y() as f32), ) && let Some(button) = button_from_mouse_event(&event) { - let modifiers = runner.input.raw.modifiers; + let modifiers = runner.input.modifiers; let egui_event = egui::Event::PointerButton { pos, button, @@ -647,7 +647,7 @@ fn is_interested_in_pointer_event(runner: &AppRunner, pos: egui::Pos2) -> bool { fn install_mousemove(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsValue> { runner_ref.add_event_listener(target, "mousemove", |event: web_sys::MouseEvent, runner| { let modifiers = modifiers_from_mouse_event(&event); - runner.input.raw.modifiers = modifiers; + runner.input.set_modifiers(modifiers); let pos = pos_from_mouse_event(runner.canvas(), &event, runner.egui_ctx()); @@ -705,7 +705,7 @@ fn install_touchstart(runner_ref: &WebRunner, target: &EventTarget) -> Result<() pos, button: egui::PointerButton::Primary, pressed: true, - modifiers: runner.input.raw.modifiers, + modifiers: runner.input.modifiers, }; should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event); should_prevent_default = (runner.web_options.should_prevent_default)(&egui_event); @@ -770,7 +770,7 @@ fn install_touchend(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), pos, button: egui::PointerButton::Primary, pressed: false, - modifiers: runner.input.raw.modifiers, + modifiers: runner.input.modifiers, }; should_stop_propagation &= (runner.web_options.should_stop_propagation)(&egui_event); should_prevent_default &= (runner.web_options.should_prevent_default)(&egui_event); @@ -832,7 +832,7 @@ fn install_wheel(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsV let modifiers = modifiers_from_wheel_event(&event); - let egui_event = if modifiers.ctrl && !runner.input.raw.modifiers.ctrl { + let egui_event = if modifiers.ctrl && !runner.input.modifiers.ctrl { // The browser is saying the ctrl key is down, but it isn't _really_. // This happens on pinch-to-zoom on multitouch trackpads // egui will treat ctrl+scroll as zoom, so it all works. diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 908ac8ff3..d17428adb 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -84,6 +84,13 @@ pub struct State { viewport_id: ViewportId, start_time: web_time::Instant, egui_input: egui::RawInput, + + /// The current modifier state. + /// + /// We keep a copy so we can stamp + /// it onto per-event `modifiers` fields and emit [`egui::Event::ModifiersChanged`]. + modifiers: egui::Modifiers, + pointer_pos_in_points: Option, any_pointer_button_down: bool, current_cursor_icon: Option, @@ -146,6 +153,7 @@ impl State { .unwrap_or_else(web_time::Instant::now), egui_ctx, egui_input, + modifiers: egui::Modifiers::default(), pointer_pos_in_points: None, any_pointer_button_down: false, current_cursor_icon: None, @@ -422,6 +430,10 @@ impl State { }; self.egui_input.focused = focused; + if !focused { + // Avoid sticky modifiers when focus is lost (egui clears its own copy too). + self.modifiers = egui::Modifiers::default(); + } self.egui_input .events .push(egui::Event::WindowFocused(focused)); @@ -473,16 +485,20 @@ impl State { let shift = state.shift_key(); let super_ = state.super_key(); - self.egui_input.modifiers.alt = alt; - self.egui_input.modifiers.ctrl = ctrl; - self.egui_input.modifiers.shift = shift; - self.egui_input.modifiers.mac_cmd = cfg!(target_os = "macos") && super_; - self.egui_input.modifiers.command = if cfg!(target_os = "macos") { + self.modifiers.alt = alt; + self.modifiers.ctrl = ctrl; + self.modifiers.shift = shift; + self.modifiers.mac_cmd = cfg!(target_os = "macos") && super_; + self.modifiers.command = if cfg!(target_os = "macos") { super_ } else { ctrl }; + self.egui_input + .events + .push(egui::Event::ModifiersChanged(self.modifiers)); + EventResponse { repaint: true, consumed: false, @@ -541,7 +557,7 @@ impl State { unit: egui::MouseWheelUnit::Point, delta: Vec2::new(delta.x, delta.y) / pixels_per_point, phase: to_egui_touch_phase(*phase), - modifiers: self.egui_input.modifiers, + modifiers: self.modifiers, }); EventResponse { repaint: true, @@ -790,7 +806,7 @@ impl State { pos, button, pressed, - modifiers: self.egui_input.modifiers, + modifiers: self.modifiers, }); if self.simulate_touch_screen { @@ -937,7 +953,7 @@ impl State { ), }; let phase = to_egui_touch_phase(phase); - let modifiers = self.egui_input.modifiers; + let modifiers = self.modifiers; self.egui_input.events.push(egui::Event::MouseWheel { unit, delta, @@ -998,13 +1014,13 @@ impl State { // See also: https://github.com/emilk/egui/issues/3653 if let Some(active_key) = logical_key.or(physical_key) { if pressed { - if is_cut_command(self.egui_input.modifiers, active_key) { + if is_cut_command(self.modifiers, active_key) { self.egui_input.events.push(egui::Event::Cut); return; - } else if is_copy_command(self.egui_input.modifiers, active_key) { + } else if is_copy_command(self.modifiers, active_key) { self.egui_input.events.push(egui::Event::Copy); return; - } else if is_paste_command(self.egui_input.modifiers, active_key) { + } else if is_paste_command(self.modifiers, active_key) { if let Some(contents) = self.clipboard.get() { let contents = contents.replace("\r\n", "\n"); if !contents.is_empty() { @@ -1020,7 +1036,7 @@ impl State { physical_key, pressed, repeat: false, // egui will fill this in for us! - modifiers: self.egui_input.modifiers, + modifiers: self.modifiers, }); } @@ -1036,9 +1052,8 @@ impl State { // We need to ignore these characters that are side-effects of commands. // Also make sure the key is pressed (not released). On Linux, text might // contain some data even when the key is released. - let is_cmd = self.egui_input.modifiers.ctrl - || self.egui_input.modifiers.command - || self.egui_input.modifiers.mac_cmd; + let is_cmd = + self.modifiers.ctrl || self.modifiers.command || self.modifiers.mac_cmd; if pressed && !is_cmd { self.egui_input .events diff --git a/crates/egui/src/data/input/event.rs b/crates/egui/src/data/input/event.rs index 117a200b6..9641d081d 100644 --- a/crates/egui/src/data/input/event.rs +++ b/crates/egui/src/data/input/event.rs @@ -69,6 +69,9 @@ pub enum Event { modifiers: Modifiers, }, + /// The set of held modifier keys changed. + ModifiersChanged(Modifiers), + /// The mouse or touch moved to a new place. PointerMoved(Pos2), diff --git a/crates/egui/src/data/input/raw_input.rs b/crates/egui/src/data/input/raw_input.rs index 2ba2caada..b9fc6e66a 100644 --- a/crates/egui/src/data/input/raw_input.rs +++ b/crates/egui/src/data/input/raw_input.rs @@ -1,6 +1,6 @@ use crate::{OrderedViewportIdMap, Theme, ViewportId, ViewportIdMap, emath::Rect}; -use super::{DroppedFile, Event, HoveredFile, Modifiers, SafeAreaInsets, ViewportInfo}; +use super::{DroppedFile, Event, HoveredFile, SafeAreaInsets, ViewportInfo}; /// What the integrations provides to egui at the start of each frame. /// @@ -53,9 +53,6 @@ pub struct RawInput { /// Can safely be left at its default value. pub predicted_dt: f32, - /// Which modifier keys are down at the start of the frame? - pub modifiers: Modifiers, - /// In-order events received this frame. /// /// There is currently no way to know if egui handles a particular event, @@ -92,7 +89,6 @@ impl Default for RawInput { max_texture_side: None, time: None, predicted_dt: 1.0 / 60.0, - modifiers: Modifiers::default(), events: vec![], hovered_files: Default::default(), dropped_files: Default::default(), @@ -127,7 +123,6 @@ impl RawInput { max_texture_side: self.max_texture_side.take(), time: self.time, predicted_dt: self.predicted_dt, - modifiers: self.modifiers, events: std::mem::take(&mut self.events), hovered_files: self.hovered_files.clone(), dropped_files: std::mem::take(&mut self.dropped_files), @@ -145,7 +140,6 @@ impl RawInput { max_texture_side, time, predicted_dt, - modifiers, mut events, mut hovered_files, mut dropped_files, @@ -160,7 +154,6 @@ impl RawInput { self.max_texture_side = max_texture_side.or(self.max_texture_side); self.time = time; // use latest time self.predicted_dt = predicted_dt; // use latest dt - self.modifiers = modifiers; // use latest self.events.append(&mut events); self.hovered_files.append(&mut hovered_files); self.dropped_files.append(&mut dropped_files); @@ -179,7 +172,6 @@ impl RawInput { max_texture_side, time, predicted_dt, - modifiers, events, hovered_files, dropped_files, @@ -210,7 +202,6 @@ impl RawInput { ui.label("time: None"); } ui.label(format!("predicted_dt: {:.1} ms", 1e3 * predicted_dt)); - ui.label(format!("modifiers: {modifiers:#?}")); ui.label(format!("hovered_files: {}", hovered_files.len())); ui.label(format!("dropped_files: {}", dropped_files.len())); ui.label(format!("focused: {focused}")); diff --git a/crates/egui/src/input_state/mod.rs b/crates/egui/src/input_state/mod.rs index 55c76bb06..36d6f9bc9 100644 --- a/crates/egui/src/input_state/mod.rs +++ b/crates/egui/src/input_state/mod.rs @@ -393,6 +393,7 @@ impl InputState { let pointer = self.pointer.begin_pass(time, &new, options); let mut keys_down = self.keys_down; + let mut modifiers = self.modifiers; let mut zoom_factor_delta = 1.0; // TODO(emilk): smoothing for zoom factor let mut rotation_radians = 0.0; @@ -429,6 +430,9 @@ impl InputState { *modifiers, ); } + Event::ModifiersChanged(new_modifiers) => { + modifiers = *new_modifiers; + } Event::Zoom(factor) => { zoom_factor_delta *= *factor; } @@ -442,6 +446,7 @@ impl InputState { // So we take the safe route and just clear all the keys and modifiers when // the app loses focus. keys_down.clear(); + modifiers = Modifiers::default(); } _ => {} } @@ -482,7 +487,7 @@ impl InputState { predicted_dt: new.predicted_dt, stable_dt, focused: new.focused, - modifiers: new.modifiers, + modifiers, keys_down, events: new.events.clone(), // TODO(emilk): remove clone() and use raw.events raw: new, diff --git a/crates/egui_kittest/src/lib.rs b/crates/egui_kittest/src/lib.rs index 3c859560d..4f691c8c4 100644 --- a/crates/egui_kittest/src/lib.rs +++ b/crates/egui_kittest/src/lib.rs @@ -251,14 +251,7 @@ impl<'a, State> Harness<'a, State> { self._step(false); } for event in events { - match event { - EventType::Event(event) => { - self.input.events.push(event); - } - EventType::Modifiers(modifiers) => { - self.input.modifiers = modifiers; - } - } + self.input.events.push(event); self._step(false); } } @@ -471,7 +464,7 @@ impl<'a, State> Harness<'a, State> { /// Queue an event to be processed in the next frame. pub fn event(&self, event: egui::Event) { - self.queued_events.lock().push(EventType::Event(event)); + self.queued_events.lock().push(event); } /// Queue an event with modifiers. @@ -479,15 +472,15 @@ impl<'a, State> Harness<'a, State> { /// Queues the modifiers to be pressed, then the event, then the modifiers to be released. pub fn event_modifiers(&self, event: egui::Event, modifiers: Modifiers) { let mut queue = self.queued_events.lock(); - queue.push(EventType::Modifiers(modifiers)); - queue.push(EventType::Event(event)); - queue.push(EventType::Modifiers(Modifiers::default())); + queue.push(egui::Event::ModifiersChanged(modifiers)); + queue.push(event); + queue.push(egui::Event::ModifiersChanged(Modifiers::default())); } fn modifiers(&self, modifiers: Modifiers) { self.queued_events .lock() - .push(EventType::Modifiers(modifiers)); + .push(egui::Event::ModifiersChanged(modifiers)); } pub fn key_down(&self, key: egui::Key) { @@ -735,10 +728,11 @@ impl<'a, State> Harness<'a, State> { /// The root node of the test harness. pub fn root(&self) -> Node<'_> { - Node { - accesskit_node: self.kittest.root(), - queue: &self.queued_events, - } + Node::new( + self.kittest.root(), + &self.queued_events, + self.ctx.pixels_per_point(), + ) } /// Spawn a real native eframe window running this harness's app, reusing its [`egui::Context`]. diff --git a/crates/egui_kittest/src/node.rs b/crates/egui_kittest/src/node.rs index 7e3161c09..729fda763 100644 --- a/crates/egui_kittest/src/node.rs +++ b/crates/egui_kittest/src/node.rs @@ -4,17 +4,13 @@ use egui::{Modifiers, PointerButton, Pos2, accesskit}; use kittest::{AccessKitNode, NodeT, debug_fmt_node}; use std::fmt::{Debug, Formatter}; -pub(crate) enum EventType { - Event(egui::Event), - Modifiers(Modifiers), -} - -pub(crate) type EventQueue = Mutex>; +pub type EventQueue = Mutex>; #[derive(Clone, Copy)] pub struct Node<'tree> { pub(crate) accesskit_node: AccessKitNode<'tree>, pub(crate) queue: &'tree EventQueue, + pub(crate) pixels_per_point: f32, } impl Debug for Node<'_> { @@ -29,20 +25,32 @@ impl<'tree> NodeT<'tree> for Node<'tree> { } fn new_related(&self, child_node: AccessKitNode<'tree>) -> Self { - Self { - queue: self.queue, - accesskit_node: child_node, - } + Self::new(child_node, self.queue, self.pixels_per_point) } } -impl Node<'_> { +impl<'tree> Node<'tree> { + /// Construct a new accesskit node + pub fn new( + accesskit_node: AccessKitNode<'tree>, + queue: &'tree EventQueue, + pixels_per_point: f32, + ) -> Self { + Self { + accesskit_node, + queue, + pixels_per_point, + } + } + fn event(&self, event: egui::Event) { - self.queue.lock().push(EventType::Event(event)); + self.queue.lock().push(event); } fn modifiers(&self, modifiers: Modifiers) { - self.queue.lock().push(EventType::Modifiers(modifiers)); + self.queue + .lock() + .push(egui::Event::ModifiersChanged(modifiers)); } pub fn hover(&self) { @@ -104,14 +112,17 @@ impl Node<'_> { )); } + /// This returns the rect in logical ui coordinates while the underlying [`accesskit::Node`] has it + /// in physical screen coordinates. pub fn rect(&self) -> egui::Rect { let rect = self .accesskit_node .bounding_box() .expect("Every egui node should have a rect"); + let ppp = self.pixels_per_point; egui::Rect { - min: Pos2::new(rect.x0 as f32, rect.y0 as f32), - max: Pos2::new(rect.x1 as f32, rect.y1 as f32), + min: Pos2::new(rect.x0 as f32 / ppp, rect.y0 as f32 / ppp), + max: Pos2::new(rect.x1 as f32 / ppp, rect.y1 as f32 / ppp), } } From 8fc323fbcf06558dcbbbc02c54b29c1c38d2660f Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Tue, 28 Jul 2026 09:47:22 +0200 Subject: [PATCH 10/16] Add `egui_inspection::Request::Settle` (#8344) This allows inspection clients to know if the app is in a settled state and/or run the app until it settles (similar to egui_kittests `run`/`run_ok`). --- crates/egui_inspection/src/plugin.rs | 45 ++++++++++++++++++++++++-- crates/egui_inspection/src/protocol.rs | 14 ++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/crates/egui_inspection/src/plugin.rs b/crates/egui_inspection/src/plugin.rs index 4784bd3b7..0ae857ab1 100644 --- a/crates/egui_inspection/src/plugin.rs +++ b/crates/egui_inspection/src/plugin.rs @@ -56,6 +56,9 @@ enum Phase { /// A screenshot was dispatched with this `user_data` id; reply when the matching /// [`egui::Event::Screenshot`] arrives. AwaitScreenshot { id: u64 }, + + /// Watching for the app to go idle. + Settle { steps_taken: u64, max_steps: u64 }, } struct InFlight { @@ -116,7 +119,12 @@ impl InspectionPlugin { /// While requests are still in flight, keep the UI loop spinning — reactive apps would /// otherwise go idle between hooks before a screenshot round-trips. fn maybe_repaint(&self, ctx: &Context) { - if !self.in_flight.is_empty() { + // Don't repaint if there's only a `Request::Settle`. + if self + .in_flight + .iter() + .any(|item| !matches!(item.req, Request::Settle { .. })) + { ctx.request_repaint(); } } @@ -236,6 +244,13 @@ impl egui::Plugin for InspectionPlugin { item.phase = Phase::AwaitScreenshot { id }; true } + Request::Settle { max_steps } => { + item.phase = Phase::Settle { + steps_taken: 0, + max_steps: *max_steps, + }; + true + } } }); self.next_screenshot_id = next_id; @@ -249,9 +264,14 @@ impl egui::Plugin for InspectionPlugin { return; } + let immediate_repaint = output + .viewport_output + .values() + .any(|viewport| viewport.repaint_delay == Duration::ZERO); + let step = self.step; self.in_flight - .retain_mut(|item| match (&item.phase, &item.req) { + .retain_mut(|item| match (&mut item.phase, &item.req) { (Phase::AwaitOutput, Request::GetTree) => { if let Some(reply) = item.reply.take() { reply(Response::Tree { @@ -268,6 +288,27 @@ impl egui::Plugin for InspectionPlugin { } false } + ( + Phase::Settle { + steps_taken, + max_steps, + }, + Request::Settle { .. }, + ) => { + *steps_taken += 1; + let steps_exceeded = *steps_taken >= *max_steps; + if !immediate_repaint || steps_exceeded { + if let Some(reply) = item.reply.take() { + reply(Response::Settled { + settled: !immediate_repaint, + steps: *steps_taken, + }); + } + false + } else { + true + } + } _ => true, }); diff --git a/crates/egui_inspection/src/protocol.rs b/crates/egui_inspection/src/protocol.rs index 12662ab19..631e7c7b1 100644 --- a/crates/egui_inspection/src/protocol.rs +++ b/crates/egui_inspection/src/protocol.rs @@ -63,6 +63,11 @@ pub enum Request { /// (via [`egui::ViewportCommand::InnerSize`]). Reply: [`Response::Done`]. This is the one /// action that isn't expressible as an [`egui::Event`]. Resize { width: u32, height: u32 }, + + /// Wait until the app goes idle, then reply [`Response::Settled`]. + /// + /// Will wait for at most `max_steps`. + Settle { max_steps: u64 }, } /// Sent peer → inspector, exactly one per [`Request`]. @@ -99,6 +104,15 @@ pub enum Response { /// (not merely received): the events were processed by a frame, or the resize dispatched. Done, + /// Reply to [`Request::Settle`]. + Settled { + /// Did we settle within `max_steps`? + settled: bool, + + /// How many frames did we run until we settled? + steps: u64, + }, + /// The peer failed to service the request (recoverable; the connection stays open). Error { message: String }, } From b730815797ad719238c7d7cb9370a606b89a6870 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 28 Jul 2026 01:37:03 -0700 Subject: [PATCH 11/16] Update MSRV from 1.92 to 1.95 (#8348) No particular reason --------- Co-authored-by: Claude Opus 5 (1M context) --- .github/workflows/deploy_web_demo.yml | 2 +- .github/workflows/preview_build.yml | 2 +- .github/workflows/rust.yml | 16 ++++++++-------- Cargo.toml | 13 +++++++++++-- clippy.toml | 2 +- crates/eframe/src/native/run.rs | 4 ++-- crates/egui/src/context.rs | 2 +- crates/egui/src/hit_test.rs | 2 -- crates/egui/src/lib.rs | 2 +- crates/egui/src/memory/mod.rs | 6 +++--- crates/egui/src/util/undoer.rs | 5 ++--- crates/emath/src/history.rs | 18 ++++++++---------- crates/epaint/src/shapes/shape.rs | 6 ++---- crates/epaint/src/text/font.rs | 1 - crates/epaint/src/text/text_layout.rs | 5 ++--- examples/confirm_exit/Cargo.toml | 2 +- examples/custom_3d_glow/Cargo.toml | 2 +- examples/custom_font/Cargo.toml | 2 +- examples/custom_font_style/Cargo.toml | 2 +- examples/custom_keypad/Cargo.toml | 2 +- examples/custom_style/Cargo.toml | 2 +- examples/custom_window_frame/Cargo.toml | 2 +- examples/external_eventloop/Cargo.toml | 2 +- examples/external_eventloop_async/Cargo.toml | 2 +- examples/file_dialog/Cargo.toml | 2 +- examples/font_variations/Cargo.toml | 2 +- examples/hello_android/Cargo.toml | 2 +- examples/hello_world/Cargo.toml | 2 +- examples/hello_world_par/Cargo.toml | 2 +- examples/hello_world_simple/Cargo.toml | 2 +- examples/images/Cargo.toml | 2 +- examples/keyboard_events/Cargo.toml | 2 +- examples/multiple_viewports/Cargo.toml | 2 +- examples/puffin_profiler/Cargo.toml | 2 +- examples/screenshot/Cargo.toml | 2 +- examples/serial_windows/Cargo.toml | 2 +- examples/user_attention/Cargo.toml | 2 +- rust-toolchain | 2 +- scripts/check.sh | 2 +- scripts/clippy_wasm/clippy.toml | 2 +- tests/test_background_logic/Cargo.toml | 2 +- tests/test_egui_extras_compilation/Cargo.toml | 2 +- tests/test_inline_glow_paint/Cargo.toml | 2 +- tests/test_size_pass/Cargo.toml | 2 +- tests/test_ui_stack/Cargo.toml | 2 +- tests/test_viewports/Cargo.toml | 2 +- xtask/src/utils.rs | 2 +- 47 files changed, 75 insertions(+), 75 deletions(-) diff --git a/.github/workflows/deploy_web_demo.yml b/.github/workflows/deploy_web_demo.yml index eb60d14fa..1cd56c950 100644 --- a/.github/workflows/deploy_web_demo.yml +++ b/.github/workflows/deploy_web_demo.yml @@ -38,7 +38,7 @@ jobs: with: profile: minimal target: wasm32-unknown-unknown - toolchain: 1.92.0 + toolchain: 1.95.0 override: true - uses: Swatinem/rust-cache@v2 diff --git a/.github/workflows/preview_build.yml b/.github/workflows/preview_build.yml index 22ea08cba..9316b7e67 100644 --- a/.github/workflows/preview_build.yml +++ b/.github/workflows/preview_build.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 targets: wasm32-unknown-unknown - uses: Swatinem/rust-cache@v2 with: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 18052710b..5821e5784 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -5,7 +5,7 @@ name: Rust env: RUSTFLAGS: -D warnings RUSTDOCFLAGS: -D warnings - NIGHTLY_VERSION: nightly-2025-09-16 + NIGHTLY_VERSION: nightly-2026-04-02 jobs: fmt-crank-check-test: @@ -19,7 +19,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 - name: Install packages (Linux) if: runner.os == 'Linux' @@ -74,7 +74,7 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 targets: wasm32-unknown-unknown - run: sudo apt-get update && sudo apt-get install libgtk-3-dev libatk1.0-dev @@ -148,7 +148,7 @@ jobs: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v2 with: - rust-version: "1.92.0" + rust-version: "1.95.0" log-level: error command: check arguments: --target ${{ matrix.target }} @@ -164,7 +164,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 targets: aarch64-linux-android - name: Set up cargo cache @@ -186,7 +186,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 targets: aarch64-apple-ios - name: Set up cargo cache @@ -206,7 +206,7 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 @@ -228,7 +228,7 @@ jobs: lfs: true - uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.92.0 + toolchain: 1.95.0 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 diff --git a/Cargo.toml b/Cargo.toml index 78606c8d8..6c8566cf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ members = [ [workspace.package] edition = "2024" license = "MIT OR Apache-2.0" -rust-version = "1.92" +rust-version = "1.95" version = "0.35.0" @@ -205,6 +205,7 @@ cloned_instead_of_copied = "warn" coerce_container_to_any = "warn" dbg_macro = "warn" debug_assert_with_mut_call = "warn" +decimal_bitwise_operands = "warn" default_union_representation = "warn" derive_partial_eq_without_eq = "warn" disallowed_macros = "warn" # See clippy.toml @@ -217,9 +218,10 @@ doc_comment_double_space_linebreaks = "warn" doc_include_without_cfg = "warn" doc_link_with_quotes = "warn" doc_markdown = "warn" +duration_suboptimal_units = "warn" elidable_lifetime_names = "warn" -empty_enum = "warn" empty_enum_variants_with_brackets = "warn" +empty_enums = "warn" empty_line_after_outer_attr = "warn" enum_glob_use = "warn" equatable_if_let = "warn" @@ -270,6 +272,7 @@ lossy_float_literal = "warn" macro_use_imports = "warn" manual_assert = "warn" manual_clamp = "warn" +manual_ilog2 = "warn" manual_instant_elapsed = "warn" manual_is_power_of_two = "warn" manual_is_variant_and = "warn" @@ -299,10 +302,12 @@ needless_for_each = "warn" needless_pass_by_ref_mut = "warn" needless_pass_by_value = "warn" needless_raw_string_hashes = "warn" +needless_type_cast = "warn" negative_feature_names = "warn" non_std_lazy_statics = "warn" non_zero_suggestions = "warn" nonstandard_macro_braces = "warn" +only_used_in_recursion = "warn" option_as_ref_cloned = "warn" option_option = "warn" or_fun_call = "warn" @@ -325,6 +330,7 @@ ref_patterns = "warn" rest_pat_in_fully_bound_structs = "warn" return_and_then = "warn" same_functions_in_if_condition = "warn" +same_length_and_capacity = "warn" self_only_used_in_recursion = "warn" semicolon_if_nothing_returned = "warn" set_contains_or_insert = "warn" @@ -341,6 +347,7 @@ suspicious_command_arg_space = "warn" suspicious_xor_used_as_pow = "warn" todo = "warn" too_long_first_doc_paragraph = "warn" +too_many_arguments = "warn" trailing_empty_array = "warn" trait_duplication_in_bounds = "warn" transmute_ptr_to_ptr = "warn" @@ -358,6 +365,7 @@ unnecessary_safety_doc = "warn" unnecessary_self_imports = "warn" unnecessary_semicolon = "warn" unnecessary_struct_initialization = "warn" +unnecessary_trailing_comma = "warn" unnecessary_wraps = "warn" unnested_or_patterns = "warn" unused_async = "warn" @@ -382,6 +390,7 @@ too_many_lines = "allow" # These are meh: assigning_clones = "allow" # No please +cast_possible_truncation = "allow" # too many hits let_underscore_must_use = "allow" let_underscore_untyped = "allow" manual_range_contains = "allow" # this one is just worse imho diff --git a/clippy.toml b/clippy.toml index a57ed66fe..7c4b55f43 100644 --- a/clippy.toml +++ b/clippy.toml @@ -3,7 +3,7 @@ # ----------------------------------------------------------------------------- # Section identical to scripts/clippy_wasm/clippy.toml: -msrv = "1.92" +msrv = "1.95" allow-unwrap-in-tests = true diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index b89212aa2..345cc3e2c 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -122,13 +122,13 @@ impl WinitAppWrapper { event_result } EventResult::RepaintNow(window_id) => { - log::trace!("RepaintNow of {window_id:?}",); + log::trace!("RepaintNow of {window_id:?}"); self.windows_next_repaint_times .insert(window_id, Instant::now()); event_result } EventResult::RepaintNext(window_id) => { - log::trace!("RepaintNext of {window_id:?}",); + log::trace!("RepaintNext of {window_id:?}"); self.windows_next_repaint_times .insert(window_id, Instant::now()); event_result diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 1ad4a8fb1..bfd6410bd 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -3506,7 +3506,7 @@ impl Context { if !is_visible { continue; } - let text = format!("{} - {:?}", layer_id.short_debug_format(), area.rect(),); + let text = format!("{} - {:?}", layer_id.short_debug_format(), area.rect()); // TODO(emilk): `Sense::hover_highlight()` let response = ui.add(Label::new(RichText::new(text).monospace()).sense(Sense::click())); diff --git a/crates/egui/src/hit_test.rs b/crates/egui/src/hit_test.rs index 077baa183..f48c409b0 100644 --- a/crates/egui/src/hit_test.rs +++ b/crates/egui/src/hit_test.rs @@ -201,8 +201,6 @@ fn contains_circle(interact_rect: emath::Rect, pos: Pos2, radius: f32) -> bool { } fn hit_test_on_close(close: &[WidgetRect], pos: Pos2) -> WidgetHits { - #![expect(clippy::collapsible_else_if)] - // First find the best direct hits: let hit_click = find_closest_within( close.iter().copied().filter(|w| w.sense.senses_click()), diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 3dc85a28d..f0d4698e3 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -3,7 +3,7 @@ //! Try the live web demo: . Read more about egui at . //! //! `egui` is in heavy development, with each new version having breaking changes. -//! You need to have rust 1.92.0 or later to use `egui`. +//! You need to have rust 1.95.0 or later to use `egui`. //! //! To quickly get started with egui, you can take a look at [`eframe_template`](https://github.com/emilk/eframe_template) //! which uses [`eframe`](https://docs.rs/eframe). diff --git a/crates/egui/src/memory/mod.rs b/crates/egui/src/memory/mod.rs index 43694453c..1f22b3dd4 100644 --- a/crates/egui/src/memory/mod.rs +++ b/crates/egui/src/memory/mod.rs @@ -1460,9 +1460,9 @@ fn order_map_total_ordering() { // Assert that `areas.compare_order()` forms a total ordering let mut equivalence_classes = vec![0]; let mut i = 0; - for l in layers.windows(2) { - assert!(l[0].order <= l[1].order, "does not follow LayerId.order"); - if areas.compare_order(l[0], l[1]) != std::cmp::Ordering::Equal { + for &[a, b] in layers.array_windows() { + assert!(a.order <= b.order, "does not follow LayerId.order"); + if areas.compare_order(a, b) != std::cmp::Ordering::Equal { i += 1; } equivalence_classes.push(i); diff --git a/crates/egui/src/util/undoer.rs b/crates/egui/src/util/undoer.rs index 65ad576ec..a2eec6599 100644 --- a/crates/egui/src/util/undoer.rs +++ b/crates/egui/src/util/undoer.rs @@ -134,9 +134,8 @@ where if self.has_undo(current_state) { self.flux = None; - if self.undos.back() == Some(current_state) { - #[expect(clippy::unwrap_used)] // we just checked that undos is not empty - self.redos.push(self.undos.pop_back().unwrap()); + if let Some(state) = self.undos.pop_back_if(|state| &*state == current_state) { + self.redos.push(state); } else { self.redos.push(current_state.clone()); } diff --git a/crates/emath/src/history.rs b/crates/emath/src/history.rs index c25b94147..4a49defa2 100644 --- a/crates/emath/src/history.rs +++ b/crates/emath/src/history.rs @@ -160,16 +160,14 @@ where while self.values.len() > self.max_len { self.values.pop_front(); } - while self.values.len() > self.min_len { - if let Some((front_time, _)) = self.values.front() { - if *front_time < now - (self.max_age as f64) { - self.values.pop_front(); - } else { - break; - } - } else { - break; - } + let oldest_allowed_time = now - self.max_age as f64; + while self.min_len < self.values.len() + && self + .values + .pop_front_if(|&mut (front_time, _)| front_time < oldest_allowed_time) + .is_some() + { + // Keep popping while the oldest sample is too old. } } } diff --git a/crates/epaint/src/shapes/shape.rs b/crates/epaint/src/shapes/shape.rs index 5155fe0f5..ff15708f1 100644 --- a/crates/epaint/src/shapes/shape.rs +++ b/crates/epaint/src/shapes/shape.rs @@ -512,8 +512,7 @@ fn points_from_line( shapes: &mut Vec, ) { let mut position_on_segment = 0.0; - for window in path.windows(2) { - let (start, end) = (window[0], window[1]); + for &[start, end] in path.array_windows() { let vector = end - start; let segment_length = vector.length(); while position_on_segment < segment_length { @@ -545,8 +544,7 @@ fn dashes_from_line( let mut drawing_dash = false; let mut step = 0; let steps = dash_lengths.len(); - for window in path.windows(2) { - let (start, end) = (window[0], window[1]); + for &[start, end] in path.array_windows() { let vector = end - start; let segment_length = vector.length(); diff --git a/crates/epaint/src/text/font.rs b/crates/epaint/src/text/font.rs index c04c619f8..fad657e6e 100644 --- a/crates/epaint/src/text/font.rs +++ b/crates/epaint/src/text/font.rs @@ -117,7 +117,6 @@ impl SubpixelBin { let trunc = pos as i32; let fract = pos - trunc as f32; - #[expect(clippy::collapsible_else_if)] if pos.is_sign_negative() { if fract > -0.125 { (trunc, Self::Zero) diff --git a/crates/epaint/src/text/text_layout.rs b/crates/epaint/src/text/text_layout.rs index 34ef60111..ffe187e6c 100644 --- a/crates/epaint/src/text/text_layout.rs +++ b/crates/epaint/src/text/text_layout.rs @@ -471,8 +471,7 @@ fn layout_section( // Process each paragraph segment (split on newlines — the shaper can't handle them). for (seg_idx, segment) in SplitOrWhole::new(section_text, job.break_on_newline).enumerate() { if 0 < seg_idx { - out_paragraphs.push(Paragraph::from_section_index(section_index)); - paragraph = out_paragraphs.last_mut().unwrap(); + paragraph = out_paragraphs.push_mut(Paragraph::from_section_index(section_index)); paragraph.empty_paragraph_height = line_height; ctx.is_first_glyph_in_section = true; } @@ -1864,7 +1863,7 @@ mod tests { // Verify that Row::text() reconstructs the input text. let row_text: String = galley.rows.iter().map(|r| r.text()).collect(); - assert_eq!(row_text, text, "Row::text() mismatch for {text:?}",); + assert_eq!(row_text, text, "Row::text() mismatch for {text:?}"); // Verify cursor round-trip: end cursor index == char count. assert_eq!( diff --git a/examples/confirm_exit/Cargo.toml b/examples/confirm_exit/Cargo.toml index 755d9dd46..165689d35 100644 --- a/examples/confirm_exit/Cargo.toml +++ b/examples/confirm_exit/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_3d_glow/Cargo.toml b/examples/custom_3d_glow/Cargo.toml index ed1d15516..8204fb225 100644 --- a/examples/custom_3d_glow/Cargo.toml +++ b/examples/custom_3d_glow/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_font/Cargo.toml b/examples/custom_font/Cargo.toml index d2dcf350e..5307b3a7c 100644 --- a/examples/custom_font/Cargo.toml +++ b/examples/custom_font/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_font_style/Cargo.toml b/examples/custom_font_style/Cargo.toml index e31911c1a..1dd592cb9 100644 --- a/examples/custom_font_style/Cargo.toml +++ b/examples/custom_font_style/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["tami5 "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_keypad/Cargo.toml b/examples/custom_keypad/Cargo.toml index 024196e7d..aeebbe014 100644 --- a/examples/custom_keypad/Cargo.toml +++ b/examples/custom_keypad/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Varphone Wong "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_style/Cargo.toml b/examples/custom_style/Cargo.toml index 3352aa474..bf565c612 100644 --- a/examples/custom_style/Cargo.toml +++ b/examples/custom_style/Cargo.toml @@ -3,7 +3,7 @@ name = "custom_style" version = "0.1.0" license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/custom_window_frame/Cargo.toml b/examples/custom_window_frame/Cargo.toml index 049ee9a1a..e0acc551a 100644 --- a/examples/custom_window_frame/Cargo.toml +++ b/examples/custom_window_frame/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/external_eventloop/Cargo.toml b/examples/external_eventloop/Cargo.toml index 3341f1c65..f71d126af 100644 --- a/examples/external_eventloop/Cargo.toml +++ b/examples/external_eventloop/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Will Brown "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/external_eventloop_async/Cargo.toml b/examples/external_eventloop_async/Cargo.toml index 73c08210b..38c5167eb 100644 --- a/examples/external_eventloop_async/Cargo.toml +++ b/examples/external_eventloop_async/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Will Brown "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/file_dialog/Cargo.toml b/examples/file_dialog/Cargo.toml index f0512e329..77d0c8f35 100644 --- a/examples/file_dialog/Cargo.toml +++ b/examples/file_dialog/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/font_variations/Cargo.toml b/examples/font_variations/Cargo.toml index 789625f06..440dea986 100644 --- a/examples/font_variations/Cargo.toml +++ b/examples/font_variations/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/hello_android/Cargo.toml b/examples/hello_android/Cargo.toml index ae484783c..ca8eabd5e 100644 --- a/examples/hello_android/Cargo.toml +++ b/examples/hello_android/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false # `unsafe_code` is required for `#[no_mangle]`, disable workspace lints to workaround lint error. diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml index 1f94588ae..89b354741 100644 --- a/examples/hello_world/Cargo.toml +++ b/examples/hello_world/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/hello_world_par/Cargo.toml b/examples/hello_world_par/Cargo.toml index 04a3c0e25..752a5efa8 100644 --- a/examples/hello_world_par/Cargo.toml +++ b/examples/hello_world_par/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Maxim Osipenko "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/hello_world_simple/Cargo.toml b/examples/hello_world_simple/Cargo.toml index 572b98f71..015c86aee 100644 --- a/examples/hello_world_simple/Cargo.toml +++ b/examples/hello_world_simple/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/images/Cargo.toml b/examples/images/Cargo.toml index adac2a540..1e9a33f3e 100644 --- a/examples/images/Cargo.toml +++ b/examples/images/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Jan Procházka "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/keyboard_events/Cargo.toml b/examples/keyboard_events/Cargo.toml index 23265be36..64d03e5be 100644 --- a/examples/keyboard_events/Cargo.toml +++ b/examples/keyboard_events/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Jose Palazon "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/multiple_viewports/Cargo.toml b/examples/multiple_viewports/Cargo.toml index 07e68831a..f9bd07dc7 100644 --- a/examples/multiple_viewports/Cargo.toml +++ b/examples/multiple_viewports/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/puffin_profiler/Cargo.toml b/examples/puffin_profiler/Cargo.toml index ed8ce3aa0..0ffff5063 100644 --- a/examples/puffin_profiler/Cargo.toml +++ b/examples/puffin_profiler/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [package.metadata.cargo-shear] diff --git a/examples/screenshot/Cargo.toml b/examples/screenshot/Cargo.toml index 40a8c1c4f..6a5957ba1 100644 --- a/examples/screenshot/Cargo.toml +++ b/examples/screenshot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["René Rössler ", "Andreas Faber "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/examples/user_attention/Cargo.toml b/examples/user_attention/Cargo.toml index 084a53b59..14a97f097 100644 --- a/examples/user_attention/Cargo.toml +++ b/examples/user_attention/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["TicClick "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/rust-toolchain b/rust-toolchain index ce5b50987..7fb2669f3 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -5,6 +5,6 @@ # to the user in the error, instead of "error: invalid channel name '[toolchain]'". [toolchain] -channel = "1.92.0" +channel = "1.95.0" components = ["rustfmt", "clippy"] targets = ["wasm32-unknown-unknown"] diff --git a/scripts/check.sh b/scripts/check.sh index ce0b3b8d5..12d6da822 100755 --- a/scripts/check.sh +++ b/scripts/check.sh @@ -9,7 +9,7 @@ set -x # Checks all tests, lints etc. # Basically does what the CI does. -# cargo +1.92.0 install --quiet typos-cli +# cargo +1.95.0 install --quiet typos-cli export RUSTFLAGS="-D warnings" export RUSTDOCFLAGS="-D warnings" # https://github.com/emilk/egui/pull/1454 diff --git a/scripts/clippy_wasm/clippy.toml b/scripts/clippy_wasm/clippy.toml index ba2d71c8f..630a2ef43 100644 --- a/scripts/clippy_wasm/clippy.toml +++ b/scripts/clippy_wasm/clippy.toml @@ -6,7 +6,7 @@ # ----------------------------------------------------------------------------- # Section identical to the root clippy.toml: -msrv = "1.92" +msrv = "1.95" allow-unwrap-in-tests = true diff --git a/tests/test_background_logic/Cargo.toml b/tests/test_background_logic/Cargo.toml index 92985d5ee..58f4ca396 100644 --- a/tests/test_background_logic/Cargo.toml +++ b/tests/test_background_logic/Cargo.toml @@ -3,7 +3,7 @@ name = "test_background_logic" version = "0.1.0" license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/tests/test_egui_extras_compilation/Cargo.toml b/tests/test_egui_extras_compilation/Cargo.toml index 3e1d166f7..211cbeef3 100644 --- a/tests/test_egui_extras_compilation/Cargo.toml +++ b/tests/test_egui_extras_compilation/Cargo.toml @@ -3,7 +3,7 @@ name = "test_egui_extras_compilation" version = "0.1.0" license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/tests/test_inline_glow_paint/Cargo.toml b/tests/test_inline_glow_paint/Cargo.toml index 6aa9428e4..530d74b53 100644 --- a/tests/test_inline_glow_paint/Cargo.toml +++ b/tests/test_inline_glow_paint/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/tests/test_size_pass/Cargo.toml b/tests/test_size_pass/Cargo.toml index 56e2c7f47..d103cb013 100644 --- a/tests/test_size_pass/Cargo.toml +++ b/tests/test_size_pass/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Emil Ernerfeldt "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/tests/test_ui_stack/Cargo.toml b/tests/test_ui_stack/Cargo.toml index ec1b17689..bf6e942de 100644 --- a/tests/test_ui_stack/Cargo.toml +++ b/tests/test_ui_stack/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Antoine Beyeler "] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/tests/test_viewports/Cargo.toml b/tests/test_viewports/Cargo.toml index 0c73b6d11..8ac547345 100644 --- a/tests/test_viewports/Cargo.toml +++ b/tests/test_viewports/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["konkitoman"] license = "MIT OR Apache-2.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.95" publish = false [lints] diff --git a/xtask/src/utils.rs b/xtask/src/utils.rs index f6bf09828..3eff50927 100644 --- a/xtask/src/utils.rs +++ b/xtask/src/utils.rs @@ -27,7 +27,7 @@ pub fn ask_to_run(mut cmd: Command, ask: bool, reason: &str) -> Result<(), DynEr let is_ci = env::var_os("CI").is_some() || env::var_os("TF_BUILD").is_some(); if ask && !is_ci { let mut buf = String::new(); - print!("The script is going to run: \n\n`{cmd:?}`\n\n To {reason}.\nProceed? [Y/n] ",); + print!("The script is going to run: \n\n`{cmd:?}`\n\n To {reason}.\nProceed? [Y/n] "); io::stdout().flush().unwrap(); io::stdin().read_line(&mut buf).unwrap(); match buf.trim().to_lowercase().as_ref() { From 5ca01cdbaf555a53a06fdc7428f3c03fcde675c3 Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Tue, 28 Jul 2026 10:52:01 +0200 Subject: [PATCH 12/16] Fix missing modifier events on eframe web, handle physical keys (#8345) * realized pressing just modifiers cause no key events on eframe web when testing https://github.com/emilk/egui/pull/8336 * closes https://github.com/emilk/egui/issues/8308 * part of #3653 --- crates/eframe/src/web/events.rs | 24 +++++++---- crates/egui/src/data/key.rs | 73 +++++++++++++++++---------------- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index 308c268a6..326ba1556 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -199,12 +199,15 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner) runner.input.set_modifiers(modifiers); let key = event.key(); - let egui_key = translate_key(&key); + let logical_key = translate_key(&key); + let physical_key = translate_key(&event.code()); - if let Some(egui_key) = egui_key { + // Fall back to the physical key so that modifier keys (which have no logical + // `egui::Key`) and non-Latin layouts still produce a `Key` event. + if let Some(active_key) = logical_key.or(physical_key) { let egui_event = egui::Event::Key { - key: egui_key, - physical_key: None, // TODO(fornwall) + key: active_key, + physical_key, pressed: true, repeat: false, // egui will fill this in for us! modifiers, @@ -213,11 +216,11 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner) runner.input.raw.events.push(egui_event); runner.needs_repaint.repaint_asap(); - let prevent_default = should_prevent_default_for_key(runner, &modifiers, egui_key); + let prevent_default = should_prevent_default_for_key(runner, &modifiers, active_key); if false { log::debug!( - "On keydown {:?} {egui_key:?}, has_focus: {has_focus}, egui_wants_keyboard: {}, prevent_default: {prevent_default}", + "On keydown {:?} {active_key:?}, has_focus: {has_focus}, egui_wants_keyboard: {}, prevent_default: {prevent_default}", event.key().as_str(), runner.egui_ctx().egui_wants_keyboard_input() ); @@ -291,10 +294,13 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) { let mut should_stop_propagation = true; - if let Some(key) = translate_key(&event.key()) { + let logical_key = translate_key(&event.key()); + let physical_key = translate_key(&event.code()); + + if let Some(active_key) = logical_key.or(physical_key) { let egui_event = egui::Event::Key { - key, - physical_key: None, // TODO(fornwall) + key: active_key, + physical_key, pressed: false, repeat: false, modifiers, diff --git a/crates/egui/src/data/key.rs b/crates/egui/src/data/key.rs index 805379f17..41d654fb7 100644 --- a/crates/egui/src/data/key.rs +++ b/crates/egui/src/data/key.rs @@ -384,7 +384,7 @@ impl Key { "Escape" | "Esc" => Self::Escape, "Tab" => Self::Tab, "Backspace" => Self::Backspace, - "Enter" | "Return" => Self::Enter, + "Enter" | "Return" | "NumpadEnter" => Self::Enter, "Help" | "Insert" => Self::Insert, "Delete" => Self::Delete, @@ -399,19 +399,19 @@ impl Key { " " | "Space" => Self::Space, ":" | "Colon" => Self::Colon, - "," | "Comma" => Self::Comma, - "-" | "−" | "Minus" => Self::Minus, - "." | "Period" => Self::Period, - "+" | "Plus" => Self::Plus, + "," | "Comma" | "NumpadComma" => Self::Comma, + "-" | "−" | "Minus" | "NumpadSubtract" => Self::Minus, + "." | "Period" | "NumpadDecimal" => Self::Period, + "+" | "Plus" | "NumpadAdd" => Self::Plus, "=" | "Equal" | "Equals" | "NumpadEqual" => Self::Equals, ";" | "Semicolon" => Self::Semicolon, "\\" | "Backslash" => Self::Backslash, - "/" | "Slash" => Self::Slash, + "/" | "Slash" | "NumpadDivide" => Self::Slash, "|" | "Pipe" => Self::Pipe, "?" | "Questionmark" => Self::Questionmark, "!" | "Exclamationmark" => Self::Exclamationmark, - "[" | "OpenBracket" => Self::OpenBracket, - "]" | "CloseBracket" => Self::CloseBracket, + "[" | "OpenBracket" | "BracketLeft" => Self::OpenBracket, + "]" | "CloseBracket" | "BracketRight" => Self::CloseBracket, "{" | "OpenCurlyBracket" => Self::OpenCurlyBracket, "}" | "CloseCurlyBracket" => Self::CloseCurlyBracket, "`" | "Backtick" | "Backquote" | "Grave" => Self::Backtick, @@ -428,32 +428,32 @@ impl Key { "8" | "Digit8" | "Numpad8" => Self::Num8, "9" | "Digit9" | "Numpad9" => Self::Num9, - "a" | "A" => Self::A, - "b" | "B" => Self::B, - "c" | "C" => Self::C, - "d" | "D" => Self::D, - "e" | "E" => Self::E, - "f" | "F" => Self::F, - "g" | "G" => Self::G, - "h" | "H" => Self::H, - "i" | "I" => Self::I, - "j" | "J" => Self::J, - "k" | "K" => Self::K, - "l" | "L" => Self::L, - "m" | "M" => Self::M, - "n" | "N" => Self::N, - "o" | "O" => Self::O, - "p" | "P" => Self::P, - "q" | "Q" => Self::Q, - "r" | "R" => Self::R, - "s" | "S" => Self::S, - "t" | "T" => Self::T, - "u" | "U" => Self::U, - "v" | "V" => Self::V, - "w" | "W" => Self::W, - "x" | "X" => Self::X, - "y" | "Y" => Self::Y, - "z" | "Z" => Self::Z, + "a" | "A" | "KeyA" => Self::A, + "b" | "B" | "KeyB" => Self::B, + "c" | "C" | "KeyC" => Self::C, + "d" | "D" | "KeyD" => Self::D, + "e" | "E" | "KeyE" => Self::E, + "f" | "F" | "KeyF" => Self::F, + "g" | "G" | "KeyG" => Self::G, + "h" | "H" | "KeyH" => Self::H, + "i" | "I" | "KeyI" => Self::I, + "j" | "J" | "KeyJ" => Self::J, + "k" | "K" | "KeyK" => Self::K, + "l" | "L" | "KeyL" => Self::L, + "m" | "M" | "KeyM" => Self::M, + "n" | "N" | "KeyN" => Self::N, + "o" | "O" | "KeyO" => Self::O, + "p" | "P" | "KeyP" => Self::P, + "q" | "Q" | "KeyQ" => Self::Q, + "r" | "R" | "KeyR" => Self::R, + "s" | "S" | "KeyS" => Self::S, + "t" | "T" | "KeyT" => Self::T, + "u" | "U" | "KeyU" => Self::U, + "v" | "V" | "KeyV" => Self::V, + "w" | "W" | "KeyW" => Self::W, + "x" | "X" | "KeyX" => Self::X, + "y" | "Y" | "KeyY" => Self::Y, + "z" | "Z" | "KeyZ" => Self::Z, "F1" => Self::F1, "F2" => Self::F2, @@ -499,8 +499,9 @@ impl Key { "ControlRight" => Self::ControlRight, "AltLeft" => Self::AltLeft, "AltRight" => Self::AltRight, - "SuperLeft" => Self::SuperLeft, - "SuperRight" => Self::SuperRight, + + "SuperLeft" | "MetaLeft" | "OSLeft" => Self::SuperLeft, + "SuperRight" | "MetaRight" | "OSRight" => Self::SuperRight, "IntlBackslash" => Self::IntlBackslash, From d06f5b5dfcd714811ea0ae590cb410771d0706c1 Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Tue, 28 Jul 2026 10:54:45 +0200 Subject: [PATCH 13/16] Handle `ViewportCommand::InnerSize` in `egui_kittest` (#8350) Useful to support resizing headless apps via `egui_inspection` --- crates/egui_kittest/src/lib.rs | 40 +++++++++++++++++++++++++----- crates/egui_kittest/tests/tests.rs | 31 +++++++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/crates/egui_kittest/src/lib.rs b/crates/egui_kittest/src/lib.rs index 4f691c8c4..6873be579 100644 --- a/crates/egui_kittest/src/lib.rs +++ b/crates/egui_kittest/src/lib.rs @@ -175,10 +175,9 @@ impl<'a, State> Harness<'a, State> { #[cfg(feature = "snapshot")] snapshot_results: SnapshotResults::default(), }; - // Fulfill any screenshot requested during the initial frame above (which didn't go - // through `_step`). - #[cfg(any(feature = "wgpu", feature = "snapshot"))] - harness.handle_screenshots(); + // Handle any viewport commands (e.g. a screenshot or resize) requested during the initial + // frame above (which didn't go through `_step`). + harness.handle_viewport_commands(); // Run the harness until it is stable, ensuring that all Areas are shown and animations are done harness.run_ok(); @@ -273,8 +272,7 @@ impl<'a, State> Harness<'a, State> { self.renderer.handle_delta(&output.textures_delta); self.output = output; - #[cfg(any(feature = "wgpu", feature = "snapshot"))] - self.handle_screenshots(); + self.handle_viewport_commands(); } /// Calculate the rect that includes all popups and tooltips. @@ -668,6 +666,36 @@ impl<'a, State> Harness<'a, State> { self.renderer.render(&self.ctx, &output) } + /// Apply the [`egui::ViewportCommand`]s the app emitted during the last frame. + fn handle_viewport_commands(&mut self) { + self.handle_inner_size(); + + #[cfg(any(feature = "wgpu", feature = "snapshot"))] + self.handle_screenshots(); + } + + /// Resize the harness to the last [`egui::ViewportCommand::InnerSize`] requested by the app + /// during the last frame, if any. + fn handle_inner_size(&mut self) { + let new_inner_size = + self.root_viewport_output() + .commands + .iter() + .rev() + .find_map(|command| { + if let egui::ViewportCommand::InnerSize(size) = command { + Some(*size) + } else { + None + } + }); + + if let Some(size) = new_inner_size { + self.set_size(size); + self.ctx.request_repaint(); + } + } + /// Fulfill any [`egui::ViewportCommand::Screenshot`] requests made by the app during the /// last frame. /// diff --git a/crates/egui_kittest/tests/tests.rs b/crates/egui_kittest/tests/tests.rs index 37d88da9a..9bdd2b6c1 100644 --- a/crates/egui_kittest/tests/tests.rs +++ b/crates/egui_kittest/tests/tests.rs @@ -262,3 +262,34 @@ fn test_ime_composition_visuals() { harness.run(); harness.snapshot("test_ime_composition_visuals_cursor"); } + +#[test] +fn inner_size_viewport_command() { + let new_size = Vec2::new(300.0, 200.0); + + #[derive(Default)] + struct State { + requested: bool, + observed_size: Option, + } + + let mut harness = Harness::builder() + .with_size(Vec2::new(100.0, 80.0)) + .build_ui_state( + |ui, state: &mut State| { + // Request the resize once. + if !state.requested { + state.requested = true; + ui.ctx() + .send_viewport_cmd(egui::ViewportCommand::InnerSize(new_size)); + } + + state.observed_size = Some(ui.ctx().viewport_rect().size()); + }, + State::default(), + ); + + harness.run(); + + assert_eq!(harness.state().observed_size, Some(new_size)); +} From 8c1711ff9f889f07c1ca2a165e8174f3dcd69244 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 28 Jul 2026 02:27:38 -0700 Subject: [PATCH 14/16] Disable `warn_if_rect_changes_id`, even in debug builds (#8349) Too many false positives (spurious red rectangles) --- crates/egui/src/style.rs | 2 +- tests/egui_tests/tests/regression_tests.rs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/style.rs b/crates/egui/src/style.rs index 83a05beff..27be5920b 100644 --- a/crates/egui/src/style.rs +++ b/crates/egui/src/style.rs @@ -1395,7 +1395,7 @@ impl Default for DebugOptions { show_resize: false, show_interactive_widgets: false, show_widget_hits: false, - warn_if_rect_changes_id: cfg!(debug_assertions), + warn_if_rect_changes_id: false, show_unaligned: cfg!(debug_assertions), show_focused_widget: false, } diff --git a/tests/egui_tests/tests/regression_tests.rs b/tests/egui_tests/tests/regression_tests.rs index 8710b523f..f250b1ab2 100644 --- a/tests/egui_tests/tests/regression_tests.rs +++ b/tests/egui_tests/tests/regression_tests.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use egui::ScrollArea; use egui::accesskit::Role; +#[cfg(debug_assertions)] use egui::epaint::Shape; use egui::style::ScrollAnimation; use egui::text::{LayoutJob, TextWrapping}; @@ -261,6 +262,7 @@ fn interact_on_ui_response_should_be_stable() { assert_eq!(click_count, 10, "We missed some clicks!"); } +#[cfg(debug_assertions)] fn has_red_warning_rect(output: &egui::FullOutput) -> bool { output.shapes.iter().any(|clipped| { matches!( @@ -276,10 +278,13 @@ fn has_red_warning_rect(output: &egui::FullOutput) -> bool { /// between frames because the label (and thus the Id salt) changes on hover. /// The `warn_if_rect_changes_id` debug check should catch this. #[test] +#[cfg(debug_assertions)] fn warn_if_rect_changes_id() { let button_rect = egui::Rect::from_min_size(egui::pos2(10.0, 10.0), egui::vec2(100.0, 30.0)); let mut harness = Harness::builder().with_size((200.0, 50.0)).build_ui(|ui| { + ui.global_style_mut(|style| style.debug.warn_if_rect_changes_id = true); + // Simulate a buggy widget whose Id depends on its label text, // and the label changes on hover: let is_hovered = ui.rect_contains_pointer(button_rect); @@ -309,6 +314,7 @@ fn warn_if_rect_changes_id() { /// all child widget ids shift too. This should NOT trigger `warn_if_rect_changes_id` because the /// `parent_id` also changed — it's a cascading id shift, not a widget bug. #[test] +#[cfg(debug_assertions)] fn warn_if_rect_changes_id_false_positive_parent_shift() { use std::cell::Cell; @@ -316,6 +322,8 @@ fn warn_if_rect_changes_id_false_positive_parent_shift() { let button_rect = egui::Rect::from_min_size(egui::pos2(10.0, 10.0), egui::vec2(100.0, 30.0)); let mut harness = Harness::builder().with_size((200.0, 100.0)).build_ui(|ui| { + ui.global_style_mut(|style| style.debug.warn_if_rect_changes_id = true); + // push_id with a changing value causes the child Ui's id to shift, // which in turn shifts all widget ids inside it. ui.push_id(counter.get(), |ui| { From 76442c870e2f8cf3b6f88a5b530f6254de5336e0 Mon Sep 17 00:00:00 2001 From: Magic Crazy Man <350088648@qq.com> Date: Tue, 28 Jul 2026 17:46:07 +0800 Subject: [PATCH 15/16] fix: ensure mapped range is dropped before unmapping buffer in capture (#8337) After upgrading to wgpu v30, it requires to drop the `BufferView` return by `get_mapped_range` before unmap the buffer. Fix it in this pr, making screenshot event crash no more --- crates/egui-wgpu/src/capture.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/egui-wgpu/src/capture.rs b/crates/egui-wgpu/src/capture.rs index 193cb4cce..c5519e8a6 100644 --- a/crates/egui-wgpu/src/capture.rs +++ b/crates/egui-wgpu/src/capture.rs @@ -230,6 +230,7 @@ impl CaptureState { )); } } + drop(mapped_range); buffer.unmap(); tx.send(( From 701de698d484f9d4dc7c66e3caf5ddeb9baf872d Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Tue, 28 Jul 2026 05:33:43 -0600 Subject: [PATCH 16/16] web: Avoid panic from lost texture updates when loaded on a background tab (#8313) The `textures_delta` in `AppRunner::logic()` comes from `TextureManager::take_delta()` via `end_pass()`. Previously, if `is_visible` was `false`, these deltas would have been dropped and never applied, so the `TextureManager` state gets out of sync with the `Renderer`. That causes https://github.com/emilk/egui/issues/8228: When the app is loaded in a background tab and the first frame occurs via the `setTimeout` path prior to the tab becoming visible, it loses the `ImageDelta` representing the initial creation of the font atlas texture. When the user then switches to the tab, it panics at crates/egui-wgpu/src/renderer.rs:669:18 with `Tried to update a texture that has not been allocated yet` when attempting to update the texture that the wgpu renderer never saw when it was created. Testing: To make it load in a background tab, put `data:text/html,Click` in the address bar and then middle click the resulting link. On Chrome you also have to hover the tab preview before switching to the tab to reproduce the issue. * Closes and its duplicate https://github.com/emilk/egui/issues/8278 * [x] I have followed the instructions in the PR template Co-authored-by: Emil Ernerfeldt --- crates/eframe/src/web/app_runner.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index 3caa2428a..e259e4019 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -316,7 +316,7 @@ impl AppRunner { } self.handle_platform_output(platform_output); - if is_visible { + if is_visible || !textures_delta.is_empty() { self.textures_delta.append(textures_delta); self.clipped_primitives = Some(self.egui_ctx.tessellate(shapes, pixels_per_point)); }