Fixed crashes

This commit is contained in:
Robin Quint 2022-03-01 14:40:26 +01:00
parent 0e9f39c942
commit e68ea5fe3b
2 changed files with 29 additions and 22 deletions

View File

@ -11,24 +11,26 @@ fn main() {
let mut open = true; let mut open = true;
system.main_loop(move |_, ui| { system.main_loop(move |_, ui| {
ui.window("Hello world") if open {
.opened(&mut open) ui.window("Hello world")
.size([300.0, 110.0], Condition::FirstUseEver) .opened(&mut open)
.build(|| { .size([300.0, 110.0], Condition::FirstUseEver)
ui.text_wrapped("Hello world!"); .build(|| {
ui.text_wrapped("こんにちは世界!"); ui.text_wrapped("Hello world!");
if ui.button(choices[value]) { ui.text_wrapped("こんにちは世界!");
value += 1; if ui.button(choices[value]) {
value %= 2; value += 1;
} value %= 2;
}
ui.button("This...is...imgui-rs!"); ui.button("This...is...imgui-rs!");
ui.separator(); ui.separator();
let mouse_pos = ui.io().mouse_pos; let mouse_pos = ui.io().mouse_pos;
ui.text(format!( ui.text(format!(
"Mouse Position: ({:.1},{:.1})", "Mouse Position: ({:.1},{:.1})",
mouse_pos[0], mouse_pos[1] mouse_pos[0], mouse_pos[1]
)); ));
}); });
}
}); });
} }

View File

@ -639,7 +639,7 @@ impl WinitPlatform {
pub fn update_viewports<T>(&mut self, imgui: &mut Context, window_target: &winit::event_loop::EventLoopWindowTarget<T>) { pub fn update_viewports<T>(&mut self, imgui: &mut Context, window_target: &winit::event_loop::EventLoopWindowTarget<T>) {
// remove destroyed windows // remove destroyed windows
self.windows.retain(|id, _| { self.windows.retain(|id, _| {
imgui.viewport_by_id(*id).is_some() imgui.viewports().any(|vp| vp.id == *id)
}); });
// handle new viewports // handle new viewports
@ -1051,12 +1051,17 @@ impl WinitPlatform {
Event::WindowEvent { window_id, ref event } => { Event::WindowEvent { window_id, ref event } => {
let viewport = { let viewport = {
if window_id == main_window.id() { if window_id == main_window.id() {
imgui.main_viewport_mut() Some(imgui.main_viewport_mut())
} else { } else {
let imgui_id = self.windows.iter().find(|(_, wnd)| wnd.id() == window_id).map(|(id, _)| *id).unwrap(); self.windows.iter().find(|(_, wnd)| wnd.id() == window_id).map(|(id, _)| *id).and_then(|id| imgui.viewport_by_id_mut(id))
imgui.viewport_by_id_mut(imgui_id).unwrap()
} }
}; };
let viewport = if let Some(viewport) = viewport {
viewport
} else {
return;
};
let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)};
match *event { match *event {