mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-15 23:48:31 +00:00
Fixed crashes
This commit is contained in:
parent
4d32d50962
commit
1d7bcd33ad
@ -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 {
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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!(
|
||||
|
||||
@ -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 _);
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user