Skip to content

Commit

Permalink
utils: implement AsAny only on OpaqueObject
Browse files Browse the repository at this point in the history
Given that `AsAny` was implemented for pretty much anything, it was
really easy to use it on objects that were not really implementing
AsAny.
  • Loading branch information
kchibisov committed Mar 8, 2025
1 parent 5cada36 commit ca013cb
Show file tree
Hide file tree
Showing 22 changed files with 76 additions and 11 deletions.
5 changes: 5 additions & 0 deletions src/platform_impl/android/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use crate::event_loop::{
};
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
use crate::platform::pump_events::PumpStatus;
use crate::utils::OpaqueObject;
use crate::window::{
self, CursorGrabMode, CustomCursor, CustomCursorSource, ImePurpose, ResizeDirection, Theme,
Window as CoreWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
Expand Down Expand Up @@ -738,6 +739,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::AndroidDisplayHandle::new();
Expand Down Expand Up @@ -1007,6 +1010,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

#[derive(Default, Clone, Debug)]
pub struct OsError;

Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/appkit/event_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ use crate::monitor::MonitorHandle as CoreMonitorHandle;
use crate::platform::macos::ActivationPolicy;
use crate::platform::pump_events::PumpStatus;
use crate::platform_impl::Window;
use crate::utils::OpaqueObject;
use crate::window::{CustomCursor as RootCustomCursor, CustomCursorSource, Theme};

#[derive(Default)]
Expand Down Expand Up @@ -165,6 +166,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::RawDisplayHandle::AppKit(rwh_06::AppKitDisplayHandle::new());
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/appkit/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use super::ffi;
use super::util::cgerr;
use crate::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize};
use crate::monitor::{MonitorHandleProvider, VideoMode};
use crate::utils::OpaqueObject;

#[derive(Clone)]
pub struct VideoModeHandle {
Expand Down Expand Up @@ -216,6 +217,8 @@ impl MonitorHandleProvider for MonitorHandle {
}
}

impl OpaqueObject for MonitorHandle {}

