#![allow(unsafe_op_in_unsafe_fn)]
#[cfg(doctest)]
mod removed_runtime_facade_contract {
struct RemovedRuntimeFacade;
struct RemovedRendererOwnerPreflight;
}
mod callbacks;
mod coordinates;
pub(crate) mod events;
mod focus;
mod native_cursor_hittest;
mod registry;
mod runtime;
#[cfg(test)]
mod tests;
mod viewport_data;
use std::sync::Arc;
use thiserror::Error;
use winit::window::Window;
use crate::native_support::{MonitorCollectionError, MonitorSnapshot};
pub(crate) use self::coordinates::{
client_physical_to_screen_pos, desktop_size_for_window, framebuffer_scale_for_window,
ime_cursor_area_for_viewport, scale_factor_inner_size_override, single_window_display_metrics,
window_position_from_desktop, window_size_from_desktop,
};
pub(crate) use self::runtime::RuntimeControl;
pub use self::runtime::{EventLoopScope, WinitViewportAttempt, WinitViewportRendererAdapter};
pub use crate::WinitPlatformError;
#[derive(Clone, Copy, Debug, Eq, Error, PartialEq)]
#[non_exhaustive]
pub enum WinitMonitorCollectionFailure {
#[error(transparent)]
Native(#[from] MonitorCollectionError),
#[error("the native monitor collection is empty")]
EmptyCollection,
#[error("the native monitor collection cannot prove one unique primary identity")]
PrimaryIdentityUnproven,
#[error("the native monitor collection cannot be projected into Dear ImGui coordinates")]
ProjectionInvalid,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WinitMonitorPublicationState {
NativeSnapshot,
RetainedAfterCollectionFailure {
reason: WinitMonitorCollectionFailure,
},
}
#[derive(Clone, Debug, PartialEq)]
pub struct WinitMonitorPublicationReport {
state: WinitMonitorPublicationState,
snapshots: Option<Vec<MonitorSnapshot>>,
}
impl WinitMonitorPublicationReport {
fn new(state: WinitMonitorPublicationState, snapshots: Option<Vec<MonitorSnapshot>>) -> Self {
Self { state, snapshots }
}
#[must_use]
pub const fn state(&self) -> WinitMonitorPublicationState {
self.state
}
#[must_use]
pub fn snapshots(&self) -> Option<&[MonitorSnapshot]> {
self.snapshots.as_deref()
}
}
#[allow(unused_variables)]
fn mvlog(message: impl std::fmt::Display) {
if cfg!(feature = "mv-log") {
eprintln!("{message}");
}
}
pub(crate) fn window_for_viewport(
ctx: *mut dear_imgui_rs::sys::ImGuiContext,
viewport: *mut dear_imgui_rs::sys::ImGuiViewport,
) -> Option<Arc<Window>> {
if viewport.is_null() {
return None;
}
self::registry::runtime_for_context(ctx)
.and_then(|control| self::registry::window_for_viewport(&control, viewport))
}