From 1d7bcd33adb98a9ce8b9a970d53f9e406da92fb6 Mon Sep 17 00:00:00 2001 From: Robin Quint Date: Tue, 1 Mar 2022 08:08:53 +0100 Subject: [PATCH] Fixed crashes --- imgui-examples/examples/support/mod.rs | 1 + imgui-winit-support/src/lib.rs | 4 +++- imgui/src/context.rs | 15 +++++++++++++-- imgui/src/internal.rs | 5 +++++ imgui/src/platform_io.rs | 23 ++++++++++++++++------- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/imgui-examples/examples/support/mod.rs b/imgui-examples/examples/support/mod.rs index ac41295..546c4dc 100644 --- a/imgui-examples/examples/support/mod.rs +++ b/imgui-examples/examples/support/mod.rs @@ -158,6 +158,7 @@ impl System { renderer .render(&mut target, draw_data) .expect("Rendering failed"); + imgui.update_platform_windows(); target.finish().expect("Failed to swap buffers"); } Event::WindowEvent { diff --git a/imgui-winit-support/src/lib.rs b/imgui-winit-support/src/lib.rs index cb1a2d9..83dd78c 100644 --- a/imgui-winit-support/src/lib.rs +++ b/imgui-winit-support/src/lib.rs @@ -188,7 +188,7 @@ use winit_20 as winit; ))] use winit_19 as winit; -use imgui::{self, BackendFlags, ConfigFlags, Context, Io, Key, Ui, PlatformViewportBackend, ViewportFlags, PlatformMonitor}; +use imgui::{self, BackendFlags, ConfigFlags, Context, Io, Key, Ui, PlatformViewportBackend, ViewportFlags, PlatformMonitor, Viewport}; use std::cell::Cell; use std::cmp::Ordering; use winit::dpi::{LogicalPosition, LogicalSize}; @@ -619,6 +619,8 @@ impl WinitPlatform { let main_viewport = imgui.main_viewport_mut(); main_viewport.platform_handle = Box::into_raw(Box::new(PlatformHandle::MainWindow(main_window as *const _))) as *mut _; + println!("MAIN VIEWPORT: {:016X}", main_viewport as *mut Viewport as u64); + println!("PLATFORM HANDLE: {:016X}", main_viewport.platform_handle as u64); } /// Attaches the platform instance to a winit window. diff --git a/imgui/src/context.rs b/imgui/src/context.rs index 93ea312..a233795 100644 --- a/imgui/src/context.rs +++ b/imgui/src/context.rs @@ -232,9 +232,15 @@ impl Context { pio.platform_destroy_window = Some(crate::platform_io::platform_destroy_window); pio.platform_show_window = Some(crate::platform_io::platform_show_window); pio.platform_set_window_pos = Some(crate::platform_io::platform_set_window_pos); - pio.platform_get_window_pos = Some(crate::platform_io::platform_get_window_pos); + // pio.platform_get_window_pos = Some(crate::platform_io::platform_get_window_pos); + unsafe { + crate::platform_io::ImGuiPlatformIO_Set_Platform_GetWindowPos(pio, crate::platform_io::platform_get_window_pos); + } pio.platform_set_window_size = Some(crate::platform_io::platform_set_window_size); - pio.platform_get_window_size = Some(crate::platform_io::platform_get_window_size); + // pio.platform_get_window_size = Some(crate::platform_io::platform_get_window_size); + unsafe { + crate::platform_io::ImGuiPlatformIO_Set_Platform_GetWindowSize(pio, crate::platform_io::platform_get_window_size); + } pio.platform_set_window_focus = Some(crate::platform_io::platform_set_window_focus); pio.platform_get_window_focus = Some(crate::platform_io::platform_get_window_focus); pio.platform_get_window_minimized = Some(crate::platform_io::platform_get_window_minimized); @@ -264,6 +270,11 @@ impl Context { self.renderer_viewport_ctx = ctx; } + pub fn update_platform_windows(&mut self) { + unsafe { + sys::igUpdatePlatformWindows(); + } + } fn create_internal(mut shared_font_atlas: Option) -> Self { let _guard = CTX_MUTEX.lock(); assert!( diff --git a/imgui/src/internal.rs b/imgui/src/internal.rs index af24cca..d7869a3 100644 --- a/imgui/src/internal.rs +++ b/imgui/src/internal.rs @@ -16,6 +16,11 @@ impl ImVector { unsafe { slice::from_raw_parts(self.data, self.size as usize) } } + #[inline] + pub fn as_slice_mut(&mut self) -> &mut [T] { + unsafe { slice::from_raw_parts_mut(self.data, self.size as usize) } + } + pub fn replace_from_slice(&mut self, data: &[T]) { unsafe { sys::igMemFree(self.data as *mut _); diff --git a/imgui/src/platform_io.rs b/imgui/src/platform_io.rs index 191251c..69aab2b 100644 --- a/imgui/src/platform_io.rs +++ b/imgui/src/platform_io.rs @@ -1,6 +1,6 @@ use std::{os::raw::{c_char, c_int}, ffi::{c_void, CStr}}; -use crate::{internal::{ImVector, RawCast}, ViewportFlags}; +use crate::{internal::{ImVector, RawCast}, ViewportFlags, Io}; #[cfg(feature = "docking")] #[repr(C)] @@ -106,13 +106,13 @@ pub trait PlatformViewportBackend: 'static { fn get_platform_ctx() -> &'static mut PlatformViewportContext { unsafe { - &mut *((*sys::igGetIO()).BackendPlatformUserData as *mut PlatformViewportContext) + &mut *((*(sys::igGetIO() as *const Io)).backend_platform_user_data as *mut PlatformViewportContext) } } fn get_renderer_ctx() -> &'static mut RendererViewportContext { unsafe { - &mut *((*sys::igGetIO()).BackendRendererUserData as *mut RendererViewportContext) + &mut *((*(sys::igGetIO() as *const Io)).backend_platform_user_data as *mut RendererViewportContext) } } @@ -132,19 +132,23 @@ pub(crate) extern "C" fn platform_set_window_pos(viewport: *mut Viewport, pos: s let ctx = get_platform_ctx(); ctx.backend.set_window_pos(unsafe{&mut *viewport}, [pos.x, pos.y]); } -pub(crate) extern "C" fn platform_get_window_pos(viewport: *mut Viewport) -> sys::ImVec2 { +pub(crate) extern "C" fn platform_get_window_pos(viewport: *mut Viewport, out_pos: *mut sys::ImVec2) { let ctx = get_platform_ctx(); let pos = ctx.backend.get_window_pos(unsafe{&mut *viewport}); - sys::ImVec2::new(pos[0], pos[1]) + unsafe { + *out_pos = sys::ImVec2::new(pos[0], pos[1]); + } } pub(crate) extern "C" fn platform_set_window_size(viewport: *mut Viewport, size: sys::ImVec2) { let ctx = get_platform_ctx(); ctx.backend.set_window_size(unsafe{&mut *viewport}, [size.x, size.y]); } -pub(crate) extern "C" fn platform_get_window_size(viewport: *mut Viewport) -> sys::ImVec2 { +pub(crate) extern "C" fn platform_get_window_size(viewport: *mut Viewport, out_size: *mut sys::ImVec2) { let ctx = get_platform_ctx(); let size = ctx.backend.get_window_size(unsafe{&mut *viewport}); - sys::ImVec2::new(size[0], size[1]) + unsafe { + *out_size = sys::ImVec2::new(size[0], size[1]); + } } pub(crate) extern "C" fn platform_set_window_focus(viewport: *mut Viewport) { let ctx = get_platform_ctx(); @@ -416,3 +420,8 @@ fn test_platform_monitor_memory_layout() { assert_field_offset!(work_size, WorkSize); assert_field_offset!(dpi_scale, DpiScale); } + +extern "C" { + pub(crate) fn ImGuiPlatformIO_Set_Platform_GetWindowPos(pio: *mut PlatformIo, func: extern "C" fn(*mut Viewport, *mut sys::ImVec2)); + pub(crate) fn ImGuiPlatformIO_Set_Platform_GetWindowSize(pio: *mut PlatformIo, func: extern "C" fn(*mut Viewport, *mut sys::ImVec2)); +}