2018-06-15 09:42:18 +10:00
#![ cfg(target_os = " ios " ) ]
use std ::os ::raw ::c_void ;
2019-06-22 01:33:15 +10:00
use crate ::{
event_loop ::EventLoop ,
2019-07-31 16:57:31 +10:00
monitor ::{ MonitorHandle , VideoMode } ,
2019-06-22 01:33:15 +10:00
window ::{ Window , WindowBuilder } ,
} ;
2019-05-26 11:10:41 +10:00
2019-07-31 16:57:31 +10:00
/// Additional methods on [`EventLoop`] that are specific to iOS.
2019-05-26 11:10:41 +10:00
pub trait EventLoopExtIOS {
2019-07-31 16:57:31 +10:00
/// Returns the [`Idiom`] (phone/tablet/tv/etc) for the current device.
2019-05-30 11:29:54 +10:00
fn idiom ( & self ) -> Idiom ;
2019-05-26 11:10:41 +10:00
}
impl < T : 'static > EventLoopExtIOS for EventLoop < T > {
2019-05-30 11:29:54 +10:00
fn idiom ( & self ) -> Idiom {
self . event_loop . idiom ( )
2019-05-26 11:10:41 +10:00
}
}
2018-06-15 09:42:18 +10:00
2019-07-31 16:57:31 +10:00
/// Additional methods on [`Window`] that are specific to iOS.
2019-02-06 02:30:33 +11:00
pub trait WindowExtIOS {
2019-07-31 16:57:31 +10:00
/// Returns a pointer to the [`UIWindow`] that is used by this window.
2018-06-15 09:42:18 +10:00
///
2019-07-31 16:57:31 +10:00
/// The pointer will become invalid when the [`Window`] is destroyed.
///
/// [`UIWindow`]: https://developer.apple.com/documentation/uikit/uiwindow?language=objc
2019-05-30 11:29:54 +10:00
fn ui_window ( & self ) -> * mut c_void ;
2018-06-15 09:42:18 +10:00
2019-07-31 16:57:31 +10:00
/// Returns a pointer to the [`UIViewController`] that is used by this window.
///
/// The pointer will become invalid when the [`Window`] is destroyed.
2019-05-26 11:10:41 +10:00
///
2019-07-31 16:57:31 +10:00
/// [`UIViewController`]: https://developer.apple.com/documentation/uikit/uiviewcontroller?language=objc
2019-05-30 11:29:54 +10:00
fn ui_view_controller ( & self ) -> * mut c_void ;
2019-05-26 11:10:41 +10:00
2019-07-31 16:57:31 +10:00
/// Returns a pointer to the [`UIView`] that is used by this window.
///
/// The pointer will become invalid when the [`Window`] is destroyed.
2018-06-15 09:42:18 +10:00
///
2019-07-31 16:57:31 +10:00
/// [`UIView`]: https://developer.apple.com/documentation/uikit/uiview?language=objc
2019-05-30 11:29:54 +10:00
fn ui_view ( & self ) -> * mut c_void ;
2019-05-26 11:10:41 +10:00
2020-01-04 06:52:27 +11:00
/// Sets the [`contentScaleFactor`] of the underlying [`UIWindow`] to `scale_factor`.
2019-05-30 11:29:54 +10:00
///
2019-07-31 16:57:31 +10:00
/// The default value is device dependent, and it's recommended GLES or Metal applications set
2020-01-04 06:52:27 +11:00
/// this to [`MonitorHandle::scale_factor()`].
2019-07-31 16:57:31 +10:00
///
/// [`UIWindow`]: https://developer.apple.com/documentation/uikit/uiwindow?language=objc
/// [`contentScaleFactor`]: https://developer.apple.com/documentation/uikit/uiview/1622657-contentscalefactor?language=objc
2020-01-04 06:52:27 +11:00
fn set_scale_factor ( & self , scale_factor : f64 ) ;
2019-05-26 11:10:41 +10:00
2019-07-31 16:57:31 +10:00
/// Sets the valid orientations for the [`Window`].
///
/// The default value is [`ValidOrientations::LandscapeAndPortrait`].
2019-05-30 11:29:54 +10:00
///
2019-07-31 16:57:31 +10:00
/// This changes the value returned by
/// [`-[UIViewController supportedInterfaceOrientations]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621435-supportedinterfaceorientations?language=objc),
/// and then calls
/// [`-[UIViewController attemptRotationToDeviceOrientation]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621400-attemptrotationtodeviceorientati?language=objc).
2019-05-26 11:10:41 +10:00
fn set_valid_orientations ( & self , valid_orientations : ValidOrientations ) ;
2019-07-31 16:57:31 +10:00
/// Sets whether the [`Window`] prefers the home indicator hidden.
///
/// The default is to prefer showing the home indicator.
///
/// This changes the value returned by
/// [`-[UIViewController prefersHomeIndicatorAutoHidden]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887510-prefershomeindicatorautohidden?language=objc),
/// and then calls
/// [`-[UIViewController setNeedsUpdateOfHomeIndicatorAutoHidden]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887509-setneedsupdateofhomeindicatoraut?language=objc).
2019-08-27 08:47:23 +10:00
///
/// This only has an effect on iOS 11.0+.
2019-07-31 16:57:31 +10:00
fn set_prefers_home_indicator_hidden ( & self , hidden : bool ) ;
/// Sets the screen edges for which the system gestures will take a lower priority than the
/// application's touch handling.
///
/// This changes the value returned by
/// [`-[UIViewController preferredScreenEdgesDeferringSystemGestures]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887512-preferredscreenedgesdeferringsys?language=objc),
/// and then calls
/// [`-[UIViewController setNeedsUpdateOfScreenEdgesDeferringSystemGestures]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887507-setneedsupdateofscreenedgesdefer?language=objc).
2019-08-27 08:47:23 +10:00
///
/// This only has an effect on iOS 11.0+.
2019-07-31 16:57:31 +10:00
fn set_preferred_screen_edges_deferring_system_gestures ( & self , edges : ScreenEdge ) ;
2019-08-09 09:10:54 +10:00
/// Sets whether the [`Window`] prefers the status bar hidden.
///
/// The default is to prefer showing the status bar.
///
/// This changes the value returned by
/// [`-[UIViewController prefersStatusBarHidden]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621440-prefersstatusbarhidden?language=objc),
/// and then calls
/// [`-[UIViewController setNeedsStatusBarAppearanceUpdate]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621354-setneedsstatusbarappearanceupdat?language=objc).
fn set_prefers_status_bar_hidden ( & self , hidden : bool ) ;
2018-06-15 09:42:18 +10:00
}
2019-02-06 02:30:33 +11:00
impl WindowExtIOS for Window {
2018-06-15 09:42:18 +10:00
#[ inline ]
2019-05-30 11:29:54 +10:00
fn ui_window ( & self ) -> * mut c_void {
self . window . ui_window ( ) as _
2018-06-15 09:42:18 +10:00
}
2019-05-26 11:10:41 +10:00
#[ inline ]
2019-05-30 11:29:54 +10:00
fn ui_view_controller ( & self ) -> * mut c_void {
self . window . ui_view_controller ( ) as _
2019-05-26 11:10:41 +10:00
}
2018-06-15 09:42:18 +10:00
#[ inline ]
2019-05-30 11:29:54 +10:00
fn ui_view ( & self ) -> * mut c_void {
self . window . ui_view ( ) as _
2018-06-15 09:42:18 +10:00
}
2019-05-26 11:10:41 +10:00
#[ inline ]
2020-01-04 06:52:27 +11:00
fn set_scale_factor ( & self , scale_factor : f64 ) {
self . window . set_scale_factor ( scale_factor )
2019-05-26 11:10:41 +10:00
}
#[ inline ]
fn set_valid_orientations ( & self , valid_orientations : ValidOrientations ) {
self . window . set_valid_orientations ( valid_orientations )
}
2019-07-31 16:57:31 +10:00
#[ 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 )
}
2019-08-09 09:10:54 +10:00
#[ inline ]
fn set_prefers_status_bar_hidden ( & self , hidden : bool ) {
self . window . set_prefers_status_bar_hidden ( hidden )
}
2018-06-15 09:42:18 +10:00
}
2019-07-31 16:57:31 +10:00
/// Additional methods on [`WindowBuilder`] that are specific to iOS.
2019-02-06 02:30:33 +11:00
pub trait WindowBuilderExtIOS {
2019-07-31 16:57:31 +10:00
/// Sets the root view class used by the [`Window`], otherwise a barebones [`UIView`] is provided.
2018-07-26 04:49:46 +10:00
///
2019-07-31 16:57:31 +10:00
/// An instance of the class will be initialized by calling [`-[UIView initWithFrame:]`](https://developer.apple.com/documentation/uikit/uiview/1622488-initwithframe?language=objc).
///
/// [`UIView`]: https://developer.apple.com/documentation/uikit/uiview?language=objc
2018-07-26 04:49:46 +10:00
fn with_root_view_class ( self , root_view_class : * const c_void ) -> WindowBuilder ;
2019-05-30 11:29:54 +10:00
2020-01-04 06:52:27 +11:00
/// Sets the [`contentScaleFactor`] of the underlying [`UIWindow`] to `scale_factor`.
2019-05-30 11:29:54 +10:00
///
2019-05-26 11:10:41 +10:00
/// The default value is device dependent, and it's recommended GLES or Metal applications set
2020-01-04 06:52:27 +11:00
/// this to [`MonitorHandle::scale_factor()`].
2019-07-31 16:57:31 +10:00
///
/// [`UIWindow`]: https://developer.apple.com/documentation/uikit/uiwindow?language=objc
/// [`contentScaleFactor`]: https://developer.apple.com/documentation/uikit/uiview/1622657-contentscalefactor?language=objc
2020-01-04 06:52:27 +11:00
fn with_scale_factor ( self , scale_factor : f64 ) -> WindowBuilder ;
2019-05-30 11:29:54 +10:00
2019-07-31 16:57:31 +10:00
/// Sets the valid orientations for the [`Window`].
///
/// The default value is [`ValidOrientations::LandscapeAndPortrait`].
///
/// This sets the initial value returned by
/// [`-[UIViewController supportedInterfaceOrientations]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621435-supportedinterfaceorientations?language=objc).
2019-05-26 11:10:41 +10:00
fn with_valid_orientations ( self , valid_orientations : ValidOrientations ) -> WindowBuilder ;
2019-07-31 16:57:31 +10:00
/// Sets whether the [`Window`] prefers the home indicator hidden.
///
/// The default is to prefer showing the home indicator.
///
/// This sets the initial value returned by
/// [`-[UIViewController prefersHomeIndicatorAutoHidden]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887510-prefershomeindicatorautohidden?language=objc).
2019-08-27 08:47:23 +10:00
///
/// This only has an effect on iOS 11.0+.
2019-07-31 16:57:31 +10:00
fn with_prefers_home_indicator_hidden ( self , hidden : bool ) -> WindowBuilder ;
/// Sets the screen edges for which the system gestures will take a lower priority than the
/// application's touch handling.
///
/// This sets the initial value returned by
/// [`-[UIViewController preferredScreenEdgesDeferringSystemGestures]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887512-preferredscreenedgesdeferringsys?language=objc).
2019-08-27 08:47:23 +10:00
///
/// This only has an effect on iOS 11.0+.
2019-07-31 16:57:31 +10:00
fn with_preferred_screen_edges_deferring_system_gestures (
self ,
edges : ScreenEdge ,
) -> WindowBuilder ;
2019-08-09 09:10:54 +10:00
/// Sets whether the [`Window`] prefers the status bar hidden.
///
/// The default is to prefer showing the status bar.
///
/// This sets the initial value returned by
/// [`-[UIViewController prefersStatusBarHidden]`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621440-prefersstatusbarhidden?language=objc).
fn with_prefers_status_bar_hidden ( self , hidden : bool ) -> WindowBuilder ;
2018-07-26 04:49:46 +10:00
}
2019-02-06 02:30:33 +11:00
impl WindowBuilderExtIOS for WindowBuilder {
2018-07-26 04:49:46 +10:00
#[ inline ]
fn with_root_view_class ( mut self , root_view_class : * const c_void ) -> WindowBuilder {
self . platform_specific . root_view_class = unsafe { & * ( root_view_class as * const _ ) } ;
self
}
2019-05-26 11:10:41 +10:00
#[ inline ]
2020-01-04 06:52:27 +11:00
fn with_scale_factor ( mut self , scale_factor : f64 ) -> WindowBuilder {
self . platform_specific . scale_factor = Some ( scale_factor ) ;
2019-05-26 11:10:41 +10:00
self
}
#[ inline ]
fn with_valid_orientations ( mut self , valid_orientations : ValidOrientations ) -> WindowBuilder {
self . platform_specific . valid_orientations = valid_orientations ;
self
}
2019-07-31 16:57:31 +10:00
#[ inline ]
fn with_prefers_home_indicator_hidden ( mut self , hidden : bool ) -> WindowBuilder {
self . platform_specific . prefers_home_indicator_hidden = hidden ;
self
}
#[ inline ]
fn with_preferred_screen_edges_deferring_system_gestures (
mut self ,
edges : ScreenEdge ,
) -> WindowBuilder {
self . platform_specific
. preferred_screen_edges_deferring_system_gestures = edges ;
self
}
2019-08-09 09:10:54 +10:00
#[ inline ]
fn with_prefers_status_bar_hidden ( mut self , hidden : bool ) -> WindowBuilder {
self . platform_specific . prefers_status_bar_hidden = hidden ;
self
}
2018-07-26 04:49:46 +10:00
}
2019-07-31 16:57:31 +10:00
/// Additional methods on [`MonitorHandle`] that are specific to iOS.
2019-02-06 02:30:33 +11:00
pub trait MonitorHandleExtIOS {
2019-07-31 16:57:31 +10:00
/// Returns a pointer to the [`UIScreen`] that is used by this monitor.
///
/// [`UIScreen`]: https://developer.apple.com/documentation/uikit/uiscreen?language=objc
2019-05-30 11:29:54 +10:00
fn ui_screen ( & self ) -> * mut c_void ;
2019-07-31 16:57:31 +10:00
/// Returns the preferred [`VideoMode`] for this monitor.
///
/// This translates to a call to [`-[UIScreen preferredMode]`](https://developer.apple.com/documentation/uikit/uiscreen/1617823-preferredmode?language=objc).
fn preferred_video_mode ( & self ) -> VideoMode ;
2018-06-15 09:42:18 +10:00
}
2019-02-06 02:30:33 +11:00
impl MonitorHandleExtIOS for MonitorHandle {
2018-06-15 09:42:18 +10:00
#[ inline ]
2019-05-30 11:29:54 +10:00
fn ui_screen ( & self ) -> * mut c_void {
self . inner . ui_screen ( ) as _
2018-06-15 09:42:18 +10:00
}
2019-07-31 16:57:31 +10:00
#[ inline ]
fn preferred_video_mode ( & self ) -> VideoMode {
self . inner . preferred_video_mode ( )
}
2018-06-15 09:42:18 +10:00
}
2019-05-26 11:10:41 +10:00
2019-07-31 16:57:31 +10:00
/// Valid orientations for a particular [`Window`].
2019-05-26 11:10:41 +10:00
#[ derive(Clone, Copy, Debug) ]
pub enum ValidOrientations {
/// Excludes `PortraitUpsideDown` on iphone
LandscapeAndPortrait ,
Landscape ,
2019-05-30 11:29:54 +10:00
2019-05-26 11:10:41 +10:00
/// Excludes `PortraitUpsideDown` on iphone
Portrait ,
}
impl Default for ValidOrientations {
#[ inline ]
fn default ( ) -> ValidOrientations {
ValidOrientations ::LandscapeAndPortrait
}
}
/// The device [idiom].
2019-05-30 11:29:54 +10:00
///
2019-05-26 11:10:41 +10:00
/// [idiom]: https://developer.apple.com/documentation/uikit/uidevice/1620037-userinterfaceidiom?language=objc
#[ derive(Clone, Copy, Debug, PartialEq, Eq) ]
pub enum Idiom {
Unspecified ,
/// iPhone and iPod touch.
Phone ,
/// iPad.
Pad ,
/// tvOS and Apple TV.
TV ,
CarPlay ,
}
2019-07-31 16:57:31 +10:00
bitflags! {
/// The [edges] of a screen.
///
/// [edges]: https://developer.apple.com/documentation/uikit/uirectedge?language=objc
#[ derive(Default) ]
pub struct ScreenEdge : u8 {
const NONE = 0 ;
const TOP = 1 < < 0 ;
const LEFT = 1 < < 1 ;
const BOTTOM = 1 < < 2 ;
const RIGHT = 1 < < 3 ;
const ALL = ScreenEdge ::TOP . bits | ScreenEdge ::LEFT . bits
| ScreenEdge ::BOTTOM . bits | ScreenEdge ::RIGHT . bits ;
}
}