Fixed initial window positioning and windows not rendering when focused

This commit is contained in:
Robin Quint 2022-03-02 08:37:53 +01:00
parent e68ea5fe3b
commit cb8f63fb8c

View File

@ -512,7 +512,7 @@ impl imgui::PlatformViewportBackend for ViewportBackend {
fn get_window_minimized(&mut self, viewport: &mut imgui::Viewport) -> bool { fn get_window_minimized(&mut self, viewport: &mut imgui::Viewport) -> bool {
let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; 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) { 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 viewport = imgui.viewport_by_id_mut(*id).unwrap();
let state = unsafe{&mut *(viewport.platform_user_data as *mut ViewportState)}; 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 { 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; state.set_pos = None;
} }
if let Some(size) = &state.set_size { if let Some(size) = &state.set_size {
wnd.set_inner_size(winit::dpi::LogicalSize::new(size[0], size[1])); wnd.set_inner_size(winit::dpi::LogicalSize::new(size[0], size[1]));
state.set_size = None; state.set_size = None;
} }
if state.set_show {
wnd.set_visible(true);
state.set_show = false;
}
if state.set_focus { if state.set_focus {
wnd.focus_window(); wnd.focus_window();
state.set_focus = false; state.set_focus = false;
@ -1049,6 +1053,17 @@ impl WinitPlatform {
pub fn handle_viewport_event<T>(&mut self, imgui: &mut imgui::Context, main_window: &Window, event: &Event<T>) { pub fn handle_viewport_event<T>(&mut self, imgui: &mut imgui::Context, main_window: &Window, event: &Event<T>) {
match *event { match *event {
Event::WindowEvent { window_id, ref 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 = { let viewport = {
if window_id == main_window.id() { if window_id == main_window.id() {
Some(imgui.main_viewport_mut()) Some(imgui.main_viewport_mut())
@ -1068,8 +1083,9 @@ impl WinitPlatform {
WindowEvent::Resized(new_size) => { WindowEvent::Resized(new_size) => {
state.size = [new_size.width as f32, new_size.height as f32]; state.size = [new_size.width as f32, new_size.height as f32];
}, },
WindowEvent::Moved(new_pos) => { WindowEvent::Moved(_new_pos) => {
state.pos = [new_pos.x as f32, new_pos.y as f32]; let pos = window.inner_position().unwrap();
state.pos = [pos.x as f32, pos.y as f32];
}, },
WindowEvent::CloseRequested => { WindowEvent::CloseRequested => {
viewport.platform_request_close = true; viewport.platform_request_close = true;
@ -1078,9 +1094,8 @@ impl WinitPlatform {
state.focus = focus; state.focus = focus;
}, },
WindowEvent::CursorMoved { position, .. } => { WindowEvent::CursorMoved { position, .. } => {
let mut pos = state.pos; let wnd_pos = window.inner_position().unwrap();
pos[0] += position.x as f32; let pos = [wnd_pos.x as f32 + position.x as f32, wnd_pos.y as f32 + position.y as f32];
pos[1] += position.y as f32;
imgui.io_mut().mouse_pos = pos; imgui.io_mut().mouse_pos = pos;
}, },
WindowEvent::KeyboardInput { WindowEvent::KeyboardInput {