Fixed crashes

This commit is contained in:
Robin Quint 2022-03-01 08:08:53 +01:00
parent 4d32d50962
commit 1d7bcd33ad
5 changed files with 38 additions and 10 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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<SharedFontAtlas>) -> Self {
let _guard = CTX_MUTEX.lock();
assert!(

View File

@ -16,6 +16,11 @@ impl<T> ImVector<T> {
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 _);

View File

@ -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));
}