Skip to main content

ironrdp_cliprdr_native/
lib.rs

1#![cfg_attr(doc, doc = include_str!("../README.md"))]
2#![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")]
3#![warn(unsafe_op_in_unsafe_fn)]
4#![warn(invalid_reference_casting)]
5#![warn(clippy::undocumented_unsafe_blocks)]
6#![warn(clippy::multiple_unsafe_ops_per_block)]
7#![warn(clippy::transmute_ptr_to_ptr)]
8#![warn(clippy::as_ptr_cast_mut)]
9#![warn(clippy::cast_ptr_alignment)]
10#![warn(clippy::fn_to_numeric_cast_any)]
11#![warn(clippy::ptr_cast_constness)]
12
13#[cfg(windows)]
14mod windows;
15#[cfg(windows)]
16pub use crate::windows::{HWND, WinClipboard, WinCliprdrError, WinCliprdrResult};
17
18mod stub;
19use std::sync::OnceLock;
20use std::time::Instant;
21
22pub use crate::stub::{StubClipboard, StubCliprdrBackend};
23
24/// Process-wide monotonic clock epoch for `CliprdrBackend::now_ms()` on native platforms.
25///
26/// Uses a lazily-initialized `Instant` so that all backends in the same process
27/// share the same zero-point, producing comparable timestamps.
28fn epoch() -> &'static Instant {
29    static EPOCH: OnceLock<Instant> = OnceLock::new();
30    EPOCH.get_or_init(Instant::now)
31}
32
33/// Returns monotonic milliseconds since process start, for use by native
34/// `CliprdrBackend` implementations.
35pub fn native_now_ms() -> u64 {
36    u64::try_from(epoch().elapsed().as_millis()).unwrap_or(u64::MAX)
37}