From 3392e9c1dee9881a5759f537e5a6d61778726b20 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Sun, 11 Aug 2024 21:24:34 +0300 Subject: [PATCH] chore: use our own AsAny to provide &dyn Any This removes the direct requirement to implement `as_any` and it could be just derived. Also implement HasDisplayHandle for dyn ActiveEventLoop + '_. Suggested-by: daxpedda --- src/event_loop.rs | 16 +++++++++------- src/platform_impl/android/mod.rs | 5 ----- src/platform_impl/apple/appkit/event_loop.rs | 4 ---- src/platform_impl/apple/uikit/event_loop.rs | 5 ----- .../linux/wayland/event_loop/mod.rs | 6 ------ src/platform_impl/linux/x11/mod.rs | 5 ----- src/platform_impl/orbital/event_loop.rs | 5 ----- .../web/event_loop/window_target.rs | 5 ----- src/platform_impl/windows/event_loop.rs | 4 ---- src/utils.rs | 18 ++++++++++++++++++ 10 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/event_loop.rs b/src/event_loop.rs index 4f1947c5..7340f1a6 100644 --- a/src/event_loop.rs +++ b/src/event_loop.rs @@ -8,7 +8,6 @@ //! //! See the root-level documentation for information on how to create and use an event loop to //! handle events. -use std::any::Any; use std::fmt; use std::marker::PhantomData; #[cfg(any(x11_platform, wayland_platform))] @@ -24,6 +23,7 @@ use crate::application::ApplicationHandler; use crate::error::{EventLoopError, ExternalError, OsError}; use crate::monitor::MonitorHandle; use crate::platform_impl; +use crate::utils::AsAny; use crate::window::{CustomCursor, CustomCursorSource, Theme, Window, WindowAttributes}; /// Provides a way to retrieve events from the system and from the windows that were registered to @@ -308,7 +308,7 @@ impl AsRawFd for EventLoop { } } -pub trait ActiveEventLoop { +pub trait ActiveEventLoop: AsAny { /// Creates an [`EventLoopProxy`] that can be used to dispatch user events /// to the main event loop, possibly from another thread. fn create_proxy(&self) -> EventLoopProxy; @@ -403,16 +403,18 @@ pub trait ActiveEventLoop { /// See the [`OwnedDisplayHandle`] type for more information. fn owned_display_handle(&self) -> OwnedDisplayHandle; - /// Get the [`ActiveEventLoop`] as [`Any`]. - /// - /// This is useful for downcasting to a concrete event loop type. - fn as_any(&self) -> &dyn Any; - /// Get the raw-window-handle handle. #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle; } +#[cfg(feature = "rwh_06")] +impl rwh_06::HasDisplayHandle for dyn ActiveEventLoop + '_ { + fn display_handle(&self) -> Result, rwh_06::HandleError> { + self.rwh_06_handle().display_handle() + } +} + /// A proxy for the underlying display handle. /// /// The purpose of this type is to provide a cheaply clonable handle to the underlying diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index 6690f38a..b3425ea3 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::cell::Cell; use std::hash::Hash; use std::num::{NonZeroU16, NonZeroU32}; @@ -640,10 +639,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/apple/appkit/event_loop.rs b/src/platform_impl/apple/appkit/event_loop.rs index 10215dc5..6af45aa0 100644 --- a/src/platform_impl/apple/appkit/event_loop.rs +++ b/src/platform_impl/apple/appkit/event_loop.rs @@ -159,10 +159,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/apple/uikit/event_loop.rs b/src/platform_impl/apple/uikit/event_loop.rs index fd63fac7..54abfe44 100644 --- a/src/platform_impl/apple/uikit/event_loop.rs +++ b/src/platform_impl/apple/uikit/event_loop.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::ffi::{c_char, c_int, c_void}; use std::ptr::{self, NonNull}; use std::sync::atomic::{AtomicBool, Ordering as AtomicOrdering}; @@ -94,10 +93,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/linux/wayland/event_loop/mod.rs b/src/platform_impl/linux/wayland/event_loop/mod.rs index 39a546e7..36b56e82 100644 --- a/src/platform_impl/linux/wayland/event_loop/mod.rs +++ b/src/platform_impl/linux/wayland/event_loop/mod.rs @@ -1,6 +1,5 @@ //! The event-loop routines. -use std::any::Any; use std::cell::{Cell, RefCell}; use std::io::Result as IOResult; use std::mem; @@ -658,11 +657,6 @@ impl RootActiveEventLoop for ActiveEventLoop { } } - #[inline(always)] - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/linux/x11/mod.rs b/src/platform_impl/linux/x11/mod.rs index 247f8f16..c2d3041e 100644 --- a/src/platform_impl/linux/x11/mod.rs +++ b/src/platform_impl/linux/x11/mod.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::cell::{Cell, RefCell}; use std::collections::{HashMap, HashSet, VecDeque}; use std::ffi::CStr; @@ -751,10 +750,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: handle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/orbital/event_loop.rs b/src/platform_impl/orbital/event_loop.rs index 71ee0917..d0c77fcc 100644 --- a/src/platform_impl/orbital/event_loop.rs +++ b/src/platform_impl/orbital/event_loop.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::cell::Cell; use std::collections::VecDeque; use std::sync::{mpsc, Arc, Mutex}; @@ -778,10 +777,6 @@ impl RootActiveEventLoop for ActiveEventLoop { event_loop::OwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index a2b9fc49..878ab03e 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::cell::Cell; use std::clone::Clone; use std::iter; @@ -693,10 +692,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn Any { - self - } - #[cfg(feature = "rwh_06")] fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self diff --git a/src/platform_impl/windows/event_loop.rs b/src/platform_impl/windows/event_loop.rs index 1a6107ef..5a4cadc4 100644 --- a/src/platform_impl/windows/event_loop.rs +++ b/src/platform_impl/windows/event_loop.rs @@ -570,10 +570,6 @@ impl RootActiveEventLoop for ActiveEventLoop { RootOwnedDisplayHandle { platform: OwnedDisplayHandle } } - fn as_any(&self) -> &dyn std::any::Any { - self - } - fn rwh_06_handle(&self) -> &dyn rwh_06::HasDisplayHandle { self } diff --git a/src/utils.rs b/src/utils.rs index d9631edb..d43cc3f8 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -4,6 +4,7 @@ // This isn't used on every platform, which can come up as dead code warnings. #![allow(dead_code)] +use std::any::Any; use std::ops::Deref; use std::sync::OnceLock; @@ -26,3 +27,20 @@ impl Deref for Lazy { self.cell.get_or_init(self.init) } } + +pub trait AsAny { + fn as_any(&self) -> &dyn Any; + fn as_any_mut(&mut self) -> &mut dyn Any; +} + +impl AsAny for T { + #[inline(always)] + fn as_any(&self) -> &dyn Any { + self + } + + #[inline(always)] + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } +}