From 47b938dbe78702d521c2c7a43b6f741a3bb8cb0b Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Wed, 21 May 2025 13:12:55 +0200 Subject: [PATCH] Split Orbital backend out into `winit-orbital` (#4243) --- .github/CODEOWNERS | 3 +-- .github/workflows/ci.yml | 4 +++ Cargo.toml | 7 +++-- src/platform/mod.rs | 2 +- src/platform/orbital.rs | 6 ----- src/platform_impl/mod.rs | 4 +-- winit-orbital/Cargo.toml | 25 ++++++++++++++++++ winit-orbital/README.md | 1 + .../src}/event_loop.rs | 9 ++++--- .../mod.rs => winit-orbital/src/lib.rs | 26 ++++++++++--------- .../orbital => winit-orbital/src}/window.rs | 7 +++-- 11 files changed, 61 insertions(+), 33 deletions(-) delete mode 100644 src/platform/orbital.rs create mode 100644 winit-orbital/Cargo.toml create mode 120000 winit-orbital/README.md rename {src/platform_impl/orbital => winit-orbital/src}/event_loop.rs (99%) rename src/platform_impl/orbital/mod.rs => winit-orbital/src/lib.rs (88%) rename {src/platform_impl/orbital => winit-orbital/src}/window.rs (98%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 183108038..9dd79de06 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,5 +27,4 @@ /src/platform_impl/windows @notgull # Orbital (Redox OS) -/src/platform/orbital.rs @jackpot51 -/src/platform_impl/orbital @jackpot51 +/winit-orbital @jackpot51 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c7eb10c10..f0190bf52 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -182,6 +182,10 @@ jobs: - name: Test winit core run: cargo test -p winit-core + - name: Test winit Orbital + if: contains(matrix.platform.target, 'redox') + run: cargo test -p winit-orbital + # Test only on Linux x86_64, so we avoid spending unnecessary CI hours. - name: Test dpi crate if: > diff --git a/Cargo.toml b/Cargo.toml index ba405f358..458cf4155 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["dpi", "winit-core"] +members = ["dpi", "winit-core", "winit-orbital"] resolver = "2" [workspace.package] @@ -13,6 +13,7 @@ rust-version = "1.80" # `winit` has no version here to allow using it in dev deps for docs. winit = { path = "." } winit-core = { version = "0.0.0", path = "winit-core" } +winit-orbital = { version = "0.0.0", path = "winit-orbital" } # Core dependencies. bitflags = "2" @@ -397,10 +398,8 @@ x11rb = { workspace = true, optional = true, features = [ ] } xkbcommon-dl.workspace = true -# Orbital [target.'cfg(target_os = "redox")'.dependencies] -orbclient.workspace = true -redox_syscall.workspace = true +winit-orbital.workspace = true # Web [target.'cfg(target_family = "wasm")'.dependencies] diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 5d0ca942e..f2f5159ef 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -9,7 +9,7 @@ pub mod ios; #[cfg(macos_platform)] pub mod macos; #[cfg(orbital_platform)] -pub mod orbital; +pub use winit_orbital as orbital; #[cfg(any(x11_platform, wayland_platform))] pub mod startup_notify; #[cfg(wayland_platform)] diff --git a/src/platform/orbital.rs b/src/platform/orbital.rs deleted file mode 100644 index d80935038..000000000 --- a/src/platform/orbital.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! # Orbital / Redox OS -//! -//! Redox OS has some functionality not yet present that will be implemented -//! when its orbital display server provides it. - -// There are no Orbital specific traits yet. diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs index 9ce2fa6f0..1242021e4 100644 --- a/src/platform_impl/mod.rs +++ b/src/platform_impl/mod.rs @@ -5,7 +5,7 @@ mod apple; #[cfg(any(x11_platform, wayland_platform))] mod linux; #[cfg(orbital_platform)] -mod orbital; +pub(crate) use winit_orbital as platform; #[cfg(web_platform)] mod web; #[cfg(windows_platform)] @@ -17,8 +17,6 @@ use self::android as platform; use self::apple as platform; #[cfg(any(x11_platform, wayland_platform))] use self::linux as platform; -#[cfg(orbital_platform)] -use self::orbital as platform; #[allow(unused_imports)] pub use self::platform::*; #[cfg(web_platform)] diff --git a/winit-orbital/Cargo.toml b/winit-orbital/Cargo.toml new file mode 100644 index 000000000..e4004fe2b --- /dev/null +++ b/winit-orbital/Cargo.toml @@ -0,0 +1,25 @@ +[package] +description = "Winit's Orbital/Redox backend" +documentation = "https://docs.rs/winit-orbital" +edition.workspace = true +license.workspace = true +name = "winit-orbital" +repository.workspace = true +rust-version.workspace = true +version = "0.0.0" + +[features] +serde = ["dep:serde", "bitflags/serde", "smol_str/serde", "dpi/serde"] + +[dependencies] +bitflags.workspace = true +dpi.workspace = true +rwh_06.workspace = true +serde = { workspace = true, optional = true } +smol_str.workspace = true +tracing.workspace = true +winit-core.workspace = true + +# Platform-specific +orbclient.workspace = true +redox_syscall.workspace = true diff --git a/winit-orbital/README.md b/winit-orbital/README.md new file mode 120000 index 000000000..32d46ee88 --- /dev/null +++ b/winit-orbital/README.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/src/platform_impl/orbital/event_loop.rs b/winit-orbital/src/event_loop.rs similarity index 99% rename from src/platform_impl/orbital/event_loop.rs rename to winit-orbital/src/event_loop.rs index 22b958add..595f4cdf3 100644 --- a/src/platform_impl/orbital/event_loop.rs +++ b/winit-orbital/src/event_loop.rs @@ -25,8 +25,8 @@ use winit_core::keyboard::{ }; use winit_core::window::{Theme, Window as CoreWindow, WindowId}; -use super::{PlatformSpecificEventLoopAttributes, RedoxSocket, TimeSocket, WindowProperties}; -use crate::platform_impl::Window; +use crate::window::Window; +use crate::{RedoxSocket, TimeSocket, WindowProperties}; fn convert_scancode(scancode: u8) -> (PhysicalKey, Option) { // Key constants from https://docs.rs/orbclient/latest/orbclient/event/index.html @@ -279,7 +279,7 @@ pub struct EventLoop { } impl EventLoop { - pub(crate) fn new(_: &PlatformSpecificEventLoopAttributes) -> Result { + pub fn new(_: &PlatformSpecificEventLoopAttributes) -> Result { // NOTE: Create a channel which can hold only one event to automatically _squash_ user // events. let (user_events_sender, user_events_receiver) = mpsc::sync_channel(1); @@ -757,3 +757,6 @@ impl rwh_06::HasDisplayHandle for OwnedDisplayHandle { unsafe { Ok(rwh_06::DisplayHandle::borrow_raw(raw)) } } } + +#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct PlatformSpecificEventLoopAttributes {} diff --git a/src/platform_impl/orbital/mod.rs b/winit-orbital/src/lib.rs similarity index 88% rename from src/platform_impl/orbital/mod.rs rename to winit-orbital/src/lib.rs index a1d771e39..c51326865 100644 --- a/src/platform_impl/orbital/mod.rs +++ b/winit-orbital/src/lib.rs @@ -1,12 +1,20 @@ -#![cfg(target_os = "redox")] +//! # Orbital / Redox OS +//! +//! Redox OS has some functionality not yet present that will be implemented +//! when its orbital display server provides it. use std::{fmt, str}; -pub(crate) use self::event_loop::{ActiveEventLoop, EventLoop}; -pub use self::window::Window; +pub use self::event_loop::{EventLoop, PlatformSpecificEventLoopAttributes}; -mod event_loop; -mod window; +macro_rules! os_error { + ($error:expr) => {{ + winit_core::error::OsError::new(line!(), file!(), $error) + }}; +} + +pub mod event_loop; +pub mod window; #[derive(Debug)] struct RedoxSocket { @@ -62,7 +70,7 @@ impl Drop for RedoxSocket { } #[derive(Debug)] -pub struct TimeSocket(RedoxSocket); +struct TimeSocket(RedoxSocket); impl TimeSocket { fn open() -> syscall::Result { @@ -88,12 +96,6 @@ impl TimeSocket { } } -#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub(crate) struct PlatformSpecificEventLoopAttributes {} - -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] -pub struct PlatformSpecificWindowAttributes; - struct WindowProperties<'a> { flags: &'a str, x: i32, diff --git a/src/platform_impl/orbital/window.rs b/winit-orbital/src/window.rs similarity index 98% rename from src/platform_impl/orbital/window.rs rename to winit-orbital/src/window.rs index 082c47774..3452f00cc 100644 --- a/src/platform_impl/orbital/window.rs +++ b/winit-orbital/src/window.rs @@ -8,8 +8,8 @@ use winit_core::error::{NotSupportedError, RequestError}; use winit_core::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle}; use winit_core::window::{self, ImePurpose, Window as CoreWindow, WindowId}; -use super::event_loop::EventLoopProxy; -use super::{ActiveEventLoop, RedoxSocket, WindowProperties}; +use crate::event_loop::{ActiveEventLoop, EventLoopProxy}; +use crate::{RedoxSocket, WindowProperties}; // These values match the values uses in the `window_new` function in orbital: // https://gitlab.redox-os.org/redox-os/orbital/-/blob/master/src/scheme.rs @@ -486,3 +486,6 @@ impl Drop for Window { self.event_loop_proxy.wake_socket.wake().unwrap(); } } + +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +pub struct PlatformSpecificWindowAttributes;