From 352e70b8acfcc16f0fb3e059403791c93f79a7b2 Mon Sep 17 00:00:00 2001 From: James Liu Date: Sun, 25 Feb 2024 08:19:27 -0800 Subject: [PATCH] m: Remove once_cell dependency Removes the once_cell dependency, instead using std::sync::OnceLock and a minimal polyfill for std::sync::LazyLock, which may be stabilized soon (see rust-lang/rust#121377). This should not require a bump in MSRV, as OnceLock was stabilized in 1.70, which this crate is using. --- Cargo.toml | 1 - src/lib.rs | 1 + src/platform_impl/android/mod.rs | 2 +- src/platform_impl/ios/app_state.rs | 2 +- src/platform_impl/linux/common/xkb/mod.rs | 2 +- src/platform_impl/linux/mod.rs | 2 +- .../linux/x11/ime/input_method.rs | 2 +- src/platform_impl/linux/x11/util/wm.rs | 2 +- src/platform_impl/macos/cursor.rs | 2 +- src/platform_impl/windows/dark_mode.rs | 2 +- src/platform_impl/windows/event_loop.rs | 8 ++--- src/platform_impl/windows/keyboard_layout.rs | 2 +- src/platform_impl/windows/util.rs | 26 ++++++++-------- src/utils.rs | 30 +++++++++++++++++++ 14 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 src/utils.rs diff --git a/Cargo.toml b/Cargo.toml index d6170f23..f59ec09d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,7 +67,6 @@ bitflags = "2" cursor-icon = "1.1.0" log = "0.4" mint = { version = "0.5.6", optional = true } -once_cell = "1.12" rwh_04 = { package = "raw-window-handle", version = "0.4", optional = true } rwh_05 = { package = "raw-window-handle", version = "0.5.2", features = ["std"], optional = true } rwh_06 = { package = "raw-window-handle", version = "0.6", features = ["std"], optional = true } diff --git a/src/lib.rs b/src/lib.rs index dda10d2c..8238146f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -187,6 +187,7 @@ mod icon; pub mod keyboard; pub mod monitor; mod platform_impl; +mod utils; pub mod window; pub mod platform; diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index f974c1d2..8992c63b 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -12,12 +12,12 @@ use std::{ time::{Duration, Instant}, }; +use crate::utils::Lazy; use android_activity::input::{InputEvent, KeyAction, Keycode, MotionAction}; use android_activity::{ AndroidApp, AndroidAppWaker, ConfigurationRef, InputStatus, MainEvent, Rect, }; use log::{debug, trace, warn}; -use once_cell::sync::Lazy; use crate::{ cursor::Cursor, diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index d0105dd8..beef5a1d 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -10,6 +10,7 @@ use std::{ time::Instant, }; +use crate::utils::Lazy; use core_foundation::base::CFRelease; use core_foundation::date::CFAbsoluteTimeGetCurrent; use core_foundation::runloop::{ @@ -22,7 +23,6 @@ use icrate::Foundation::{ use objc2::rc::Id; use objc2::runtime::AnyObject; use objc2::{msg_send, sel}; -use once_cell::sync::Lazy; use super::uikit::UIView; use super::window::WinitUIWindow; diff --git a/src/platform_impl/linux/common/xkb/mod.rs b/src/platform_impl/linux/common/xkb/mod.rs index a861b5d6..bb9ba0f8 100644 --- a/src/platform_impl/linux/common/xkb/mod.rs +++ b/src/platform_impl/linux/common/xkb/mod.rs @@ -3,8 +3,8 @@ use std::os::raw::c_char; use std::ptr::{self, NonNull}; use std::sync::atomic::{AtomicBool, Ordering}; +use crate::utils::Lazy; use log::warn; -use once_cell::sync::Lazy; use smol_str::SmolStr; #[cfg(wayland_platform)] use std::os::unix::io::OwnedFd; diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs index becaadd2..84ff9ef5 100644 --- a/src/platform_impl/linux/mod.rs +++ b/src/platform_impl/linux/mod.rs @@ -11,7 +11,7 @@ use std::{collections::VecDeque, env, fmt}; use std::{ffi::CStr, mem::MaybeUninit, os::raw::*, sync::Mutex}; #[cfg(x11_platform)] -use once_cell::sync::Lazy; +use crate::utils::Lazy; use smol_str::SmolStr; #[cfg(x11_platform)] diff --git a/src/platform_impl/linux/x11/ime/input_method.rs b/src/platform_impl/linux/x11/ime/input_method.rs index 87bf708f..9221efcd 100644 --- a/src/platform_impl/linux/x11/ime/input_method.rs +++ b/src/platform_impl/linux/x11/ime/input_method.rs @@ -8,7 +8,7 @@ use std::{ }; use super::{super::atoms::*, ffi, util, XConnection, XError}; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use x11rb::protocol::xproto; static GLOBAL_LOCK: Lazy> = Lazy::new(Default::default); diff --git a/src/platform_impl/linux/x11/util/wm.rs b/src/platform_impl/linux/x11/util/wm.rs index 43a800dd..57efb6bf 100644 --- a/src/platform_impl/linux/x11/util/wm.rs +++ b/src/platform_impl/linux/x11/util/wm.rs @@ -1,6 +1,6 @@ use std::sync::Mutex; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use super::*; diff --git a/src/platform_impl/macos/cursor.rs b/src/platform_impl/macos/cursor.rs index a7fb54e5..fc105eba 100644 --- a/src/platform_impl/macos/cursor.rs +++ b/src/platform_impl/macos/cursor.rs @@ -1,3 +1,4 @@ +use crate::utils::Lazy; use icrate::AppKit::{NSBitmapImageRep, NSCursor, NSDeviceRGBColorSpace, NSImage}; use icrate::Foundation::{ ns_string, NSData, NSDictionary, NSNumber, NSObject, NSObjectProtocol, NSPoint, NSSize, @@ -6,7 +7,6 @@ use icrate::Foundation::{ use objc2::rc::Id; use objc2::runtime::Sel; use objc2::{msg_send_id, sel, ClassType}; -use once_cell::sync::Lazy; use std::ffi::c_uchar; use std::slice; diff --git a/src/platform_impl/windows/dark_mode.rs b/src/platform_impl/windows/dark_mode.rs index 6487617f..11b69776 100644 --- a/src/platform_impl/windows/dark_mode.rs +++ b/src/platform_impl/windows/dark_mode.rs @@ -2,7 +2,7 @@ /// which is inspired by the solution in https://github.com/ysc3839/win32-darkmode use std::{ffi::c_void, ptr}; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use windows_sys::{ core::PCSTR, Win32::{ diff --git a/src/platform_impl/windows/event_loop.rs b/src/platform_impl/windows/event_loop.rs index b496e920..ebf1f33d 100644 --- a/src/platform_impl/windows/event_loop.rs +++ b/src/platform_impl/windows/event_loop.rs @@ -17,7 +17,7 @@ use std::{ time::{Duration, Instant}, }; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use windows_sys::Win32::{ Devices::HumanInterfaceDevice::MOUSE_MOVE_RELATIVE, @@ -848,16 +848,16 @@ static USER_EVENT_MSG_ID: LazyMessageId = LazyMessageId::new("Winit::WakeupMsg\0 static EXEC_MSG_ID: LazyMessageId = LazyMessageId::new("Winit::ExecMsg\0"); // Message sent by a `Window` when it wants to be destroyed by the main thread. // WPARAM and LPARAM are unused. -pub static DESTROY_MSG_ID: LazyMessageId = LazyMessageId::new("Winit::DestroyMsg\0"); +pub(crate) static DESTROY_MSG_ID: LazyMessageId = LazyMessageId::new("Winit::DestroyMsg\0"); // WPARAM is a bool specifying the `WindowFlags::MARKER_RETAIN_STATE_ON_SIZE` flag. See the // documentation in the `window_state` module for more information. -pub static SET_RETAIN_STATE_ON_SIZE_MSG_ID: LazyMessageId = +pub(crate) static SET_RETAIN_STATE_ON_SIZE_MSG_ID: LazyMessageId = LazyMessageId::new("Winit::SetRetainMaximized\0"); static THREAD_EVENT_TARGET_WINDOW_CLASS: Lazy> = Lazy::new(|| util::encode_wide("Winit Thread Event Target")); /// When the taskbar is created, it registers a message with the "TaskbarCreated" string and then broadcasts this message to all top-level windows /// -pub static TASKBAR_CREATED: LazyMessageId = LazyMessageId::new("TaskbarCreated\0"); +pub(crate) static TASKBAR_CREATED: LazyMessageId = LazyMessageId::new("TaskbarCreated\0"); fn create_event_target_window() -> HWND { use windows_sys::Win32::UI::WindowsAndMessaging::CS_HREDRAW; diff --git a/src/platform_impl/windows/keyboard_layout.rs b/src/platform_impl/windows/keyboard_layout.rs index ac2a3444..31a15e49 100644 --- a/src/platform_impl/windows/keyboard_layout.rs +++ b/src/platform_impl/windows/keyboard_layout.rs @@ -5,7 +5,7 @@ use std::{ sync::Mutex, }; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use smol_str::SmolStr; use windows_sys::Win32::{ System::SystemServices::{LANG_JAPANESE, LANG_KOREAN}, diff --git a/src/platform_impl/windows/util.rs b/src/platform_impl/windows/util.rs index 66e6be09..ae36bdae 100644 --- a/src/platform_impl/windows/util.rs +++ b/src/platform_impl/windows/util.rs @@ -9,7 +9,7 @@ use std::{ sync::atomic::{AtomicBool, Ordering}, }; -use once_cell::sync::Lazy; +use crate::utils::Lazy; use windows_sys::{ core::{HRESULT, PCWSTR}, Win32::{ @@ -262,27 +262,27 @@ pub type GetPointerTouchInfo = pub type GetPointerPenInfo = unsafe extern "system" fn(pointId: u32, penInfo: *mut POINTER_PEN_INFO) -> BOOL; -pub static GET_DPI_FOR_WINDOW: Lazy> = +pub(crate) static GET_DPI_FOR_WINDOW: Lazy> = Lazy::new(|| get_function!("user32.dll", GetDpiForWindow)); -pub static ADJUST_WINDOW_RECT_EX_FOR_DPI: Lazy> = +pub(crate) static ADJUST_WINDOW_RECT_EX_FOR_DPI: Lazy> = Lazy::new(|| get_function!("user32.dll", AdjustWindowRectExForDpi)); -pub static GET_DPI_FOR_MONITOR: Lazy> = +pub(crate) static GET_DPI_FOR_MONITOR: Lazy> = Lazy::new(|| get_function!("shcore.dll", GetDpiForMonitor)); -pub static ENABLE_NON_CLIENT_DPI_SCALING: Lazy> = +pub(crate) static ENABLE_NON_CLIENT_DPI_SCALING: Lazy> = Lazy::new(|| get_function!("user32.dll", EnableNonClientDpiScaling)); -pub static SET_PROCESS_DPI_AWARENESS_CONTEXT: Lazy> = +pub(crate) static SET_PROCESS_DPI_AWARENESS_CONTEXT: Lazy> = Lazy::new(|| get_function!("user32.dll", SetProcessDpiAwarenessContext)); -pub static SET_PROCESS_DPI_AWARENESS: Lazy> = +pub(crate) static SET_PROCESS_DPI_AWARENESS: Lazy> = Lazy::new(|| get_function!("shcore.dll", SetProcessDpiAwareness)); -pub static SET_PROCESS_DPI_AWARE: Lazy> = +pub(crate) static SET_PROCESS_DPI_AWARE: Lazy> = Lazy::new(|| get_function!("user32.dll", SetProcessDPIAware)); -pub static GET_POINTER_FRAME_INFO_HISTORY: Lazy> = +pub(crate) static GET_POINTER_FRAME_INFO_HISTORY: Lazy> = Lazy::new(|| get_function!("user32.dll", GetPointerFrameInfoHistory)); -pub static SKIP_POINTER_FRAME_MESSAGES: Lazy> = +pub(crate) static SKIP_POINTER_FRAME_MESSAGES: Lazy> = Lazy::new(|| get_function!("user32.dll", SkipPointerFrameMessages)); -pub static GET_POINTER_DEVICE_RECTS: Lazy> = +pub(crate) static GET_POINTER_DEVICE_RECTS: Lazy> = Lazy::new(|| get_function!("user32.dll", GetPointerDeviceRects)); -pub static GET_POINTER_TOUCH_INFO: Lazy> = +pub(crate) static GET_POINTER_TOUCH_INFO: Lazy> = Lazy::new(|| get_function!("user32.dll", GetPointerTouchInfo)); -pub static GET_POINTER_PEN_INFO: Lazy> = +pub(crate) static GET_POINTER_PEN_INFO: Lazy> = Lazy::new(|| get_function!("user32.dll", GetPointerPenInfo)); diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 00000000..5bb52a4a --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,30 @@ +// A poly-fill for `lazy_cell` +// Replace with std::sync::LazyLock when https://github.com/rust-lang/rust/issues/109736 is stablized. + +// This isn't used on every platform, which can come up as dead code warnings. +#![allow(dead_code)] + +use std::ops::Deref; +use std::sync::OnceLock; + +pub(crate) struct Lazy { + cell: OnceLock, + init: fn() -> T, +} + +impl Lazy { + pub const fn new(f: fn() -> T) -> Self { + Self { + cell: OnceLock::new(), + init: f, + } + } +} + +impl Deref for Lazy { + type Target = T; + #[inline] + fn deref(&self) -> &'_ T { + self.cell.get_or_init(self.init) + } +}