From 9d5412ffe150792b7c4090aff80a833a24531f3a Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 24 Jun 2024 13:26:49 +0200 Subject: [PATCH] Move iOS and macOS implementations into new `apple` module (#3756) Move iOS and macOS implementations to a shared folder called `apple`, to allow us to reduce the code-duplication between these platforms in the future. The folder structure is now: - `src/platform_impl/apple/` - `appkit/` - `uikit/` - `example_shared_file.rs` - `mod.rs` * Add preliminary support for tvOS, watchOS and visionOS * Reduce duplication in Cargo.toml when specifying dependencies --- .github/CODEOWNERS | 9 +-- Cargo.toml | 57 ++++++++----------- build.rs | 5 +- .../{macos => apple/appkit}/app.rs | 0 .../{macos => apple/appkit}/app_state.rs | 0 .../{macos => apple/appkit}/cursor.rs | 0 .../{macos => apple/appkit}/event.rs | 2 +- .../{macos => apple/appkit}/event_handler.rs | 0 .../{macos => apple/appkit}/event_loop.rs | 2 +- .../{macos => apple/appkit}/ffi.rs | 0 .../{macos => apple/appkit}/menu.rs | 0 .../{macos => apple/appkit}/mod.rs | 0 .../{macos => apple/appkit}/monitor.rs | 0 .../{macos => apple/appkit}/observer.rs | 0 .../{macos => apple/appkit}/util.rs | 3 +- .../{macos => apple/appkit}/view.rs | 0 .../{macos => apple/appkit}/window.rs | 0 .../appkit}/window_delegate.rs | 0 src/platform_impl/apple/mod.rs | 11 ++++ .../{ios => apple/uikit}/app_delegate.rs | 0 .../{ios => apple/uikit}/app_state.rs | 0 .../{ios => apple/uikit}/event_loop.rs | 2 +- src/platform_impl/{ios => apple/uikit}/mod.rs | 0 .../{ios => apple/uikit}/monitor.rs | 2 +- .../{ios => apple/uikit}/view.rs | 2 +- .../{ios => apple/uikit}/view_controller.rs | 0 .../{ios => apple/uikit}/window.rs | 4 +- src/platform_impl/mod.rs | 12 ++-- 28 files changed, 52 insertions(+), 59 deletions(-) rename src/platform_impl/{macos => apple/appkit}/app.rs (100%) rename src/platform_impl/{macos => apple/appkit}/app_state.rs (100%) rename src/platform_impl/{macos => apple/appkit}/cursor.rs (100%) rename src/platform_impl/{macos => apple/appkit}/event.rs (99%) rename src/platform_impl/{macos => apple/appkit}/event_handler.rs (100%) rename src/platform_impl/{macos => apple/appkit}/event_loop.rs (99%) rename src/platform_impl/{macos => apple/appkit}/ffi.rs (100%) rename src/platform_impl/{macos => apple/appkit}/menu.rs (100%) rename src/platform_impl/{macos => apple/appkit}/mod.rs (100%) rename src/platform_impl/{macos => apple/appkit}/monitor.rs (100%) rename src/platform_impl/{macos => apple/appkit}/observer.rs (100%) rename src/platform_impl/{macos => apple/appkit}/util.rs (83%) rename src/platform_impl/{macos => apple/appkit}/view.rs (100%) rename src/platform_impl/{macos => apple/appkit}/window.rs (100%) rename src/platform_impl/{macos => apple/appkit}/window_delegate.rs (100%) create mode 100644 src/platform_impl/apple/mod.rs rename src/platform_impl/{ios => apple/uikit}/app_delegate.rs (100%) rename src/platform_impl/{ios => apple/uikit}/app_state.rs (100%) rename src/platform_impl/{ios => apple/uikit}/event_loop.rs (99%) rename src/platform_impl/{ios => apple/uikit}/mod.rs (100%) rename src/platform_impl/{ios => apple/uikit}/monitor.rs (99%) rename src/platform_impl/{ios => apple/uikit}/view.rs (99%) rename src/platform_impl/{ios => apple/uikit}/view_controller.rs (100%) rename src/platform_impl/{ios => apple/uikit}/window.rs (99%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 89b5752e..18310803 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,9 +2,10 @@ /src/platform/android.rs @MarijnS95 /src/platform_impl/android @MarijnS95 -# iOS +# Apple (AppKit + UIKit) /src/platform/ios.rs @madsmtm -/src/platform_impl/ios @madsmtm +/src/platform/macos.rs @madsmtm +/src/platform_impl/apple @madsmtm # Unix /src/platform_impl/linux/mod.rs @kchibisov @@ -17,10 +18,6 @@ /src/platform/x11.rs @kchibisov @notgull /src/platform_impl/linux/x11 @kchibisov @notgull -# macOS -/src/platform/macos.rs @madsmtm -/src/platform_impl/macos @madsmtm - # Web /src/platform/web.rs @daxpedda /src/platform_impl/web @daxpedda diff --git a/Cargo.toml b/Cargo.toml index 22c5ebef..4302edf6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -102,21 +102,21 @@ softbuffer = { version = "0.4.0", default-features = false, features = [ "wayland-dlopen", ] } +# Android [target.'cfg(target_os = "android")'.dependencies] android-activity = "0.6.0" ndk = { version = "0.9.0", default-features = false } -[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies] +# AppKit or UIKit +[target.'cfg(target_vendor = "apple")'.dependencies] core-foundation = "0.9.3" objc2 = "0.5.2" +# AppKit [target.'cfg(target_os = "macos")'.dependencies] core-graphics = "0.23.1" block2 = "0.5.1" - -[target.'cfg(target_os = "macos")'.dependencies.objc2-foundation] -version = "0.2.2" -features = [ +objc2-foundation = { version = "0.2.2", features = [ "block2", "dispatch", "NSArray", @@ -134,11 +134,8 @@ features = [ "NSString", "NSThread", "NSValue", -] - -[target.'cfg(target_os = "macos")'.dependencies.objc2-app-kit] -version = "0.2.2" -features = [ +] } +objc2-app-kit = { version = "0.2.2", features = [ "NSAppearance", "NSApplication", "NSBitmapImageRep", @@ -165,11 +162,11 @@ features = [ "NSWindow", "NSWindowScripting", "NSWindowTabGroup", -] +] } -[target.'cfg(target_os = "ios")'.dependencies.objc2-foundation] -version = "0.2.2" -features = [ +# UIKit +[target.'cfg(all(target_vendor = "apple", not(target_os = "macos")))'.dependencies] +objc2-foundation = { version = "0.2.2", features = [ "dispatch", "NSArray", "NSEnumerator", @@ -179,11 +176,8 @@ features = [ "NSProcessInfo", "NSThread", "NSSet", -] - -[target.'cfg(target_os = "ios")'.dependencies.objc2-ui-kit] -version = "0.2.2" -features = [ +] } +objc2-ui-kit = { version = "0.2.2", features = [ "UIApplication", "UIDevice", "UIEvent", @@ -202,14 +196,12 @@ features = [ "UIView", "UIViewController", "UIWindow", -] +] } +# Windows [target.'cfg(target_os = "windows")'.dependencies] unicode-segmentation = "1.7.1" - -[target.'cfg(target_os = "windows")'.dependencies.windows-sys] -version = "0.52.0" -features = [ +windows-sys = { version = "0.52.0", features = [ "Win32_Devices_HumanInterfaceDevice", "Win32_Foundation", "Win32_Globalization", @@ -234,9 +226,10 @@ features = [ "Win32_UI_Shell", "Win32_UI_TextServices", "Win32_UI_WindowsAndMessaging", -] +] } -[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_os = "ios", target_os = "macos"))))'.dependencies] +# Linux +[target.'cfg(all(unix, not(any(target_os = "redox", target_family = "wasm", target_os = "android", target_vendor = "apple"))))'.dependencies] ahash = { version = "0.8.7", features = ["no-rng"], optional = true } bytemuck = { version = "1.13.1", default-features = false, optional = true } calloop = "0.12.3" @@ -274,14 +267,14 @@ x11rb = { version = "0.13.0", default-features = false, features = [ ], optional = true } xkbcommon-dl = "0.4.2" +# Orbital [target.'cfg(target_os = "redox")'.dependencies] orbclient = { version = "0.3.47", default-features = false } redox_syscall = "0.4.1" -[target.'cfg(target_family = "wasm")'.dependencies.web_sys] -package = "web-sys" -version = "0.3.64" -features = [ +# Web +[target.'cfg(target_family = "wasm")'.dependencies] +web_sys = { package = "web-sys", version = "0.3.64", features = [ 'AbortController', 'AbortSignal', 'Blob', @@ -323,9 +316,7 @@ features = [ 'WheelEvent', 'Worker', 'Url', -] - -[target.'cfg(target_family = "wasm")'.dependencies] +] } js-sys = "0.3.64" pin-project = "1" wasm-bindgen = "0.2" diff --git a/build.rs b/build.rs index 6a4528b3..1105d584 100644 --- a/build.rs +++ b/build.rs @@ -10,10 +10,9 @@ fn main() { android_platform: { target_os = "android" }, web_platform: { all(target_family = "wasm", target_os = "unknown") }, macos_platform: { target_os = "macos" }, - ios_platform: { target_os = "ios" }, + ios_platform: { all(target_vendor = "apple", not(target_os = "macos")) }, windows_platform: { target_os = "windows" }, - apple: { any(target_os = "ios", target_os = "macos") }, - free_unix: { all(unix, not(apple), not(android_platform), not(target_os = "emscripten")) }, + free_unix: { all(unix, not(target_vendor = "apple"), not(android_platform), not(target_os = "emscripten")) }, redox: { target_os = "redox" }, // Native displays. diff --git a/src/platform_impl/macos/app.rs b/src/platform_impl/apple/appkit/app.rs similarity index 100% rename from src/platform_impl/macos/app.rs rename to src/platform_impl/apple/appkit/app.rs diff --git a/src/platform_impl/macos/app_state.rs b/src/platform_impl/apple/appkit/app_state.rs similarity index 100% rename from src/platform_impl/macos/app_state.rs rename to src/platform_impl/apple/appkit/app_state.rs diff --git a/src/platform_impl/macos/cursor.rs b/src/platform_impl/apple/appkit/cursor.rs similarity index 100% rename from src/platform_impl/macos/cursor.rs rename to src/platform_impl/apple/appkit/cursor.rs diff --git a/src/platform_impl/macos/event.rs b/src/platform_impl/apple/appkit/event.rs similarity index 99% rename from src/platform_impl/macos/event.rs rename to src/platform_impl/apple/appkit/event.rs index 602ab627..f71111b6 100644 --- a/src/platform_impl/macos/event.rs +++ b/src/platform_impl/apple/appkit/event.rs @@ -7,12 +7,12 @@ use objc2_app_kit::{NSEvent, NSEventModifierFlags, NSEventSubtype, NSEventType}; use objc2_foundation::{run_on_main, NSPoint}; use smol_str::SmolStr; +use super::ffi; use crate::event::{ElementState, KeyEvent, Modifiers}; use crate::keyboard::{ Key, KeyCode, KeyLocation, ModifiersKeys, ModifiersState, NamedKey, NativeKey, NativeKeyCode, PhysicalKey, }; -use crate::platform_impl::platform::ffi; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct KeyEventExtra { diff --git a/src/platform_impl/macos/event_handler.rs b/src/platform_impl/apple/appkit/event_handler.rs similarity index 100% rename from src/platform_impl/macos/event_handler.rs rename to src/platform_impl/apple/appkit/event_handler.rs diff --git a/src/platform_impl/macos/event_loop.rs b/src/platform_impl/apple/appkit/event_loop.rs similarity index 99% rename from src/platform_impl/macos/event_loop.rs rename to src/platform_impl/apple/appkit/event_loop.rs index 48de1cc9..2d35bb4f 100644 --- a/src/platform_impl/macos/event_loop.rs +++ b/src/platform_impl/apple/appkit/event_loop.rs @@ -23,6 +23,7 @@ use objc2_foundation::{MainThreadMarker, NSObjectProtocol}; use super::app::WinitApplication; use super::app_state::ApplicationDelegate; +use super::cursor::CustomCursor; use super::event::dummy_event; use super::monitor::{self, MonitorHandle}; use super::observer::setup_control_flow_observers; @@ -31,7 +32,6 @@ use crate::error::EventLoopError; use crate::event_loop::{ActiveEventLoop as RootWindowTarget, ControlFlow, DeviceEvents}; use crate::platform::macos::ActivationPolicy; use crate::platform::pump_events::PumpStatus; -use crate::platform_impl::platform::cursor::CustomCursor; use crate::window::{CustomCursor as RootCustomCursor, CustomCursorSource}; #[derive(Default)] diff --git a/src/platform_impl/macos/ffi.rs b/src/platform_impl/apple/appkit/ffi.rs similarity index 100% rename from src/platform_impl/macos/ffi.rs rename to src/platform_impl/apple/appkit/ffi.rs diff --git a/src/platform_impl/macos/menu.rs b/src/platform_impl/apple/appkit/menu.rs similarity index 100% rename from src/platform_impl/macos/menu.rs rename to src/platform_impl/apple/appkit/menu.rs diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/apple/appkit/mod.rs similarity index 100% rename from src/platform_impl/macos/mod.rs rename to src/platform_impl/apple/appkit/mod.rs diff --git a/src/platform_impl/macos/monitor.rs b/src/platform_impl/apple/appkit/monitor.rs similarity index 100% rename from src/platform_impl/macos/monitor.rs rename to src/platform_impl/apple/appkit/monitor.rs diff --git a/src/platform_impl/macos/observer.rs b/src/platform_impl/apple/appkit/observer.rs similarity index 100% rename from src/platform_impl/macos/observer.rs rename to src/platform_impl/apple/appkit/observer.rs diff --git a/src/platform_impl/macos/util.rs b/src/platform_impl/apple/appkit/util.rs similarity index 83% rename from src/platform_impl/macos/util.rs rename to src/platform_impl/apple/appkit/util.rs index 8110573a..ae78b532 100644 --- a/src/platform_impl/macos/util.rs +++ b/src/platform_impl/apple/appkit/util.rs @@ -2,7 +2,8 @@ use tracing::trace; macro_rules! trace_scope { ($s:literal) => { - let _crate = $crate::platform_impl::platform::util::TraceGuard::new(module_path!(), $s); + let _crate = + $crate::platform_impl::platform::appkit::util::TraceGuard::new(module_path!(), $s); }; } diff --git a/src/platform_impl/macos/view.rs b/src/platform_impl/apple/appkit/view.rs similarity index 100% rename from src/platform_impl/macos/view.rs rename to src/platform_impl/apple/appkit/view.rs diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/apple/appkit/window.rs similarity index 100% rename from src/platform_impl/macos/window.rs rename to src/platform_impl/apple/appkit/window.rs diff --git a/src/platform_impl/macos/window_delegate.rs b/src/platform_impl/apple/appkit/window_delegate.rs similarity index 100% rename from src/platform_impl/macos/window_delegate.rs rename to src/platform_impl/apple/appkit/window_delegate.rs diff --git a/src/platform_impl/apple/mod.rs b/src/platform_impl/apple/mod.rs new file mode 100644 index 00000000..807aa61d --- /dev/null +++ b/src/platform_impl/apple/mod.rs @@ -0,0 +1,11 @@ +//! Apple/Darwin-specific implementations + +#[cfg(target_os = "macos")] +mod appkit; +#[cfg(not(target_os = "macos"))] +mod uikit; + +#[cfg(target_os = "macos")] +pub use self::appkit::*; +#[cfg(not(target_os = "macos"))] +pub use self::uikit::*; diff --git a/src/platform_impl/ios/app_delegate.rs b/src/platform_impl/apple/uikit/app_delegate.rs similarity index 100% rename from src/platform_impl/ios/app_delegate.rs rename to src/platform_impl/apple/uikit/app_delegate.rs diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/apple/uikit/app_state.rs similarity index 100% rename from src/platform_impl/ios/app_state.rs rename to src/platform_impl/apple/uikit/app_state.rs diff --git a/src/platform_impl/ios/event_loop.rs b/src/platform_impl/apple/uikit/event_loop.rs similarity index 99% rename from src/platform_impl/ios/event_loop.rs rename to src/platform_impl/apple/uikit/event_loop.rs index 828087a2..59e6fa83 100644 --- a/src/platform_impl/ios/event_loop.rs +++ b/src/platform_impl/apple/uikit/event_loop.rs @@ -17,12 +17,12 @@ use objc2::{msg_send_id, ClassType}; use objc2_foundation::{MainThreadMarker, NSString}; use objc2_ui_kit::{UIApplication, UIApplicationMain, UIDevice, UIScreen, UIUserInterfaceIdiom}; +use super::app_state::EventLoopHandler; use crate::application::ApplicationHandler; use crate::error::EventLoopError; use crate::event::Event; use crate::event_loop::{ActiveEventLoop as RootActiveEventLoop, ControlFlow, DeviceEvents}; use crate::platform::ios::Idiom; -use crate::platform_impl::platform::app_state::EventLoopHandler; use crate::window::{CustomCursor, CustomCursorSource}; use super::app_delegate::AppDelegate; diff --git a/src/platform_impl/ios/mod.rs b/src/platform_impl/apple/uikit/mod.rs similarity index 100% rename from src/platform_impl/ios/mod.rs rename to src/platform_impl/apple/uikit/mod.rs diff --git a/src/platform_impl/ios/monitor.rs b/src/platform_impl/apple/uikit/monitor.rs similarity index 99% rename from src/platform_impl/ios/monitor.rs rename to src/platform_impl/apple/uikit/monitor.rs index 1c707a3a..1871ffb1 100644 --- a/src/platform_impl/ios/monitor.rs +++ b/src/platform_impl/apple/uikit/monitor.rs @@ -9,9 +9,9 @@ use objc2::Message; use objc2_foundation::{run_on_main, MainThreadBound, MainThreadMarker, NSInteger}; use objc2_ui_kit::{UIScreen, UIScreenMode}; +use super::app_state; use crate::dpi::{PhysicalPosition, PhysicalSize}; use crate::monitor::VideoModeHandle as RootVideoModeHandle; -use crate::platform_impl::platform::app_state; // Workaround for `MainThreadBound` implementing almost no traits #[derive(Debug)] diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/apple/uikit/view.rs similarity index 99% rename from src/platform_impl/ios/view.rs rename to src/platform_impl/apple/uikit/view.rs index 75386d36..0c7fd39c 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/apple/uikit/view.rs @@ -14,9 +14,9 @@ use objc2_ui_kit::{ use super::app_state::{self, EventWrapper}; use super::window::WinitUIWindow; +use super::DEVICE_ID; use crate::dpi::PhysicalPosition; use crate::event::{Event, Force, Touch, TouchPhase, WindowEvent}; -use crate::platform_impl::platform::DEVICE_ID; use crate::window::{WindowAttributes, WindowId as RootWindowId}; pub struct WinitViewState { diff --git a/src/platform_impl/ios/view_controller.rs b/src/platform_impl/apple/uikit/view_controller.rs similarity index 100% rename from src/platform_impl/ios/view_controller.rs rename to src/platform_impl/apple/uikit/view_controller.rs diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/apple/uikit/window.rs similarity index 99% rename from src/platform_impl/ios/window.rs rename to src/platform_impl/apple/uikit/window.rs index 8ea7aeae..1f95c9b4 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/apple/uikit/window.rs @@ -17,15 +17,13 @@ use tracing::{debug, warn}; use super::app_state::EventWrapper; use super::view::WinitView; use super::view_controller::WinitViewController; +use super::{app_state, monitor, ActiveEventLoop, Fullscreen, MonitorHandle}; use crate::cursor::Cursor; use crate::dpi::{LogicalPosition, LogicalSize, PhysicalPosition, PhysicalSize, Position, Size}; use crate::error::{ExternalError, NotSupportedError, OsError as RootOsError}; use crate::event::{Event, WindowEvent}; use crate::icon::Icon; use crate::platform::ios::{ScreenEdge, StatusBarStyle, ValidOrientations}; -use crate::platform_impl::platform::{ - app_state, monitor, ActiveEventLoop, Fullscreen, MonitorHandle, -}; use crate::window::{ CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType, WindowAttributes, WindowButtons, WindowId as RootWindowId, WindowLevel, diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs index 3bfce688..1f3a0b77 100644 --- a/src/platform_impl/mod.rs +++ b/src/platform_impl/mod.rs @@ -3,12 +3,10 @@ use crate::window::Fullscreen as RootFullscreen; #[cfg(android_platform)] mod android; -#[cfg(ios_platform)] -mod ios; +#[cfg(target_vendor = "apple")] +mod apple; #[cfg(any(x11_platform, wayland_platform))] mod linux; -#[cfg(macos_platform)] -mod macos; #[cfg(orbital_platform)] mod orbital; #[cfg(web_platform)] @@ -18,12 +16,10 @@ mod windows; #[cfg(android_platform)] use android as platform; -#[cfg(ios_platform)] -use ios as platform; +#[cfg(target_vendor = "apple")] +use apple as platform; #[cfg(any(x11_platform, wayland_platform))] use linux as platform; -#[cfg(macos_platform)] -use macos as platform; #[cfg(orbital_platform)] use orbital as platform; #[cfg(web_platform)]