From cb8f63fb8ce91798035bf434636509bee162fbe1 Mon Sep 17 00:00:00 2001 From: Robin Quint Date: Wed, 2 Mar 2022 08:37:53 +0100 Subject: [PATCH] Fixed initial window positioning and windows not rendering when focused --- imgui-winit-support/src/lib.rs | 37 ++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/imgui-winit-support/src/lib.rs b/imgui-winit-support/src/lib.rs index a975bf6..735d8d2 100644 --- a/imgui-winit-support/src/lib.rs +++ b/imgui-winit-support/src/lib.rs @@ -512,7 +512,7 @@ impl imgui::PlatformViewportBackend for ViewportBackend { fn get_window_minimized(&mut self, viewport: &mut imgui::Viewport) -> bool { let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; - state.focus + state.minimized } fn set_window_title(&mut self, viewport: &mut imgui::Viewport, title: &str) { @@ -666,18 +666,22 @@ impl WinitPlatform { let viewport = imgui.viewport_by_id_mut(*id).unwrap(); let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; - if state.set_show { - wnd.set_visible(true); - state.set_show = false; - } if let Some(pos) = &state.set_pos { - wnd.set_outer_position(winit::dpi::LogicalPosition::new(pos[0], pos[1])); + let wnd_pos = wnd.outer_position().unwrap(); + let inner_pos = wnd.inner_position().unwrap(); + let decoration_size = [inner_pos.x - wnd_pos.x, inner_pos.y - wnd_pos.y]; + + wnd.set_outer_position(winit::dpi::LogicalPosition::new(pos[0] - decoration_size[0] as f32, pos[1] - decoration_size[1] as f32)); state.set_pos = None; } if let Some(size) = &state.set_size { wnd.set_inner_size(winit::dpi::LogicalSize::new(size[0], size[1])); state.set_size = None; } + if state.set_show { + wnd.set_visible(true); + state.set_show = false; + } if state.set_focus { wnd.focus_window(); state.set_focus = false; @@ -1049,6 +1053,17 @@ impl WinitPlatform { pub fn handle_viewport_event(&mut self, imgui: &mut imgui::Context, main_window: &Window, event: &Event) { match *event { Event::WindowEvent { window_id, ref event } => { + let window = if window_id == main_window.id() { + Some(main_window) + } else { + self.windows.iter().find_map(|(_, wnd)| (wnd.id() == window_id).then(|| wnd)) + }; + let window = if let Some(window) = window { + window + } else { + return; + }; + let viewport = { if window_id == main_window.id() { Some(imgui.main_viewport_mut()) @@ -1068,8 +1083,9 @@ impl WinitPlatform { WindowEvent::Resized(new_size) => { state.size = [new_size.width as f32, new_size.height as f32]; }, - WindowEvent::Moved(new_pos) => { - state.pos = [new_pos.x as f32, new_pos.y as f32]; + WindowEvent::Moved(_new_pos) => { + let pos = window.inner_position().unwrap(); + state.pos = [pos.x as f32, pos.y as f32]; }, WindowEvent::CloseRequested => { viewport.platform_request_close = true; @@ -1078,9 +1094,8 @@ impl WinitPlatform { state.focus = focus; }, WindowEvent::CursorMoved { position, .. } => { - let mut pos = state.pos; - pos[0] += position.x as f32; - pos[1] += position.y as f32; + let wnd_pos = window.inner_position().unwrap(); + let pos = [wnd_pos.x as f32 + position.x as f32, wnd_pos.y as f32 + position.y as f32]; imgui.io_mut().mouse_pos = pos; }, WindowEvent::KeyboardInput {