diff --git a/imgui-examples/Cargo.toml b/imgui-examples/Cargo.toml index 0f2fba6..639b0ba 100644 --- a/imgui-examples/Cargo.toml +++ b/imgui-examples/Cargo.toml @@ -13,6 +13,6 @@ publish = false clipboard = "0.5" glium = { version = "0.31", default-features = true } image = "0.23" -imgui = { path = "../imgui", features = ["tables-api"] } +imgui = { path = "../imgui", features = ["tables-api", "docking"] } imgui-glium-renderer = { path = "../imgui-glium-renderer" } imgui-winit-support = { path = "../imgui-winit-support" } diff --git a/imgui-examples/examples/viewports.rs b/imgui-examples/examples/viewports.rs new file mode 100644 index 0000000..3783460 --- /dev/null +++ b/imgui-examples/examples/viewports.rs @@ -0,0 +1,4 @@ + +fn main() { + +} diff --git a/imgui/src/context.rs b/imgui/src/context.rs index de346a8..8964f56 100644 --- a/imgui/src/context.rs +++ b/imgui/src/context.rs @@ -9,7 +9,7 @@ use crate::clipboard::{ClipboardBackend, ClipboardContext}; use crate::fonts::atlas::{FontAtlas, FontId, SharedFontAtlas}; use crate::io::Io; use crate::style::Style; -use crate::{sys, DrawData}; +use crate::{sys, DrawData, PlatformIo}; use crate::{MouseCursor, Ui}; /// An imgui-rs context. @@ -479,6 +479,18 @@ impl Context { &mut *(sys::igGetIO() as *mut Io) } } + pub fn platform_io(&self) -> &PlatformIo { + unsafe { + // safe because PlatformIo is a transparent wrapper around sys::ImGuiPlatformIO + &*(sys::igGetPlatformIO() as *const PlatformIo) + } + } + pub fn platform_io_mut(&mut self) -> &PlatformIo { + unsafe { + // safe because PlatformIo is a transparent wrapper around sys::ImGuiPlatformIO + &mut *(sys::igGetPlatformIO() as *mut PlatformIo) + } + } /// Returns an immutable reference to the user interface style #[doc(alias = "GetStyle")] pub fn style(&self) -> &Style { diff --git a/imgui/src/io.rs b/imgui/src/io.rs index 2362c31..d4c4e92 100644 --- a/imgui/src/io.rs +++ b/imgui/src/io.rs @@ -1,7 +1,7 @@ use bitflags::bitflags; use std::f32; use std::ops::{Index, IndexMut}; -use std::os::raw::{c_char, c_void}; +use std::os::raw::{c_char, c_void, c_int}; use std::time::Duration; use crate::fonts::atlas::FontAtlas; @@ -55,6 +55,27 @@ bitflags! { #[cfg(feature = "docking")] const DOCKING_ENABLE = sys::ImGuiConfigFlags_DockingEnable; + + #[cfg(feature = "docking")] + const VIEWPORTS_ENABLE = sys::ImGuiConfigFlags_ViewportsEnable; + } + + #[cfg(feature = "docking")] + #[repr(transparent)] + pub struct ViewportFlags: u32 { + const IS_PLATFORM_WINDOW = sys::ImGuiViewportFlags_IsPlatformWindow; + const IS_PLATFORM_MONITOR = sys::ImGuiViewportFlags_IsPlatformMonitor; + const OWNED_BY_APP = sys::ImGuiViewportFlags_OwnedByApp; + const NO_DECORATION = sys::ImGuiViewportFlags_NoDecoration; + const NO_TASK_BAR_ICON = sys::ImGuiViewportFlags_NoTaskBarIcon; + const NO_FOCUS_ON_APPEARING = sys::ImGuiViewportFlags_NoFocusOnAppearing; + const NO_FOCUS_ON_CLICK = sys::ImGuiViewportFlags_NoFocusOnClick; + const NO_INPUTS = sys::ImGuiViewportFlags_NoInputs; + const NO_RENDERER_CLEAR = sys::ImGuiViewportFlags_NoRendererClear; + const TOP_MOST = sys::ImGuiViewportFlags_TopMost; + const MINIMIZED = sys::ImGuiViewportFlags_Minimized; + const NO_AUTO_MERGE = sys::ImGuiViewportFlags_NoAutoMerge; + const CAN_HOST_OTHER_WINDOWS = sys::ImGuiViewportFlags_CanHostOtherWindows; } } @@ -74,6 +95,11 @@ bitflags! { /// /// This enables output of large meshes (64K+ vertices) while still using 16-bits indices. const RENDERER_HAS_VTX_OFFSET = sys::ImGuiBackendFlags_RendererHasVtxOffset; + + #[cfg(feature = "docking")] + const PLATFORM_HAS_VIEWPORTS = sys::ImGuiBackendFlags_PlatformHasViewports; + #[cfg(feature = "docking")] + const RENDERER_HAS_VIEWPORTS = sys::ImGuiBackendFlags_RendererHasViewports; } } @@ -132,6 +158,73 @@ fn test_nav_input_variants() { } } +#[cfg(feature = "docking")] +#[repr(C)] +pub struct PlatformIo { + pub(crate) platform_create_window: Option, + pub(crate) platform_destroy_window: Option, + pub(crate) platform_show_window: Option, + pub(crate) platform_set_window_pos: Option, + pub(crate) platform_get_window_pos: Option sys::ImVec2>, + pub(crate) platform_set_window_size: Option, + pub(crate) platform_get_window_size: Option sys::ImVec2>, + pub(crate) platform_set_window_focus: Option, + pub(crate) platform_get_window_focus: Option bool>, + pub(crate) platform_get_window_minimized: Option bool>, + pub(crate) platform_set_window_title: Option, + pub(crate) platform_set_window_alpha: Option, + pub(crate) platform_update_window: Option, + pub(crate) platform_render_window: Option, + pub(crate) platform_swap_buffers: Option, + pub(crate) platform_get_window_dpi_scale: Option f32>, + pub(crate) platform_on_changed_viewport: Option, + pub(crate) platform_create_vk_surface: Option c_int>, + + pub(crate) renderer_create_window: Option, + pub(crate) renderer_destroy_window: Option, + pub(crate) renderer_set_window_size: Option, + pub(crate) renderer_render_window: Option, + pub(crate) renderer_swap_buffers: Option, + + pub(crate) monitors: ImVector, + + pub(crate) viewports: ImVector<*mut Viewport>, +} + +unsafe impl RawCast for PlatformIo {} + +#[cfg(feature = "docking")] +#[repr(C)] +pub struct Viewport { + pub(crate) id: crate::Id, + pub(crate) flags: ViewportFlags, + pub(crate) pos: [f32; 2], + pub(crate) size: [f32; 2], + pub(crate) work_pos: [f32; 2], + pub(crate) work_size: [f32; 2], + pub(crate) dpi_scale: f32, + pub(crate) parent_viewport_id: crate::Id, + pub(crate) draw_data: *mut crate::DrawData, + + pub(crate) renderer_user_data: *mut c_void, + pub(crate) platform_user_data: *mut c_void, + pub(crate) platform_handle: *mut c_void, + pub(crate) platform_handle_raw: *mut c_void, + pub(crate) platform_request_move: bool, + pub(crate) platform_request_resize: bool, + pub(crate) platform_request_close: bool, +} + +#[cfg(feature = "docking")] +#[repr(C)] +pub struct PlatformMonitor { + main_pos: [f32; 2], + main_size: [f32; 2], + work_pos: [f32; 2], + work_size: [f32; 2], + dpi_scale: f32, +} + /// Settings and inputs/outputs for imgui-rs #[repr(C)] pub struct Io {