From da2d00f404f61a681e3e70d9ca5048cabcba3a05 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 30 Mar 2026 13:24:57 +0200 Subject: [PATCH] egui: upgrade to 0.34 --- Cargo.lock | 206 ++++++++++++++++++----- Cargo.toml | 48 ++++-- src/control_center.rs | 25 ++- src/control_center/cc_clients.rs | 9 +- src/control_center/cc_compositor.rs | 4 +- src/control_center/cc_input.rs | 199 +++++++++++----------- src/control_center/cc_outputs.rs | 56 +++--- src/control_center/cc_sidebar.rs | 4 +- src/control_center/cc_virtual_outputs.rs | 2 +- src/control_center/cc_window.rs | 5 - src/egui_adapter/egui_platform.rs | 11 +- 11 files changed, 351 insertions(+), 218 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c201fb7a..3943cdc1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,21 +3,14 @@ version = 4 [[package]] -name = "ab_glyph" -version = "0.2.32" +name = "accesskit" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +checksum = "5351dcebb14b579ccab05f288596b2ae097005be7ee50a7c3d4ca9d0d5a66f6a" dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", + "uuid", ] -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" - [[package]] name = "addr2line" version = "0.25.1" @@ -203,6 +196,20 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "byteorder" @@ -300,6 +307,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "color" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18ef4657441fb193b65f34dc39b3781f0dfec23d3bd94d0eeb4e88cde421edb" +dependencies = [ + "bytemuck", +] + [[package]] name = "colorchoice" version = "1.0.5" @@ -383,19 +399,20 @@ dependencies = [ [[package]] name = "ecolor" -version = "0.33.3" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71ddb8ac7643d1dba1bb02110e804406dd459a838efcb14011ced10556711a8e" +checksum = "137c0ce4ce4152ff7e223a7ce22ee1057cdff61fce0a45c32459c3ccec64868d" dependencies = [ "emath", ] [[package]] name = "egui" -version = "0.33.3" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9b567d356674e9a5121ed3fedfb0a7c31e059fe71f6972b691bcd0bfc284e3" +checksum = "f34aaf627da598dfadd64b0fee6101d22e9c451d1e5348157312720b7f459f0f" dependencies = [ + "accesskit", "ahash", "bitflags", "emath", @@ -409,9 +426,9 @@ dependencies = [ [[package]] name = "egui_tiles" -version = "0.14.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef184e589f0a80560bd3b63017634642d1ba112a8a8d9b29341f7cafd04601f" +checksum = "08e570b77f6cce3292eba4aee9b9c08cf11dfc68430f4dc9613d939628498647" dependencies = [ "ahash", "egui", @@ -427,24 +444,28 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "emath" -version = "0.33.3" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "491bdf728bf25ddd9ad60d4cf1c48588fa82c013a2440b91aa7fc43e34a07c32" +checksum = "0a05cd8bdf3b598488c627ca97c7fe8909448ffa26278dd3c7e535cdb554d721" [[package]] name = "epaint" -version = "0.33.3" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009d0dd3c2163823a0abdb899451ecbc78798dec545ee91b43aff1fa790bab62" +checksum = "04f3017dd67f147a697ee0c8484fb568fd9553e2a0c114be5020dbbc11962841" dependencies = [ - "ab_glyph", "ahash", "ecolor", "emath", + "font-types", "log", "nohash-hasher", "parking_lot", "profiling", + "self_cell", + "skrifa", + "smallvec", + "vello_cpu", ] [[package]] @@ -469,6 +490,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31ae425815400e5ed474178a7a22e275a9687086a12ca63ec793ff292d8fdae8" +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -484,6 +514,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fearless_simd" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb2907d1f08b2b316b9223ced5b0e89d87028ba8deae9764741dba8ff7f3903" +dependencies = [ + "bytemuck", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -506,6 +545,21 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73829a7b5c91198af28a99159b7ae4afbb252fb906159ff7f189f3a2ceaa3df2" +dependencies = [ + "bytemuck", +] + [[package]] name = "futures-core" version = "0.3.32" @@ -618,7 +672,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -626,6 +680,9 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] [[package]] name = "heck" @@ -867,6 +924,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "kurbo" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7564e90fe3c0d5771e1f0bc95322b21baaeaa0d9213fa6a0b61c99f8b17b3bfb" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -928,6 +996,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1039,15 +1113,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -1071,6 +1136,19 @@ dependencies = [ "windows-link", ] +[[package]] +name = "peniko" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2b6aadb221872732e87d465213e9be5af2849b0e8cc5300a8ba98fffa2e00a" +dependencies = [ + "bytemuck", + "color", + "kurbo", + "linebender_resource_handle", + "smallvec", +] + [[package]] name = "phf" version = "0.13.1" @@ -1267,6 +1345,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +[[package]] +name = "read-fonts" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" +dependencies = [ + "bytemuck", + "font-types", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1392,6 +1480,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.27" @@ -1484,6 +1578,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +[[package]] +name = "skrifa" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.12" @@ -1649,12 +1753,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - [[package]] name = "uapi" version = "0.2.13" @@ -1717,6 +1815,38 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" + +[[package]] +name = "vello_common" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd1a4c633ce09e7d713df1a6e036644a125e15e0c169cfb5180ddf5836ca04b" +dependencies = [ + "bytemuck", + "fearless_simd", + "hashbrown 0.16.1", + "log", + "peniko", + "skrifa", + "smallvec", +] + +[[package]] +name = "vello_cpu" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162bfe48aabf6a9fdcd401b628c7d9f260c2cbabb343c70a65feba6f7849edc" +dependencies = [ + "bytemuck", + "hashbrown 0.16.1", + "vello_common", +] + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 9265a63b..d531e25a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,8 +68,8 @@ opera = "1.0.1" with_builtin_macros = "0.1.0" blake3 = "1.8.2" run-on-drop = "1.0.0" -egui = { version = "0.33.3", default-features = false } -egui_tiles = { version = "0.14.1", default-features = false } +egui = { version = "0.34.1", default-features = false } +egui_tiles = { version = "0.15.0", default-features = false } [build-dependencies] repc = "0.1.1" @@ -100,26 +100,38 @@ debug = "line-tables-only" opt-level = 3 debug = "line-tables-only" -[profile.dev.package."ab_glyph"] -opt-level = 3 -debug = "line-tables-only" - -[profile.dev.package."ab_glyph_rasterizer"] -opt-level = 3 -debug = "line-tables-only" - -[profile.dev.package."owned_ttf_parser"] -opt-level = 3 -debug = "line-tables-only" - -[profile.dev.package."ttf-parser"] -opt-level = 3 -debug = "line-tables-only" - [profile.dev.package."ecolor"] opt-level = 3 debug = "line-tables-only" +[profile.dev.package."font-types"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."skrifa"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."read-fonts"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."vello_cpu"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."vello_common"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."peniko"] +opt-level = 3 +debug = "line-tables-only" + +[profile.dev.package."kurbo"] +opt-level = 3 +debug = "line-tables-only" + [features] rc_tracking = [] it = [] diff --git a/src/control_center.rs b/src/control_center.rs index 30c7c7d2..e3fc8be7 100644 --- a/src/control_center.rs +++ b/src/control_center.rs @@ -25,10 +25,9 @@ use { }, }, egui::{ - Align, CentralPanel, Checkbox, Color32, ComboBox, Context, CursorIcon, DragValue, Frame, - Grid, InnerResponse, Label, Layout, Response, Rgba, RichText, ScrollArea, Sense, SidePanel, - Stroke, TextBuffer, TextEdit, Ui, UiBuilder, Visuals, Widget, WidgetText, emath::Numeric, - vec2, + Align, CentralPanel, Checkbox, Color32, ComboBox, CursorIcon, DragValue, Frame, Grid, Id, + InnerResponse, Label, Layout, Panel, Response, Rgba, RichText, ScrollArea, Sense, Stroke, + TextBuffer, TextEdit, Ui, UiBuilder, Visuals, Widget, WidgetText, emath::Numeric, vec2, }, egui_tiles::{ResizeState, TabState, Tile, TileId, Tiles, Tree}, linearize::{Linearize, LinearizeExt}, @@ -248,7 +247,7 @@ impl egui_tiles::Behavior for CcBehavior<'_> { }); ui.separator(); show_errors(ui, &mut pane.ps); - ui.scope_builder(UiBuilder::new().id(("pane", pane.id)), |ui| { + ui.scope_builder(UiBuilder::new().id(Id::new(("pane", pane.id))), |ui| { ScrollArea::vertical().show(ui, |ui| { ui.allocate_space(vec2(ui.available_width(), 0.0)); pane.show(self, ui); @@ -297,7 +296,7 @@ impl egui_tiles::Behavior for CcBehavior<'_> { fn on_tab_button( &mut self, - _tiles: &Tiles, + _tiles: &mut Tiles, tile_id: TileId, button_response: Response, ) -> Response { @@ -338,16 +337,16 @@ impl EggWindowOwner for ControlCenterInner { self.close(); } - fn render(self: Rc, ctx: &Context) { + fn render(self: Rc, ui: &mut Ui) { let settings = &mut *self.tree.borrow_mut(); - SidePanel::left("sidebar").show(ctx, |ui| self.show_sidebar(&mut settings.tree, ui)); + Panel::left("sidebar").show_inside(ui, |ui| self.show_sidebar(&mut settings.tree, ui)); CentralPanel::default() .frame( - Frame::central_panel(&ctx.style()) + Frame::central_panel(&ui.global_style()) .outer_margin(0.0) .inner_margin(0.0), ) - .show(ctx, |ui| { + .show_inside(ui, |ui| { let tree = &mut settings.tree; let mut behavior = CcBehavior { cc: &self, @@ -358,11 +357,11 @@ impl EggWindowOwner for ControlCenterInner { if let Some(close) = behavior.close { tree.set_visible(close, false); tree.remove_recursively(close); - ui.ctx().request_repaint(); + ui.request_repaint(); } if let Some(ty) = behavior.open { self.open(tree, ty); - ui.ctx().request_repaint(); + ui.request_repaint(); } }); } @@ -515,7 +514,7 @@ fn show_errors(ui: &mut Ui, pane: &mut PaneState) { } if let Some(idx) = to_remove { pane.errors.remove(idx); - ui.ctx().request_repaint(); + ui.request_repaint(); } ui.separator(); } diff --git a/src/control_center/cc_clients.rs b/src/control_center/cc_clients.rs index 1e002895..1a1bd7b3 100644 --- a/src/control_center/cc_clients.rs +++ b/src/control_center/cc_clients.rs @@ -22,10 +22,7 @@ use { text::LayoutJob, }, linearize::Linearize, - std::{ - any::Any, - rc::{Rc, Weak}, - }, + std::rc::{Rc, Weak}, }; pub enum ClientCrit { @@ -456,8 +453,4 @@ impl CacheTrait for ClientWindowMatchersCache { fn len(&self) -> usize { self.matchers.len() } - - fn as_any_mut(&mut self) -> &mut dyn Any { - self - } } diff --git a/src/control_center/cc_compositor.rs b/src/control_center/cc_compositor.rs index e1bce419..5091b379 100644 --- a/src/control_center/cc_compositor.rs +++ b/src/control_center/cc_compositor.rs @@ -34,7 +34,7 @@ impl CompositorPane { row(ui, "Repository", |ui| { let url = "https://github.com/mahkoh/jay"; if ui.link(url).clicked() { - ui.ctx().open_url(OpenUrl::new_tab(url)); + ui.open_url(OpenUrl::new_tab(url)); } }); label(ui, "Version", VERSION); @@ -66,7 +66,7 @@ impl CompositorPane { .on_hover_text_at_pointer("Copy to clipboard") .clicked() { - ui.ctx().copy_text(path); + ui.copy_text(path); } }); } diff --git a/src/control_center/cc_input.rs b/src/control_center/cc_input.rs index bac0db1f..6359e937 100644 --- a/src/control_center/cc_input.rs +++ b/src/control_center/cc_input.rs @@ -526,118 +526,121 @@ fn show_keymap( map: Option<&Rc>, set_map: impl Fn(&Rc), ) { - ui.scope_builder(UiBuilder::new().id(("keymap-settings", ks.seed)), |ui| { - ui.add_enabled_ui(map.is_some(), |ui| { - if ui.button("Copy Keymap").clicked() - && let Some(map) = map - { - ui.ctx().copy_text(map.map_text.clone()); - } - }); - let backup = |ks: &mut KeymapState| { - ks.backup(map); - }; - if ui.button("Load Default Keymap").clicked() { - backup(ks); - set_map(&state.default_keymap); - } - ui.horizontal(|ui| { + ui.scope_builder( + UiBuilder::new().id(Id::new(("keymap-settings", ks.seed))), + |ui| { ui.add_enabled_ui(map.is_some(), |ui| { - if ui.button("Backup Keymap").clicked() { - ks.backup = None; - backup(ks); + if ui.button("Copy Keymap").clicked() + && let Some(map) = map + { + ui.copy_text(map.map_text.clone()); } }); - if let Some(backup) = &ks.backup - && ui.button("Restore Keymap").clicked() - { - set_map(backup); - ks.backup = None; - } - }); - let mut label = "Load Keymap from Clipboard".to_string(); - if *paste_requested == Some(ui.id()) { - label.push_str(" "); - label.push_str(ICON_PENDING); - } - let button = ui.button(label); - if button.clicked() { - *paste_requested = Some(ui.id()); - button.request_focus(); - ui.ctx().send_viewport_cmd(ViewportCommand::RequestPaste); - } else if *paste_requested == Some(ui.id()) && button.has_focus() { - ui.input(|e| { - let map = e - .events - .iter() - .filter_map(|e| match e { - Event::Paste(s) => Some(s), - _ => None, - }) - .next(); - let Some(map) = map else { - return; - }; - *paste_requested = None; - let map = match state.kb_ctx.parse_keymap(map.as_bytes()) { - Ok(m) => m, - Err(e) => { - let error = format!("Could not parse keymap: {}", ErrorFmt(e)); - ps.errors.push(error); - return; - } - }; + let backup = |ks: &mut KeymapState| { + ks.backup(map); + }; + if ui.button("Load Default Keymap").clicked() { backup(ks); - set_map(&map); + set_map(&state.default_keymap); + } + ui.horizontal(|ui| { + ui.add_enabled_ui(map.is_some(), |ui| { + if ui.button("Backup Keymap").clicked() { + ks.backup = None; + backup(ks); + } + }); + if let Some(backup) = &ks.backup + && ui.button("Restore Keymap").clicked() + { + set_map(backup); + ks.backup = None; + } }); - } else if *paste_requested == Some(ui.id()) { - *paste_requested = None; - } - ui.collapsing("Create Keymap from Names", |ui| { - grid(ui, ("keymap-from-names", ui.id()), |ui| { - let defaulted = - |ui: &mut Ui, name: &str, default: &mut bool, text: &mut dyn TextBuffer| { - let ui = &mut *ui.row(); - grid_label(ui, name); - ui.add_enabled_ui(!*default, |ui| { - text_edit(ui, text); - }); - ui.checkbox(default, "Default"); + let mut label = "Load Keymap from Clipboard".to_string(); + if *paste_requested == Some(ui.id()) { + label.push_str(" "); + label.push_str(ICON_PENDING); + } + let button = ui.button(label); + if button.clicked() { + *paste_requested = Some(ui.id()); + button.request_focus(); + ui.send_viewport_cmd(ViewportCommand::RequestPaste); + } else if *paste_requested == Some(ui.id()) && button.has_focus() { + ui.input(|e| { + let map = e + .events + .iter() + .filter_map(|e| match e { + Event::Paste(s) => Some(s), + _ => None, + }) + .next(); + let Some(map) = map else { + return; }; - let required = |ui: &mut Ui, name, text| { - let ui = &mut *ui.row(); - grid_label(ui, name); - text_edit(ui, text); - }; - defaulted(ui, "Rules", &mut ks.rules_default, &mut ks.rules); - defaulted(ui, "Model", &mut ks.model_default, &mut ks.model); - required(ui, "Layouts", &mut ks.layouts); - required(ui, "Variants", &mut ks.variants); - required(ui, "Options", &mut ks.options); - }); - if ui.button("Load").clicked() { - 'set_map: { - let map = state.kb_ctx.keymap_from_rmlvo( - (!ks.rules_default).then_some(&ks.rules), - (!ks.model_default).then_some(&ks.model), - Some(&ks.layouts), - Some(&ks.variants), - Some(&ks.options), - ); - let map = match map { - Ok(map) => map, + *paste_requested = None; + let map = match state.kb_ctx.parse_keymap(map.as_bytes()) { + Ok(m) => m, Err(e) => { let error = format!("Could not parse keymap: {}", ErrorFmt(e)); ps.errors.push(error); - break 'set_map; + return; } }; backup(ks); set_map(&map); - } + }); + } else if *paste_requested == Some(ui.id()) { + *paste_requested = None; } - }); - }); + ui.collapsing("Create Keymap from Names", |ui| { + grid(ui, ("keymap-from-names", ui.id()), |ui| { + let defaulted = + |ui: &mut Ui, name: &str, default: &mut bool, text: &mut dyn TextBuffer| { + let ui = &mut *ui.row(); + grid_label(ui, name); + ui.add_enabled_ui(!*default, |ui| { + text_edit(ui, text); + }); + ui.checkbox(default, "Default"); + }; + let required = |ui: &mut Ui, name, text| { + let ui = &mut *ui.row(); + grid_label(ui, name); + text_edit(ui, text); + }; + defaulted(ui, "Rules", &mut ks.rules_default, &mut ks.rules); + defaulted(ui, "Model", &mut ks.model_default, &mut ks.model); + required(ui, "Layouts", &mut ks.layouts); + required(ui, "Variants", &mut ks.variants); + required(ui, "Options", &mut ks.options); + }); + if ui.button("Load").clicked() { + 'set_map: { + let map = state.kb_ctx.keymap_from_rmlvo( + (!ks.rules_default).then_some(&ks.rules), + (!ks.model_default).then_some(&ks.model), + Some(&ks.layouts), + Some(&ks.variants), + Some(&ks.options), + ); + let map = match map { + Ok(map) => map, + Err(e) => { + let error = format!("Could not parse keymap: {}", ErrorFmt(e)); + ps.errors.push(error); + break 'set_map; + } + }; + backup(ks); + set_map(&map); + } + } + }); + }, + ); } fn matrix( diff --git a/src/control_center/cc_outputs.rs b/src/control_center/cc_outputs.rs index 5b11b10a..f01b1d33 100644 --- a/src/control_center/cc_outputs.rs +++ b/src/control_center/cc_outputs.rs @@ -262,33 +262,36 @@ impl OutputsPane { impl OutputsPaneInner { fn show_main_area(&mut self, ps: &mut PaneState, ui: &mut Ui) { - ui.scope_builder(UiBuilder::new().id(("main_area", self.seed)), |ui| { - self.show_settings_bar(ps, ui); - ScrollArea::vertical().show(ui, |ui| { - match self.ui.view { - View::Connectors => self.show_connectors(ui), - View::Settings => self.show_settings(ui), - } - ui.allocate_space(ui.available_size()); - }); - }); + ui.scope_builder( + UiBuilder::new().id(Id::new(("main_area", self.seed))), + |ui| { + self.show_settings_bar(ps, ui); + ScrollArea::vertical().show(ui, |ui| { + match self.ui.view { + View::Connectors => self.show_connectors(ui), + View::Settings => self.show_settings(ui), + } + ui.allocate_space(ui.available_size()); + }); + }, + ); } fn show_settings_bar(&mut self, ps: &mut PaneState, ui: &mut Ui) { ui.horizontal_wrapped(|ui| { if ui.button("Connectors").clicked() { self.ui.view = View::Connectors; - ui.ctx().request_repaint(); + ui.request_repaint(); } if ui.button("Settings").clicked() { self.ui.view = View::Settings; - ui.ctx().request_repaint(); + ui.request_repaint(); } if ui .checkbox(&mut self.ui.zoom_to_fit, "Zoom To Fit") .changed() { - ui.ctx().request_repaint(); + ui.request_repaint(); } { let mut reset = !self.in_transaction.get(); @@ -405,7 +408,7 @@ impl OutputsPaneInner { } if changed { - ui.ctx().request_repaint(); + ui.request_repaint(); } } @@ -492,7 +495,7 @@ impl OutputsPaneInner { self.ui.scale = new_scale; origin.x = new_ox; origin.y = new_oy; - ui.ctx().request_repaint(); + ui.request_repaint(); } } heads.sort_by_key(|h| *h.z); @@ -616,7 +619,7 @@ impl OutputsPaneInner { if response.has_focus() { let mut dx = 0; let mut dy = 0; - ui.ctx().input(|i| { + ui.input(|i| { if i.key_pressed(Key::ArrowUp) { dy -= 1; } @@ -639,14 +642,14 @@ impl OutputsPaneInner { let pos = (x, y); if effective!(&*head.m, head.changed_state).position != pos { modify!(&*head.m, head.changed_state).position = pos; - ui.ctx().request_repaint(); + ui.request_repaint(); } } } } } if let Some(pos) = response.hover_pos() { - let scroll = ui.ctx().input(|i| i.smooth_scroll_delta); + let scroll = ui.input(|i| i.smooth_scroll_delta); let mut new = scale; if scroll.y != 0.0 { interacted!(); @@ -659,16 +662,13 @@ impl OutputsPaneInner { new = new.max(0.01); if new != scale { self.ui.scale = new; - ui.ctx().request_repaint(); + ui.request_repaint(); let relative_pos = pos - clip_rect.min; let real_pos = (relative_pos + *origin) / scale; *origin = real_pos * new - relative_pos; } } - if ui - .ctx() - .input(|i| i.pointer.button_pressed(PointerButton::Primary)) - { + if ui.input(|i| i.pointer.button_pressed(PointerButton::Primary)) { self.ui.focus += 1; if let Some(pos) = response.hover_pos() { interacted!(); @@ -678,7 +678,7 @@ impl OutputsPaneInner { *head.z = self.ui.next_z; self.ui.next_z += 1; *head.focus = self.ui.focus; - ui.ctx().request_repaint(); + ui.request_repaint(); break; } } @@ -708,9 +708,9 @@ impl OutputsPaneInner { if let Some(origin_drag) = &mut self.ui.origin_drag { *origin_drag -= drag_delta; self.ui.origin = *origin_drag; - ui.ctx().request_repaint(); + ui.request_repaint(); } - let snap = self.settings.snap_to_neighbor ^ ui.ctx().input(|i| i.modifiers.shift); + let snap = self.settings.snap_to_neighbor ^ ui.input(|i| i.modifiers.shift); let mut head_positions = vec![]; struct HeadPosition { name: HeadName, @@ -781,7 +781,7 @@ impl OutputsPaneInner { let pos = (x_int, y_int); if effective!(&*head.m, head.changed_state).position != pos { modify!(&*head.m, head.changed_state).position = pos; - ui.ctx().request_repaint(); + ui.request_repaint(); } *head.drag_pos = Some((x, y)); } @@ -793,7 +793,7 @@ impl OutputsPaneInner { *head.drag_pos = None; } } - ui.ctx().memory_mut(|mem| { + ui.memory_mut(|mem| { mem.set_focus_lock_filter( response.id, EventFilter { diff --git a/src/control_center/cc_sidebar.rs b/src/control_center/cc_sidebar.rs index e7dc18e9..e444f853 100644 --- a/src/control_center/cc_sidebar.rs +++ b/src/control_center/cc_sidebar.rs @@ -52,7 +52,7 @@ impl ControlCenterInner { |ui| { ui.add_space(6.0); if ui.button("Close").clicked() { - ui.ctx().send_viewport_cmd(ViewportCommand::Close); + ui.send_viewport_cmd(ViewportCommand::Close); } ui.separator(); ScrollArea::vertical().show(ui, |ui| { @@ -86,7 +86,7 @@ impl ControlCenterInner { } }; self.open(tree, ty); - ui.ctx().request_repaint(); + ui.request_repaint(); } } ui.add_space(3.0); diff --git a/src/control_center/cc_virtual_outputs.rs b/src/control_center/cc_virtual_outputs.rs index c45e8ae4..b4d96673 100644 --- a/src/control_center/cc_virtual_outputs.rs +++ b/src/control_center/cc_virtual_outputs.rs @@ -42,7 +42,7 @@ impl VirtualOutputsPane { ui.text_edit_singleline(&mut self.new); if ui.button("Add").clicked() { s.virtual_outputs.get_or_create(s, &self.new); - ui.ctx().request_repaint(); + ui.request_repaint(); } }); } diff --git a/src/control_center/cc_window.rs b/src/control_center/cc_window.rs index 80edf4c7..5da2c927 100644 --- a/src/control_center/cc_window.rs +++ b/src/control_center/cc_window.rs @@ -25,7 +25,6 @@ use { }, linearize::Linearize, std::{ - any::Any, mem, rc::{Rc, Weak}, }, @@ -453,10 +452,6 @@ impl CacheTrait for WindowPropertyListeners { fn len(&self) -> usize { self.listeners.len() } - - fn as_any_mut(&mut self) -> &mut dyn Any { - self - } } fn show_content_types(ui: &mut Ui, ct: &mut ContentType) -> bool { diff --git a/src/egui_adapter/egui_platform.rs b/src/egui_adapter/egui_platform.rs index d6d32744..f18bce9f 100644 --- a/src/egui_adapter/egui_platform.rs +++ b/src/egui_adapter/egui_platform.rs @@ -70,8 +70,8 @@ use { }, egui::{ CursorIcon, Event, FontData, FontDefinitions, FontFamily, FullOutput, Key, Modifiers, - MouseWheelUnit, OutputCommand, PlatformOutput, PointerButton, Pos2, RawInput, Vec2, - ViewportCommand, ViewportEvent, ViewportId, ViewportInfo, pos2, vec2, + MouseWheelUnit, OutputCommand, PlatformOutput, PointerButton, Pos2, RawInput, TouchPhase, + Vec2, ViewportCommand, ViewportEvent, ViewportId, ViewportInfo, pos2, vec2, }, futures_util::{FutureExt, select}, isnt::std_1::primitive::{IsntCharExt, IsntSliceExt, IsntStrExt}, @@ -195,7 +195,7 @@ pub struct EggWindow { pub trait EggWindowOwner { fn close(&self); - fn render(self: Rc, ctx: &egui::Context); + fn render(self: Rc, ui: &mut egui::Ui); } struct EggWindowInner { @@ -768,8 +768,8 @@ impl EggWindowInner { .raw_input .take() .unwrap_or_else(|| self.default_raw_input()); - let full_output = self.egui.run(raw_input, |ctx| { - owner.clone().render(ctx); + let full_output = self.egui.run_ui(raw_input, |ui| { + owner.clone().render(ui); }); let FullOutput { platform_output, @@ -1098,6 +1098,7 @@ impl UsrWlPointerOwner for EggSeatInner { window.event(Event::MouseWheel { unit, delta, + phase: TouchPhase::Move, modifiers: self.kb_modifiers.get(), }); }