diff --git a/CHANGELOG.md b/CHANGELOG.md index 6678da2cb1b..3612db7098a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ NOTE: [`epaint`](epaint/CHANGELOG.md), [`eframe`](eframe/CHANGELOG.md), [`egui_w ### Fixed 🐛 * Fixed ComboBoxes always being rendered left-aligned ([#1304](https://github.com/emilk/egui/pull/1304)). - +* Fixed ui code that could lead to a deadlock ([#1380](https://github.com/emilk/egui/pull/1380)) ## 0.17.0 - 2022-02-22 - Improved font selection and image handling diff --git a/egui/src/menu.rs b/egui/src/menu.rs index 46146821ab2..1906150d08f 100644 --- a/egui/src/menu.rs +++ b/egui/src/menu.rs @@ -277,10 +277,10 @@ impl MenuRoot { root: &mut MenuRootManager, id: Id, ) -> MenuResponse { - let pointer = &response.ctx.input().pointer; - if (response.clicked() && root.is_menu_open(id)) - || response.ctx.input().key_pressed(Key::Escape) - { + // Lock the input once for the whole function call (see https://github.com/emilk/egui/pull/1380). + let input = response.ctx.input(); + + if (response.clicked() && root.is_menu_open(id)) || input.key_pressed(Key::Escape) { // menu open and button clicked or esc pressed return MenuResponse::Close; } else if (response.clicked() && !root.is_menu_open(id)) @@ -290,8 +290,8 @@ impl MenuRoot { // or button hovered while other menu is open let pos = response.rect.left_bottom(); return MenuResponse::Create(pos, id); - } else if pointer.any_pressed() && pointer.primary_down() { - if let Some(pos) = pointer.interact_pos() { + } else if input.pointer.any_pressed() && input.pointer.primary_down() { + if let Some(pos) = input.pointer.interact_pos() { if let Some(root) = root.inner.as_mut() { if root.id == id { // pressed somewhere while this menu is open diff --git a/egui/src/widgets/slider.rs b/egui/src/widgets/slider.rs index 23480abeece..c24a5fb9cc3 100644 --- a/egui/src/widgets/slider.rs +++ b/egui/src/widgets/slider.rs @@ -455,10 +455,14 @@ impl<'a> Slider<'a> { fn value_ui(&mut self, ui: &mut Ui, position_range: RangeInclusive) -> Response { // If `DragValue` is controlled from the keyboard and `step` is defined, set speed to `step` - let change = ui.input().num_presses(Key::ArrowUp) as i32 - + ui.input().num_presses(Key::ArrowRight) as i32 - - ui.input().num_presses(Key::ArrowDown) as i32 - - ui.input().num_presses(Key::ArrowLeft) as i32; + let change = { + // Hold one lock rather than 4 (see https://github.com/emilk/egui/pull/1380). + let input = ui.input(); + + input.num_presses(Key::ArrowUp) as i32 + input.num_presses(Key::ArrowRight) as i32 + - input.num_presses(Key::ArrowDown) as i32 + - input.num_presses(Key::ArrowLeft) as i32 + }; let speed = match self.step { Some(step) if change != 0 => step, _ => self.current_gradient(&position_range),