// `CGDirectDisplayID` changes on video mode change, so we cannot rely on that
// for comparisons, but we can use `CGDisplayCreateUUIDFromDisplayID` to get an
// unique identifier that persists even across system reboots
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/appkit/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use super::event_loop::ActiveEventLoop;
use super::window_delegate::WindowDelegate;
use crate::error::RequestError;
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
use crate::utils::OpaqueObject;
use crate::window::{
Cursor, Icon, ImePurpose, Theme, UserAttentionType, Window as CoreWindow, WindowAttributes,
WindowButtons, WindowId, WindowLevel,
Expand Down Expand Up @@ -339,6 +340,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

define_class!(
#[unsafe(super(NSWindow, NSResponder, NSObject))]
#[name = "WinitWindow"]
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/uikit/event_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use crate::event_loop::{
};
use crate::monitor::MonitorHandle as CoreMonitorHandle;
use crate::platform_impl::Window;
use crate::utils::OpaqueObject;
use crate::window::{CustomCursor, CustomCursorSource, Theme, Window as CoreWindow};

#[derive(Debug)]
Expand Down Expand Up @@ -103,6 +104,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::RawDisplayHandle::UiKit(rwh_06::UiKitDisplayHandle::new());
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/uikit/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use objc2_ui_kit::{UIScreen, UIScreenMode};

use crate::dpi::PhysicalPosition;
use crate::monitor::{MonitorHandleProvider, VideoMode};
use crate::utils::OpaqueObject;

// Workaround for `MainThreadBound` implementing almost no traits
#[derive(Debug)]
Expand Down Expand Up @@ -130,6 +131,8 @@ impl MonitorHandleProvider for MonitorHandle {
}
}

impl OpaqueObject for MonitorHandle {}

impl Clone for MonitorHandle {
fn clone(&self) -> Self {
run_on_main(|mtm| Self {
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/apple/uikit/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ use crate::event::WindowEvent;
use crate::icon::Icon;
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
use crate::platform::ios::{ScreenEdge, StatusBarStyle, ValidOrientations};
use crate::utils::OpaqueObject;
use crate::window::{
CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType, Window as CoreWindow,
WindowAttributes, WindowButtons, WindowId, WindowLevel,
Expand Down Expand Up @@ -810,6 +811,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

// WindowExtIOS
impl Inner {
pub fn set_scale_factor(&self, scale_factor: f64) {
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/linux/wayland/event_loop/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use crate::monitor::MonitorHandle as CoreMonitorHandle;
use crate::platform::pump_events::PumpStatus;
use crate::platform_impl::platform::min_timeout;
use crate::platform_impl::PlatformCustomCursor;
use crate::utils::OpaqueObject;
use crate::window::{CustomCursor as RootCustomCursor, CustomCursorSource, Theme};

mod proxy;
Expand Down Expand Up @@ -648,6 +649,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl ActiveEventLoop {
fn clear_exit(&self) {
self.exit.set(None)
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/linux/wayland/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use sctk::reexports::client::Proxy;

use crate::dpi::{LogicalPosition, PhysicalPosition};
use crate::monitor::{MonitorHandleProvider as CoreMonitorHandle, VideoMode};
use crate::utils::OpaqueObject;

#[derive(Clone, Debug)]
pub struct MonitorHandle {
Expand Down Expand Up @@ -81,6 +82,8 @@ impl PartialEq for MonitorHandle {

impl Eq for MonitorHandle {}

impl OpaqueObject for MonitorHandle {}

/// Convert the wayland's [`Mode`] to winit's [`VideoMode`].
fn wayland_mode_to_core_mode(mode: Mode) -> VideoMode {
VideoMode {
Expand Down
4 changes: 3 additions & 1 deletion src/platform_impl/linux/wayland/window/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use crate::event::{Ime, WindowEvent};
use crate::event_loop::AsyncRequestSerial;
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
use crate::platform_impl::wayland::output;
use crate::utils::AsAny;
use crate::utils::OpaqueObject;
use crate::window::{
Cursor, CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType,
Window as CoreWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
Expand Down Expand Up @@ -660,6 +660,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

/// The request from the window to the event loop.
#[derive(Debug)]
pub struct WindowRequests {
Expand Down
4 changes: 3 additions & 1 deletion src/platform_impl/linux/x11/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ use crate::platform_impl::common::xkb::Context;
use crate::platform_impl::platform::min_timeout;
use crate::platform_impl::x11::window::Window;
use crate::platform_impl::PlatformCustomCursor;
use crate::utils::Lazy;
use crate::utils::{Lazy, OpaqueObject};
use crate::window::{
CustomCursor as RootCustomCursor, CustomCursorSource, Theme, Window as CoreWindow,
WindowAttributes, WindowId,
Expand Down Expand Up @@ -790,6 +790,8 @@ impl rwh_06::HasDisplayHandle for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

struct DeviceInfo<'a> {
xconn: &'a XConnection,
info: *const ffi::XIDeviceInfo,
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/linux/x11/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use x11rb::protocol::xproto;
use super::{util, X11Error, XConnection};
use crate::dpi::PhysicalPosition;
use crate::monitor::{MonitorHandleProvider, VideoMode};
use crate::utils::OpaqueObject;

// Used for testing. This should always be committed as false.
const DISABLE_MONITOR_LIST_CACHING: bool = false;
Expand Down Expand Up @@ -79,6 +80,8 @@ impl MonitorHandleProvider for MonitorHandle {
}
}

impl OpaqueObject for MonitorHandle {}

impl PartialEq for MonitorHandle {
fn eq(&self, other: &Self) -> bool {
self.id == other.id
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/linux/x11/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ use crate::platform_impl::x11::{
xinput_fp1616_to_float, MonitorHandle as X11MonitorHandle, WakeSender, X11Error,
};
use crate::platform_impl::{common, PlatformCustomCursor, PlatformIcon};
use crate::utils::OpaqueObject;
use crate::window::{
CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType, Window as CoreWindow,
WindowAttributes, WindowButtons, WindowId, WindowLevel,
Expand Down Expand Up @@ -303,6 +304,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

impl rwh_06::HasDisplayHandle for Window {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = self.0.raw_display_handle_rwh_06()?;
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/orbital/event_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ use crate::keyboard::{
PhysicalKey,
};
use crate::platform_impl::Window;
use crate::utils::OpaqueObject;
use crate::window::{
CustomCursor as RootCustomCursor, CustomCursorSource, Theme, Window as CoreWindow, WindowId,
};
Expand Down Expand Up @@ -747,6 +748,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::RawDisplayHandle::Orbital(rwh_06::OrbitalDisplayHandle::new());
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/orbital/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use crate::cursor::Cursor;
use crate::dpi::{PhysicalInsets, PhysicalPosition, PhysicalSize, Position, Size};
use crate::error::{NotSupportedError, RequestError};
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
use crate::utils::OpaqueObject;
use crate::window::{self, ImePurpose, Window as CoreWindow, WindowId};

// These values match the values uses in the `window_new` function in orbital:
Expand Down Expand Up @@ -461,6 +462,8 @@ impl CoreWindow for Window {
}
}

impl OpaqueObject for Window {}

impl rwh_06::HasWindowHandle for Window {
fn window_handle(&self) -> Result<rwh_06::WindowHandle<'_>, rwh_06::HandleError> {
let raw = self.raw_window_handle_rwh_06()?;
Expand Down
13 changes: 8 additions & 5 deletions src/platform_impl/web/event_loop/window_target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ use crate::event_loop::{
EventLoopProxy as RootEventLoopProxy, OwnedDisplayHandle as CoreOwnedDisplayHandle,
};
use crate::keyboard::ModifiersState;
use crate::monitor::MonitorHandle as CoremMonitorHandle;
use crate::monitor::MonitorHandle as CoreMonitorHandle;
use crate::platform::web::{CustomCursorFuture, PollStrategy, WaitUntilStrategy};
use crate::platform_impl::platform::cursor::CustomCursor;
use crate::platform_impl::web::event_loop::proxy::EventLoopProxy;
use crate::platform_impl::Window;
use crate::utils::OpaqueObject;
use crate::window::{CustomCursor as RootCustomCursor, CustomCursorSource, Theme, WindowId};

#[derive(Default, Debug)]
Expand Down Expand Up @@ -502,18 +503,18 @@ impl RootActiveEventLoop for ActiveEventLoop {
Ok(RootCustomCursor { inner: CustomCursor::new(self, source.inner) })
}

fn available_monitors(&self) -> Box<dyn Iterator<Item = CoremMonitorHandle>> {
fn available_monitors(&self) -> Box<dyn Iterator<Item = CoreMonitorHandle>> {
Box::new(
self.runner
.monitor()
.available_monitors()
.into_iter()
.map(|monitor| CoremMonitorHandle(Arc::new(monitor))),
.map(|monitor| CoreMonitorHandle(Arc::new(monitor))),
)
}

fn primary_monitor(&self) -> Option<CoremMonitorHandle> {
self.runner.monitor().primary_monitor().map(|monitor| CoremMonitorHandle(Arc::new(monitor)))
fn primary_monitor(&self) -> Option<CoreMonitorHandle> {
self.runner.monitor().primary_monitor().map(|monitor| CoreMonitorHandle(Arc::new(monitor)))
}

fn listen_device_events(&self, allowed: DeviceEvents) {
Expand Down Expand Up @@ -555,6 +556,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::RawDisplayHandle::Web(rwh_06::WebDisplayHandle::new());
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/web/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ use crate::monitor::{MonitorHandle as CoreMonitorHandle, MonitorHandleProvider,
use crate::platform::web::{
MonitorPermissionError, Orientation, OrientationData, OrientationLock, OrientationLockError,
};
use crate::utils::OpaqueObject;

#[derive(Clone, Eq)]
pub struct MonitorHandle {
Expand Down Expand Up @@ -153,6 +154,8 @@ impl MonitorHandleProvider for MonitorHandle {
}
}

impl OpaqueObject for MonitorHandle {}

impl Debug for MonitorHandle {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let (name, position, scale_factor, orientation, is_internal, is_detailed) =
Expand Down
7 changes: 5 additions & 2 deletions src/platform_impl/web/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ use crate::dpi::{LogicalInsets, PhysicalInsets, PhysicalPosition, PhysicalSize,
use crate::error::{NotSupportedError, RequestError};
use crate::icon::Icon;
use crate::monitor::{Fullscreen, MonitorHandle as CoremMonitorHandle};
use crate::utils::OpaqueObject;
use crate::window::{
Cursor, CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType,
Window as RootWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
Window as CoreWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
};

pub struct Window {
Expand Down Expand Up @@ -99,7 +100,7 @@ impl Window {
}
}

impl RootWindow for Window {
impl CoreWindow for Window {
fn id(&self) -> WindowId {
self.inner.queue(|inner| inner.id)
}
Expand Down Expand Up @@ -421,6 +422,8 @@ impl RootWindow for Window {
}
}

impl OpaqueObject for Window {}

impl rwh_06::HasWindowHandle for Window {
fn window_handle(&self) -> Result<rwh_06::WindowHandle<'_>, rwh_06::HandleError> {
MainThreadMarker::new()
Expand Down
4 changes: 3 additions & 1 deletion src/platform_impl/windows/event_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ use crate::platform_impl::platform::window_state::{
};
use crate::platform_impl::platform::{raw_input, util, wrap_device_id};
use crate::platform_impl::Window;
use crate::utils::Lazy;
use crate::utils::{Lazy, OpaqueObject};
use crate::window::{
CustomCursor as RootCustomCursor, CustomCursorSource, Theme, Window as CoreWindow,
WindowAttributes, WindowId,
Expand Down Expand Up @@ -470,6 +470,8 @@ impl RootActiveEventLoop for ActiveEventLoop {
}
}

impl OpaqueObject for ActiveEventLoop {}

impl rwh_06::HasDisplayHandle for ActiveEventLoop {
fn display_handle(&self) -> Result<rwh_06::DisplayHandle<'_>, rwh_06::HandleError> {
let raw = rwh_06::RawDisplayHandle::Windows(rwh_06::WindowsDisplayHandle::new());
Expand Down
3 changes: 3 additions & 0 deletions src/platform_impl/windows/monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use crate::dpi::{PhysicalPosition, PhysicalSize};
use crate::monitor::{MonitorHandleProvider, VideoMode};
use crate::platform_impl::platform::dpi::{dpi_to_scale_factor, get_monitor_dpi};
use crate::platform_impl::platform::util::has_flag;
use crate::utils::OpaqueObject;

#[derive(Clone)]
pub struct VideoModeHandle {
Expand Down Expand Up @@ -209,3 +210,5 @@ impl MonitorHandleProvider for MonitorHandle {
Box::new(self.video_mode_handles().map(|mode| mode.mode))
}
}

impl OpaqueObject for MonitorHandle {}
Loading

0 comments on commit ca013cb

Please sign in to comment.