diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 5d797b034d..c6e24646c5 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -62,6 +62,7 @@ changelog entry. - Implement `Clone`, `Copy`, `Debug`, `Deserialize`, `Eq`, `Hash`, `Ord`, `PartialEq`, `PartialOrd` and `Serialize` on many types. - Add `MonitorHandle::current_video_mode()`. +- Add `WindowId::into_raw()` and `from_raw()`. ### Changed @@ -127,6 +128,8 @@ changelog entry. - Remove `MonitorHandle::size()` and `refresh_rate_millihertz()` in favor of `MonitorHandle::current_video_mode()`. - On Android, remove all `MonitorHandle` support instead of emitting false data. +- Remove `impl From for WindowId` and `impl From for u64`. Replaced with + `WindowId::into_raw()` and `from_raw()`. ### Fixed diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index b3425ea339..d5cc4e9799 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -673,16 +673,12 @@ impl WindowId { pub const fn dummy() -> Self { WindowId } -} -impl From for u64 { - fn from(_: WindowId) -> Self { + pub const fn into_raw(self) -> u64 { 0 } -} -impl From for WindowId { - fn from(_: u64) -> Self { + pub const fn from_raw(_id: u64) -> Self { Self } } diff --git a/src/platform_impl/apple/appkit/window.rs b/src/platform_impl/apple/appkit/window.rs index 06013051e0..96c7aa9434 100644 --- a/src/platform_impl/apple/appkit/window.rs +++ b/src/platform_impl/apple/appkit/window.rs @@ -76,17 +76,13 @@ impl WindowId { pub const fn dummy() -> Self { Self(0) } -} -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.0 as u64 + pub const fn into_raw(self) -> u64 { + self.0 as u64 } -} -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self(raw_id as usize) + pub const fn from_raw(id: u64) -> Self { + Self(id as usize) } } diff --git a/src/platform_impl/apple/uikit/window.rs b/src/platform_impl/apple/uikit/window.rs index d60e79afe5..04eabc7f5a 100644 --- a/src/platform_impl/apple/uikit/window.rs +++ b/src/platform_impl/apple/uikit/window.rs @@ -100,7 +100,7 @@ impl WinitUIWindow { } pub(crate) fn id(&self) -> WindowId { - (self as *const Self as usize as u64).into() + WindowId { window: (self as *const Self as usize) as _ } } } @@ -679,17 +679,13 @@ impl WindowId { pub const fn dummy() -> Self { WindowId { window: std::ptr::null_mut() } } -} -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.window as u64 + pub fn into_raw(self) -> u64 { + self.window as u64 } -} -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self { window: raw_id as _ } + pub const fn from_raw(id: u64) -> Self { + Self { window: id as *mut WinitUIWindow } } } diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs index 9fbc3e8912..8c44336ebe 100644 --- a/src/platform_impl/linux/mod.rs +++ b/src/platform_impl/linux/mod.rs @@ -143,21 +143,17 @@ pub(crate) enum Window { #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct WindowId(u64); -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.0 +impl WindowId { + pub const fn dummy() -> Self { + Self(0) } -} -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self(raw_id) + pub const fn into_raw(self) -> u64 { + self.0 } -} -impl WindowId { - pub const fn dummy() -> Self { - Self(0) + pub const fn from_raw(id: u64) -> Self { + Self(id) } } diff --git a/src/platform_impl/orbital/mod.rs b/src/platform_impl/orbital/mod.rs index 4ba0923cc6..660eb778ed 100644 --- a/src/platform_impl/orbital/mod.rs +++ b/src/platform_impl/orbital/mod.rs @@ -105,17 +105,13 @@ impl WindowId { pub const fn dummy() -> Self { WindowId { fd: u64::MAX } } -} -impl From for u64 { - fn from(id: WindowId) -> Self { - id.fd + pub const fn into_raw(self) -> u64 { + self.fd } -} -impl From for WindowId { - fn from(fd: u64) -> Self { - Self { fd } + pub const fn from_raw(id: u64) -> Self { + Self { fd: id } } } diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index 64c65a34eb..daaae53d4c 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -49,7 +49,7 @@ struct Execution { suspended: Cell, event_loop_recreation: Cell, events: RefCell>, - id: RefCell, + id: Cell, window: web_sys::Window, navigator: Navigator, document: Document, @@ -171,7 +171,7 @@ impl Shared { window, navigator, document, - id: RefCell::new(0), + id: Cell::new(0), all_canvases: RefCell::new(Vec::new()), redraw_pending: RefCell::new(HashSet::new()), destroy_pending: RefCell::new(VecDeque::new()), @@ -438,11 +438,11 @@ impl Shared { // Generate a strictly increasing ID // This is used to differentiate windows when handling events - pub fn generate_id(&self) -> u32 { - let mut id = self.0.id.borrow_mut(); - *id += 1; + pub fn generate_id(&self) -> u64 { + let id = self.0.id.get(); + self.0.id.set(id.checked_add(1).expect("exhausted `WindowId`")); - *id + id } pub fn request_redraw(&self, id: WindowId) { diff --git a/src/platform_impl/web/window.rs b/src/platform_impl/web/window.rs index 77931aa5b8..e4126583b5 100644 --- a/src/platform_impl/web/window.rs +++ b/src/platform_impl/web/window.rs @@ -429,23 +429,19 @@ impl Drop for Inner { } } #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct WindowId(pub(crate) u32); +pub struct WindowId(pub(crate) u64); impl WindowId { pub const fn dummy() -> Self { Self(0) } -} -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.0 as u64 + pub const fn into_raw(self) -> u64 { + self.0 } -} -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self(raw_id as u32) + pub const fn from_raw(id: u64) -> Self { + Self(id) } } diff --git a/src/platform_impl/windows/mod.rs b/src/platform_impl/windows/mod.rs index 93349f7f14..7c4ad16fac 100644 --- a/src/platform_impl/windows/mod.rs +++ b/src/platform_impl/windows/mod.rs @@ -120,11 +120,13 @@ impl WindowId { pub const fn dummy() -> Self { WindowId(0) } -} -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.0 as u64 + pub const fn into_raw(self) -> u64 { + self.0 as u64 + } + + pub const fn from_raw(id: u64) -> Self { + Self(id as HWND) } } @@ -134,12 +136,6 @@ impl From for HWND { } } -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self(raw_id as HWND) - } -} - #[inline(always)] const fn get_xbutton_wparam(x: u32) -> u16 { hiword(x) diff --git a/src/window.rs b/src/window.rs index 7dd7807107..8274989663 100644 --- a/src/window.rs +++ b/src/window.rs @@ -92,23 +92,19 @@ impl WindowId { pub const fn dummy() -> Self { WindowId(platform_impl::WindowId::dummy()) } -} -impl fmt::Debug for WindowId { - fn fmt(&self, fmtr: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(fmtr) + pub fn into_raw(self) -> u64 { + self.0.into_raw() } -} -impl From for u64 { - fn from(window_id: WindowId) -> Self { - window_id.0.into() + pub const fn from_raw(id: u64) -> Self { + Self(platform_impl::WindowId::from_raw(id)) } } -impl From for WindowId { - fn from(raw_id: u64) -> Self { - Self(raw_id.into()) +impl fmt::Debug for WindowId { + fn fmt(&self, fmtr: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(fmtr) } }