From a4480a065209551b0af2907e5891031c8d4fb0e2 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 27 Feb 2024 21:07:52 +0100 Subject: [PATCH] Clean up iOS ffi.rs (#3530) This makes it easier to transition to a future autogenerated version of UIKit. --- src/platform_impl/ios/event_loop.rs | 11 ++- src/platform_impl/ios/ffi.rs | 76 ------------------- src/platform_impl/ios/mod.rs | 1 - src/platform_impl/ios/uikit/device.rs | 21 ++++- src/platform_impl/ios/uikit/geometry.rs | 14 ++++ src/platform_impl/ios/uikit/mod.rs | 4 +- .../ios/uikit/status_bar_style.rs | 11 --- src/platform_impl/ios/view_controller.rs | 33 +++++--- src/platform_impl/ios/window.rs | 4 +- 9 files changed, 67 insertions(+), 108 deletions(-) delete mode 100644 src/platform_impl/ios/ffi.rs create mode 100644 src/platform_impl/ios/uikit/geometry.rs diff --git a/src/platform_impl/ios/event_loop.rs b/src/platform_impl/ios/event_loop.rs index a0ef0e0f..cbdf3ba4 100644 --- a/src/platform_impl/ios/event_loop.rs +++ b/src/platform_impl/ios/event_loop.rs @@ -27,7 +27,7 @@ use crate::{ window::{CustomCursor, CustomCursorSource}, }; -use super::app_delegate::AppDelegate; +use super::{app_delegate::AppDelegate, uikit::UIUserInterfaceIdiom}; use super::{app_state, monitor, MonitorHandle}; use super::{ app_state::AppState, @@ -227,7 +227,14 @@ impl EventLoop { // EventLoopExtIOS impl EventLoop { pub fn idiom(&self) -> Idiom { - UIDevice::current(self.mtm).userInterfaceIdiom().into() + match UIDevice::current(self.mtm).userInterfaceIdiom() { + UIUserInterfaceIdiom::Unspecified => Idiom::Unspecified, + UIUserInterfaceIdiom::Phone => Idiom::Phone, + UIUserInterfaceIdiom::Pad => Idiom::Pad, + UIUserInterfaceIdiom::TV => Idiom::TV, + UIUserInterfaceIdiom::CarPlay => Idiom::CarPlay, + _ => Idiom::Unspecified, + } } } diff --git a/src/platform_impl/ios/ffi.rs b/src/platform_impl/ios/ffi.rs deleted file mode 100644 index 8d2b6f26..00000000 --- a/src/platform_impl/ios/ffi.rs +++ /dev/null @@ -1,76 +0,0 @@ -#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)] - -use icrate::Foundation::{NSInteger, NSUInteger}; -use objc2::encode::{Encode, Encoding}; - -use crate::platform::ios::{Idiom, ScreenEdge}; - -#[repr(transparent)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct UIUserInterfaceIdiom(NSInteger); - -unsafe impl Encode for UIUserInterfaceIdiom { - const ENCODING: Encoding = NSInteger::ENCODING; -} - -impl UIUserInterfaceIdiom { - pub const Unspecified: UIUserInterfaceIdiom = UIUserInterfaceIdiom(-1); - pub const Phone: UIUserInterfaceIdiom = UIUserInterfaceIdiom(0); - pub const Pad: UIUserInterfaceIdiom = UIUserInterfaceIdiom(1); - pub const TV: UIUserInterfaceIdiom = UIUserInterfaceIdiom(2); - pub const CarPlay: UIUserInterfaceIdiom = UIUserInterfaceIdiom(3); -} - -impl From for UIUserInterfaceIdiom { - fn from(idiom: Idiom) -> UIUserInterfaceIdiom { - match idiom { - Idiom::Unspecified => UIUserInterfaceIdiom::Unspecified, - Idiom::Phone => UIUserInterfaceIdiom::Phone, - Idiom::Pad => UIUserInterfaceIdiom::Pad, - Idiom::TV => UIUserInterfaceIdiom::TV, - Idiom::CarPlay => UIUserInterfaceIdiom::CarPlay, - } - } -} -impl From for Idiom { - fn from(ui_idiom: UIUserInterfaceIdiom) -> Idiom { - match ui_idiom { - UIUserInterfaceIdiom::Unspecified => Idiom::Unspecified, - UIUserInterfaceIdiom::Phone => Idiom::Phone, - UIUserInterfaceIdiom::Pad => Idiom::Pad, - UIUserInterfaceIdiom::TV => Idiom::TV, - UIUserInterfaceIdiom::CarPlay => Idiom::CarPlay, - _ => unreachable!(), - } - } -} - -#[repr(transparent)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct UIRectEdge(NSUInteger); - -impl UIRectEdge { - pub(crate) const NONE: Self = Self(0); -} - -unsafe impl Encode for UIRectEdge { - const ENCODING: Encoding = NSUInteger::ENCODING; -} - -impl From for UIRectEdge { - fn from(screen_edge: ScreenEdge) -> UIRectEdge { - assert_eq!( - screen_edge.bits() & !ScreenEdge::ALL.bits(), - 0, - "invalid `ScreenEdge`" - ); - UIRectEdge(screen_edge.bits().into()) - } -} - -impl From for ScreenEdge { - fn from(ui_rect_edge: UIRectEdge) -> ScreenEdge { - let bits: u8 = ui_rect_edge.0.try_into().expect("invalid `UIRectEdge`"); - ScreenEdge::from_bits(bits).expect("invalid `ScreenEdge`") - } -} diff --git a/src/platform_impl/ios/mod.rs b/src/platform_impl/ios/mod.rs index 84edcdba..a6f30e67 100644 --- a/src/platform_impl/ios/mod.rs +++ b/src/platform_impl/ios/mod.rs @@ -4,7 +4,6 @@ mod app_delegate; mod app_state; mod event_loop; -mod ffi; mod monitor; mod uikit; mod view; diff --git a/src/platform_impl/ios/uikit/device.rs b/src/platform_impl/ios/uikit/device.rs index c663d658..5314e7b7 100644 --- a/src/platform_impl/ios/uikit/device.rs +++ b/src/platform_impl/ios/uikit/device.rs @@ -1,9 +1,8 @@ -use icrate::Foundation::{MainThreadMarker, NSObject}; +use icrate::Foundation::{MainThreadMarker, NSInteger, NSObject}; +use objc2::encode::{Encode, Encoding}; use objc2::rc::Id; use objc2::{extern_class, extern_methods, msg_send_id, mutability, ClassType}; -use super::super::ffi::UIUserInterfaceIdiom; - extern_class!( #[derive(Debug, PartialEq, Eq, Hash)] pub(crate) struct UIDevice; @@ -24,3 +23,19 @@ extern_methods!( pub fn userInterfaceIdiom(&self) -> UIUserInterfaceIdiom; } ); + +#[repr(transparent)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct UIUserInterfaceIdiom(NSInteger); + +unsafe impl Encode for UIUserInterfaceIdiom { + const ENCODING: Encoding = NSInteger::ENCODING; +} + +impl UIUserInterfaceIdiom { + pub const Unspecified: UIUserInterfaceIdiom = UIUserInterfaceIdiom(-1); + pub const Phone: UIUserInterfaceIdiom = UIUserInterfaceIdiom(0); + pub const Pad: UIUserInterfaceIdiom = UIUserInterfaceIdiom(1); + pub const TV: UIUserInterfaceIdiom = UIUserInterfaceIdiom(2); + pub const CarPlay: UIUserInterfaceIdiom = UIUserInterfaceIdiom(3); +} diff --git a/src/platform_impl/ios/uikit/geometry.rs b/src/platform_impl/ios/uikit/geometry.rs new file mode 100644 index 00000000..7ad355d6 --- /dev/null +++ b/src/platform_impl/ios/uikit/geometry.rs @@ -0,0 +1,14 @@ +use icrate::Foundation::NSUInteger; +use objc2::encode::{Encode, Encoding}; + +#[repr(transparent)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct UIRectEdge(pub NSUInteger); + +impl UIRectEdge { + pub const NONE: Self = Self(0); +} + +unsafe impl Encode for UIRectEdge { + const ENCODING: Encoding = NSUInteger::ENCODING; +} diff --git a/src/platform_impl/ios/uikit/mod.rs b/src/platform_impl/ios/uikit/mod.rs index 2544901b..3d09180d 100644 --- a/src/platform_impl/ios/uikit/mod.rs +++ b/src/platform_impl/ios/uikit/mod.rs @@ -9,6 +9,7 @@ mod application; mod coordinate_space; mod device; mod event; +mod geometry; mod gesture_recognizer; mod responder; mod screen; @@ -22,8 +23,9 @@ mod window; pub(crate) use self::application::UIApplication; pub(crate) use self::coordinate_space::UICoordinateSpace; -pub(crate) use self::device::UIDevice; +pub(crate) use self::device::{UIDevice, UIUserInterfaceIdiom}; pub(crate) use self::event::UIEvent; +pub(crate) use self::geometry::UIRectEdge; pub(crate) use self::gesture_recognizer::{ UIGestureRecognizer, UIGestureRecognizerState, UIPinchGestureRecognizer, UIRotationGestureRecognizer, UITapGestureRecognizer, diff --git a/src/platform_impl/ios/uikit/status_bar_style.rs b/src/platform_impl/ios/uikit/status_bar_style.rs index e38fd669..775ddb1f 100644 --- a/src/platform_impl/ios/uikit/status_bar_style.rs +++ b/src/platform_impl/ios/uikit/status_bar_style.rs @@ -1,4 +1,3 @@ -use crate::platform::ios::StatusBarStyle; use icrate::Foundation::NSInteger; use objc2::encode::{Encode, Encoding}; @@ -12,16 +11,6 @@ pub enum UIStatusBarStyle { DarkContent = 3, } -impl From for UIStatusBarStyle { - fn from(value: StatusBarStyle) -> Self { - match value { - StatusBarStyle::Default => Self::Default, - StatusBarStyle::LightContent => Self::LightContent, - StatusBarStyle::DarkContent => Self::DarkContent, - } - } -} - unsafe impl Encode for UIStatusBarStyle { const ENCODING: Encoding = NSInteger::ENCODING; } diff --git a/src/platform_impl/ios/view_controller.rs b/src/platform_impl/ios/view_controller.rs index 5a324a49..94fa01d4 100644 --- a/src/platform_impl/ios/view_controller.rs +++ b/src/platform_impl/ios/view_controller.rs @@ -6,13 +6,11 @@ use objc2::{declare_class, msg_send_id, mutability, ClassType, DeclaredClass}; use super::app_state::{self}; use super::uikit::{ - UIDevice, UIInterfaceOrientationMask, UIResponder, UIStatusBarStyle, UIView, UIViewController, -}; -use crate::{ - platform::ios::ValidOrientations, - platform_impl::platform::ffi::{UIRectEdge, UIUserInterfaceIdiom}, - window::WindowAttributes, + UIDevice, UIInterfaceOrientationMask, UIRectEdge, UIResponder, UIStatusBarStyle, + UIUserInterfaceIdiom, UIView, UIViewController, }; +use crate::platform::ios::{ScreenEdge, StatusBarStyle}; +use crate::{platform::ios::ValidOrientations, window::WindowAttributes}; pub struct ViewControllerState { prefers_status_bar_hidden: Cell, @@ -77,7 +75,12 @@ impl WinitViewController { self.setNeedsStatusBarAppearanceUpdate(); } - pub(crate) fn set_preferred_status_bar_style(&self, val: UIStatusBarStyle) { + pub(crate) fn set_preferred_status_bar_style(&self, val: StatusBarStyle) { + let val = match val { + StatusBarStyle::Default => UIStatusBarStyle::Default, + StatusBarStyle::LightContent => UIStatusBarStyle::LightContent, + StatusBarStyle::DarkContent => UIStatusBarStyle::DarkContent, + }; self.ivars().preferred_status_bar_style.set(val); self.setNeedsStatusBarAppearanceUpdate(); } @@ -92,7 +95,15 @@ impl WinitViewController { } } - pub(crate) fn set_preferred_screen_edges_deferring_system_gestures(&self, val: UIRectEdge) { + pub(crate) fn set_preferred_screen_edges_deferring_system_gestures(&self, val: ScreenEdge) { + let val = { + assert_eq!( + val.bits() & !ScreenEdge::ALL.bits(), + 0, + "invalid `ScreenEdge`" + ); + UIRectEdge(val.bits().into()) + }; self.ivars() .preferred_screen_edges_deferring_system_gestures .set(val); @@ -154,8 +165,7 @@ impl WinitViewController { this.set_preferred_status_bar_style( window_attributes .platform_specific - .preferred_status_bar_style - .into(), + .preferred_status_bar_style, ); this.set_supported_interface_orientations( @@ -172,8 +182,7 @@ impl WinitViewController { this.set_preferred_screen_edges_deferring_system_gestures( window_attributes .platform_specific - .preferred_screen_edges_deferring_system_gestures - .into(), + .preferred_screen_edges_deferring_system_gestures, ); this.setView(Some(view)); diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index 67577c0a..1642f2b7 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -628,7 +628,7 @@ impl Inner { pub fn set_preferred_screen_edges_deferring_system_gestures(&self, edges: ScreenEdge) { self.view_controller - .set_preferred_screen_edges_deferring_system_gestures(edges.into()); + .set_preferred_screen_edges_deferring_system_gestures(edges); } pub fn set_prefers_status_bar_hidden(&self, hidden: bool) { @@ -637,7 +637,7 @@ impl Inner { pub fn set_preferred_status_bar_style(&self, status_bar_style: StatusBarStyle) { self.view_controller - .set_preferred_status_bar_style(status_bar_style.into()); + .set_preferred_status_bar_style(status_bar_style); } pub fn recognize_pinch_gesture(&self, should_recognize: bool) {