From e68ea5fe3b26fdebbbfcffb1f6beeb9c592145d9 Mon Sep 17 00:00:00 2001 From: Robin Quint Date: Tue, 1 Mar 2022 14:40:26 +0100 Subject: [PATCH] Fixed crashes --- imgui-examples/examples/hello_world.rs | 38 ++++++++++++++------------ imgui-winit-support/src/lib.rs | 13 ++++++--- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/imgui-examples/examples/hello_world.rs b/imgui-examples/examples/hello_world.rs index ddb85f8..42d4ce8 100644 --- a/imgui-examples/examples/hello_world.rs +++ b/imgui-examples/examples/hello_world.rs @@ -11,24 +11,26 @@ fn main() { let mut open = true; system.main_loop(move |_, ui| { - ui.window("Hello world") - .opened(&mut open) - .size([300.0, 110.0], Condition::FirstUseEver) - .build(|| { - ui.text_wrapped("Hello world!"); - ui.text_wrapped("こんにちは世界!"); - if ui.button(choices[value]) { - value += 1; - value %= 2; - } + if open { + ui.window("Hello world") + .opened(&mut open) + .size([300.0, 110.0], Condition::FirstUseEver) + .build(|| { + ui.text_wrapped("Hello world!"); + ui.text_wrapped("こんにちは世界!"); + if ui.button(choices[value]) { + value += 1; + value %= 2; + } - ui.button("This...is...imgui-rs!"); - ui.separator(); - let mouse_pos = ui.io().mouse_pos; - ui.text(format!( - "Mouse Position: ({:.1},{:.1})", - mouse_pos[0], mouse_pos[1] - )); - }); + ui.button("This...is...imgui-rs!"); + ui.separator(); + let mouse_pos = ui.io().mouse_pos; + ui.text(format!( + "Mouse Position: ({:.1},{:.1})", + mouse_pos[0], mouse_pos[1] + )); + }); + } }); } diff --git a/imgui-winit-support/src/lib.rs b/imgui-winit-support/src/lib.rs index 4239fac..a975bf6 100644 --- a/imgui-winit-support/src/lib.rs +++ b/imgui-winit-support/src/lib.rs @@ -639,7 +639,7 @@ impl WinitPlatform { pub fn update_viewports(&mut self, imgui: &mut Context, window_target: &winit::event_loop::EventLoopWindowTarget) { // remove destroyed windows self.windows.retain(|id, _| { - imgui.viewport_by_id(*id).is_some() + imgui.viewports().any(|vp| vp.id == *id) }); // handle new viewports @@ -1051,12 +1051,17 @@ impl WinitPlatform { Event::WindowEvent { window_id, ref event } => { let viewport = { if window_id == main_window.id() { - imgui.main_viewport_mut() + Some(imgui.main_viewport_mut()) } else { - let imgui_id = self.windows.iter().find(|(_, wnd)| wnd.id() == window_id).map(|(id, _)| *id).unwrap(); - imgui.viewport_by_id_mut(imgui_id).unwrap() + self.windows.iter().find(|(_, wnd)| wnd.id() == window_id).map(|(id, _)| *id).and_then(|id| imgui.viewport_by_id_mut(id)) } }; + let viewport = if let Some(viewport) = viewport { + viewport + } else { + return; + }; + let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; match *event {