From 79fa4061cb43d7096552be20f714333c8da04e3b Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Sat, 3 May 2025 20:21:45 +0900 Subject: [PATCH] winit-core: move event --- src/lib.rs | 4 +-- src/platform_impl/apple/appkit/event.rs | 2 +- src/platform_impl/apple/appkit/view.rs | 2 +- src/platform_impl/orbital/event_loop.rs | 2 +- src/platform_impl/web/event_loop/runner.rs | 10 ++++-- src/platform_impl/web/web_sys/event.rs | 18 +++++------ src/platform_impl/web/web_sys/pointer.rs | 7 ++-- .../windows/event_loop/runner.rs | 2 +- {src => winit-core/src}/event.rs | 32 ++++++++++++------- winit-core/src/event_loop.rs | 2 -- winit-core/src/lib.rs | 1 + 11 files changed, 46 insertions(+), 36 deletions(-) rename {src => winit-core/src}/event.rs (98%) diff --git a/src/lib.rs b/src/lib.rs index 7f4c134c..01c134e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -299,10 +299,8 @@ pub use rwh_06 as raw_window_handle; pub mod application; #[cfg(any(doc, doctest, test))] pub mod changelog; -pub use winit_core::cursor; -pub mod event; pub mod event_loop; -pub use winit_core::{error, icon, keyboard, monitor, window}; +pub use winit_core::{cursor, error, event, icon, keyboard, monitor, window}; #[macro_use] mod os_error; mod platform_impl; diff --git a/src/platform_impl/apple/appkit/event.rs b/src/platform_impl/apple/appkit/event.rs index 3317fa94..0ebcf85d 100644 --- a/src/platform_impl/apple/appkit/event.rs +++ b/src/platform_impl/apple/appkit/event.rs @@ -330,7 +330,7 @@ pub(super) fn event_mods(event: &NSEvent) -> Modifiers { pressed_mods.set(ModifiersKeys::LMETA, flags.contains(NX_DEVICELCMDKEYMASK)); pressed_mods.set(ModifiersKeys::RMETA, flags.contains(NX_DEVICERCMDKEYMASK)); - Modifiers { state, pressed_mods } + Modifiers::new(state, pressed_mods) } pub(super) fn dummy_event() -> Option> { diff --git a/src/platform_impl/apple/appkit/view.rs b/src/platform_impl/apple/appkit/view.rs index b836ec2c..8cb8c881 100644 --- a/src/platform_impl/apple/appkit/view.rs +++ b/src/platform_impl/apple/appkit/view.rs @@ -1096,7 +1096,7 @@ fn mouse_button(event: &NSEvent) -> MouseButton { // we're getting from the operating system, which makes it // impossible to provide such events as extra in `KeyEvent`. fn replace_event(event: &NSEvent, option_as_alt: OptionAsAlt) -> Retained { - let ev_mods = event_mods(event).state; + let ev_mods = event_mods(event).state(); let ignore_alt_characters = match option_as_alt { OptionAsAlt::OnlyLeft if lalt_pressed(event) => true, OptionAsAlt::OnlyRight if ralt_pressed(event) => true, diff --git a/src/platform_impl/orbital/event_loop.rs b/src/platform_impl/orbital/event_loop.rs index 4318061c..c1d527b5 100644 --- a/src/platform_impl/orbital/event_loop.rs +++ b/src/platform_impl/orbital/event_loop.rs @@ -267,7 +267,7 @@ impl EventState { pressed_mods .set(ModifiersKeys::RMETA, self.keyboard.contains(KeyboardModifierState::RMETA)); - Modifiers { state, pressed_mods } + Modifiers::new(state, pressed_mods) } } diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index fb87586f..0145f462 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -24,6 +24,7 @@ use crate::platform::web::{PollStrategy, WaitUntilStrategy}; use crate::platform_impl::platform::backend::{EventListenerHandle, SafeAreaHandle}; use crate::platform_impl::platform::r#async::DispatchRunner; use crate::platform_impl::platform::window::Inner; +use crate::platform_impl::web::web_sys::event::mouse_button_to_id; use crate::window::WindowId; #[derive(Debug)] @@ -325,7 +326,10 @@ impl Shared { runner.send_event(Event::DeviceEvent { device_id, - event: DeviceEvent::Button { button: button.to_id().into(), state }, + event: DeviceEvent::Button { + button: mouse_button_to_id(button).into(), + state, + }, }); return; @@ -374,7 +378,7 @@ impl Shared { runner.send_event(Event::DeviceEvent { device_id: event::mkdid(event.pointer_id()), event: DeviceEvent::Button { - button: button.to_id().into(), + button: mouse_button_to_id(button).into(), state: ElementState::Pressed, }, }); @@ -393,7 +397,7 @@ impl Shared { runner.send_event(Event::DeviceEvent { device_id: event::mkdid(event.pointer_id()), event: DeviceEvent::Button { - button: button.to_id().into(), + button: mouse_button_to_id(button).into(), state: ElementState::Released, }, }); diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index df7c590c..4f2fdda6 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -68,16 +68,14 @@ pub fn mouse_button(event: &MouseEvent) -> Option { } } -impl MouseButton { - pub fn to_id(self) -> u16 { - match self { - MouseButton::Left => 0, - MouseButton::Right => 1, - MouseButton::Middle => 2, - MouseButton::Back => 3, - MouseButton::Forward => 4, - MouseButton::Other(value) => value, - } +pub fn mouse_button_to_id(button: MouseButton) -> u16 { + match button { + MouseButton::Left => 0, + MouseButton::Right => 1, + MouseButton::Middle => 2, + MouseButton::Back => 3, + MouseButton::Forward => 4, + MouseButton::Other(value) => value, } } diff --git a/src/platform_impl/web/web_sys/pointer.rs b/src/platform_impl/web/web_sys/pointer.rs index 7acfc167..ef52a2a4 100644 --- a/src/platform_impl/web/web_sys/pointer.rs +++ b/src/platform_impl/web/web_sys/pointer.rs @@ -10,6 +10,7 @@ use crate::dpi::PhysicalPosition; use crate::event::{ButtonSource, DeviceId, ElementState, Force, PointerKind, PointerSource}; use crate::keyboard::ModifiersState; use crate::platform_impl::web::event::mkdid; +use crate::platform_impl::web::web_sys::event::mouse_button_to_id; #[allow(dead_code)] pub(super) struct PointerHandler { @@ -89,7 +90,7 @@ impl PointerHandler { finger_id, force: Some(Force::Normalized(event.pressure().into())), }, - PointerKind::Unknown => ButtonSource::Unknown(button.to_id()), + PointerKind::Unknown => ButtonSource::Unknown(mouse_button_to_id(button)), }; handler( @@ -142,7 +143,7 @@ impl PointerHandler { finger_id, force: Some(Force::Normalized(event.pressure().into())), }, - PointerKind::Unknown => ButtonSource::Unknown(button.to_id()), + PointerKind::Unknown => ButtonSource::Unknown(mouse_button_to_id(button)), }; handler( @@ -206,7 +207,7 @@ impl PointerHandler { let button = match kind { PointerKind::Mouse => ButtonSource::Mouse(button), PointerKind::Touch(finger_id) => { - let button_id = button.to_id(); + let button_id = mouse_button_to_id(button); if button_id != 1 { tracing::error!("unexpected touch button id: {button_id}"); diff --git a/src/platform_impl/windows/event_loop/runner.rs b/src/platform_impl/windows/event_loop/runner.rs index 2f86701c..9d28059f 100644 --- a/src/platform_impl/windows/event_loop/runner.rs +++ b/src/platform_impl/windows/event_loop/runner.rs @@ -399,7 +399,7 @@ impl Event { } => Event::BufferedScaleFactorChanged( window_id.into_raw() as HWND, scale_factor, - *surface_size_writer.new_surface_size.upgrade().unwrap().lock().unwrap(), + surface_size_writer.surface_size().unwrap(), ), event => event, } diff --git a/src/event.rs b/winit-core/src/event.rs similarity index 98% rename from src/event.rs rename to winit-core/src/event.rs index c92ff1a6..46ca6a53 100644 --- a/src/event.rs +++ b/winit-core/src/event.rs @@ -4,13 +4,13 @@ use std::sync::{Mutex, Weak}; #[cfg(not(web_platform))] use std::time::Instant; +use dpi::{PhysicalPosition, PhysicalSize}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use smol_str::SmolStr; #[cfg(web_platform)] use web_time::Instant; -use crate::dpi::{PhysicalPosition, PhysicalSize}; use crate::error::RequestError; use crate::event_loop::AsyncRequestSerial; use crate::keyboard::{self, ModifiersKeyState, ModifiersKeys, ModifiersState}; @@ -563,16 +563,14 @@ impl DeviceId { /// Convert the [`DeviceId`] into the underlying integer. /// /// This is useful if you need to pass the ID across an FFI boundary, or store it in an atomic. - #[allow(dead_code)] - pub(crate) const fn into_raw(self) -> i64 { + pub const fn into_raw(self) -> i64 { self.0 } /// Construct a [`DeviceId`] from the underlying integer. /// /// This should only be called with integers returned from [`DeviceId::into_raw`]. - #[allow(dead_code)] - pub(crate) const fn from_raw(id: i64) -> Self { + pub const fn from_raw(id: i64) -> Self { Self(id) } } @@ -588,16 +586,14 @@ impl FingerId { /// Convert the [`FingerId`] into the underlying integer. /// /// This is useful if you need to pass the ID across an FFI boundary, or store it in an atomic. - #[allow(dead_code)] - pub(crate) const fn into_raw(self) -> usize { + pub const fn into_raw(self) -> usize { self.0 } /// Construct a [`FingerId`] from the underlying integer. /// /// This should only be called with integers returned from [`FingerId::into_raw`]. - #[allow(dead_code)] - pub(crate) const fn from_raw(id: usize) -> Self { + pub const fn from_raw(id: usize) -> Self { Self(id) } } @@ -832,6 +828,11 @@ pub struct Modifiers { } impl Modifiers { + /// Create a new modifiers from state and pressed mods. + pub fn new(state: ModifiersState, pressed_mods: ModifiersKeys) -> Self { + Self { state, pressed_mods } + } + /// The state of the modifiers. pub fn state(&self) -> ModifiersState { self.state @@ -1092,7 +1093,7 @@ pub struct SurfaceSizeWriter { impl SurfaceSizeWriter { #[cfg(not(orbital_platform))] - pub(crate) fn new(new_surface_size: Weak>>) -> Self { + pub fn new(new_surface_size: Weak>>) -> Self { Self { new_surface_size } } @@ -1108,6 +1109,15 @@ impl SurfaceSizeWriter { Err(RequestError::Ignored) } } + + /// Get the currently stashed surface size. + pub fn surface_size(&self) -> Result, RequestError> { + if let Some(inner) = self.new_surface_size.upgrade() { + Ok(*inner.lock().unwrap()) + } else { + Err(RequestError::Ignored) + } + } } impl PartialEq for SurfaceSizeWriter { @@ -1122,7 +1132,7 @@ impl Eq for SurfaceSizeWriter {} mod tests { use std::collections::{BTreeSet, HashSet}; - use crate::dpi::PhysicalPosition; + use dpi::PhysicalPosition; use crate::event; macro_rules! foreach_event { diff --git a/winit-core/src/event_loop.rs b/winit-core/src/event_loop.rs index 6efd7e8d..0a68d020 100644 --- a/winit-core/src/event_loop.rs +++ b/winit-core/src/event_loop.rs @@ -286,8 +286,6 @@ pub struct AsyncRequestSerial { } impl AsyncRequestSerial { - // TODO(kchibisov): Remove `cfg` when the clipboard will be added. - #[allow(dead_code)] pub fn get() -> Self { static CURRENT_SERIAL: AtomicUsize = AtomicUsize::new(0); // NOTE: We rely on wrap around here, while the user may just request diff --git a/winit-core/src/lib.rs b/winit-core/src/lib.rs index 82e47d98..b8a08af9 100644 --- a/winit-core/src/lib.rs +++ b/winit-core/src/lib.rs @@ -3,6 +3,7 @@ pub mod as_any; pub mod cursor; #[macro_use] pub mod error; +pub mod event; pub mod event_loop; pub mod icon; pub mod keyboard;