use std::os::raw::c_void;
#[doc(inline)]
pub use winit::platform::ios::{Idiom, MonitorHandleExtIOS, ScreenEdge, ValidOrientations};
use winit::platform::ios::{WindowBuilderExtIOS as _, WindowExtIOS as _};
use super::__private as sealed;
use crate::event_loop::EventLoop;
use crate::window::{Window, WindowBuilder};
use crate::ThreadSafety;
pub trait EventLoopExtIOS: sealed::EventLoopPrivate {
fn idiom(&self) -> Idiom;
}
impl<TS: ThreadSafety> EventLoopExtIOS for EventLoop<TS> {
fn idiom(&self) -> Idiom {
use winit::platform::ios::EventLoopExtIOS as _;
self.inner.idiom()
}
}
pub trait WindowExtIOS: sealed::WindowPrivate {
fn ui_window(&self) -> *mut c_void;
fn ui_view_controller(&self) -> *mut c_void;
fn ui_view(&self) -> *mut c_void;
fn set_scale_factor(&self, scale_factor: f64);
fn set_valid_orientations(&self, valid_orientations: ValidOrientations);
fn set_prefers_home_indicator_hidden(&self, hidden: bool);
fn set_preferred_screen_edges_deferring_system_gestures(&self, edges: ScreenEdge);
fn set_prefers_status_bar_hidden(&self, hidden: bool);
}
impl<TS: ThreadSafety> WindowExtIOS for Window<TS> {
#[inline]
fn ui_window(&self) -> *mut c_void {
self.window().ui_window()
}
#[inline]
fn ui_view_controller(&self) -> *mut c_void {
self.window().ui_view_controller()
}
#[inline]
fn ui_view(&self) -> *mut c_void {
self.window().ui_view()
}
#[inline]
fn set_scale_factor(&self, scale_factor: f64) {
self.window().set_scale_factor(scale_factor)
}
#[inline]
fn set_valid_orientations(&self, valid_orientations: ValidOrientations) {
self.window().set_valid_orientations(valid_orientations)
}
#[inline]
fn set_prefers_home_indicator_hidden(&self, hidden: bool) {
self.window().set_prefers_home_indicator_hidden(hidden)
}
#[inline]
fn set_preferred_screen_edges_deferring_system_gestures(&self, edges: ScreenEdge) {
self.window()
.set_preferred_screen_edges_deferring_system_gestures(edges)
}
#[inline]
fn set_prefers_status_bar_hidden(&self, hidden: bool) {
self.window().set_prefers_status_bar_hidden(hidden)
}
}
pub trait WindowBuilderExtIOS: sealed::WindowBuilderPrivate {
fn with_scale_factor(self, scale_factor: f64) -> WindowBuilder;
fn with_valid_orientations(self, valid_orientations: ValidOrientations) -> WindowBuilder;
fn with_prefers_home_indicator_hidden(self, hidden: bool) -> WindowBuilder;
fn with_preferred_screen_edges_deferring_system_gestures(
self,
edges: ScreenEdge,
) -> WindowBuilder;
fn with_prefers_status_bar_hidden(self, hidden: bool) -> WindowBuilder;
}
impl WindowBuilderExtIOS for WindowBuilder {
fn with_scale_factor(mut self, scale_factor: f64) -> WindowBuilder {
self.platform.scale_factor = Some(scale_factor);
self
}
fn with_valid_orientations(mut self, valid_orientations: ValidOrientations) -> WindowBuilder {
self.platform.valid_orientations = Some(valid_orientations);
self
}
fn with_prefers_home_indicator_hidden(mut self, hidden: bool) -> WindowBuilder {
self.platform.prefers_home_indicator_hidden = Some(hidden);
self
}
fn with_preferred_screen_edges_deferring_system_gestures(
mut self,
edges: ScreenEdge,
) -> WindowBuilder {
self.platform
.preferred_screen_edges_deferring_system_gestures = Some(edges);
self
}
fn with_prefers_status_bar_hidden(mut self, hidden: bool) -> WindowBuilder {
self.platform.prefers_status_bar_hidden = Some(hidden);
self
}
}
#[derive(Default)]
pub(crate) struct PlatformSpecific {
scale_factor: Option<f64>,
valid_orientations: Option<ValidOrientations>,
prefers_home_indicator_hidden: Option<bool>,
preferred_screen_edges_deferring_system_gestures: Option<ScreenEdge>,
prefers_status_bar_hidden: Option<bool>,
}
impl PlatformSpecific {
pub(crate) fn apply_to(
self,
mut wb: winit::window::WindowBuilder,
) -> winit::window::WindowBuilder {
if let Some(scale_factor) = self.scale_factor {
wb = wb.with_scale_factor(scale_factor);
}
if let Some(valid_orientations) = self.valid_orientations {
wb = wb.with_valid_orientations(valid_orientations);
}
if let Some(prefers_home_indicator_hidden) = self.prefers_home_indicator_hidden {
wb = wb.with_prefers_home_indicator_hidden(prefers_home_indicator_hidden);
}
if let Some(preferred_screen_edges_deferring_system_gestures) =
self.preferred_screen_edges_deferring_system_gestures
{
wb = wb.with_preferred_screen_edges_deferring_system_gestures(
preferred_screen_edges_deferring_system_gestures,
);
}
if let Some(prefers_status_bar_hidden) = self.prefers_status_bar_hidden {
wb = wb.with_prefers_status_bar_hidden(prefers_status_bar_hidden);
}
wb
}
}