use std::sync::OnceLock;
struct Win32 {
_user32: libloading::Library,
get_clipboard_sequence_number: unsafe extern "system" fn() -> u32,
}
unsafe impl Send for Win32 {}
unsafe impl Sync for Win32 {}
static WIN32: OnceLock<Option<Win32>> = OnceLock::new();
fn win32() -> Option<&'static Win32> {
WIN32
.get_or_init(|| {
let user32 = unsafe { libloading::Library::new("user32.dll") }.ok()?;
let get_clipboard_sequence_number =
unsafe { *user32.get(b"GetClipboardSequenceNumber\0").ok()? };
Some(Win32 {
_user32: user32,
get_clipboard_sequence_number,
})
})
.as_ref()
}
pub(crate) fn clipboard_sequence() -> Option<u32> {
let w = win32()?;
Some(unsafe { (w.get_clipboard_sequence_number)() })
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sequence_is_available_on_windows_and_absent_elsewhere() {
if cfg!(windows) {
assert!(
clipboard_sequence().is_some(),
"user32!GetClipboardSequenceNumber should resolve on Windows"
);
} else {
assert!(clipboard_sequence().is_none());
}
}
#[test]
fn repeated_reads_do_not_panic() {
let a = clipboard_sequence();
let b = clipboard_sequence();
assert_eq!(a.is_some(), b.is_some());
}
}