raw_window_handle/
windows.rs

1use core::ffi::c_void;
2use core::num::NonZeroIsize;
3use core::ptr::NonNull;
4
5use super::DisplayHandle;
6
7/// Raw display handle for Windows.
8///
9/// It can be used regardless of Windows window backend.
10#[non_exhaustive]
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12pub struct WindowsDisplayHandle {}
13
14impl WindowsDisplayHandle {
15    /// Create a new empty display handle.
16    ///
17    ///
18    /// # Example
19    ///
20    /// ```
21    /// # use raw_window_handle::WindowsDisplayHandle;
22    /// let handle = WindowsDisplayHandle::new();
23    /// ```
24    pub fn new() -> Self {
25        Self {}
26    }
27}
28
29impl DisplayHandle<'static> {
30    /// Create a Windows-based display handle.
31    ///
32    /// As no data is borrowed by this handle, it is completely safe to create. This function
33    /// may be useful to windowing framework implementations that want to avoid unsafe code.
34    ///
35    /// # Example
36    ///
37    /// ```
38    /// # use raw_window_handle::{DisplayHandle, HasDisplayHandle};
39    /// # fn do_something(rwh: impl HasDisplayHandle) { let _ = rwh; }
40    /// let handle = DisplayHandle::windows();
41    /// do_something(handle);
42    /// ```
43    pub fn windows() -> Self {
44        // SAFETY: No data is borrowed.
45        unsafe { Self::borrow_raw(WindowsDisplayHandle::new().into()) }
46    }
47}
48
49/// Raw window handle for Win32.
50#[non_exhaustive]
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
52pub struct Win32WindowHandle {
53    /// A Win32 `HWND` handle.
54    pub hwnd: NonZeroIsize,
55    /// The `GWLP_HINSTANCE` associated with this type's `HWND`.
56    pub hinstance: Option<NonZeroIsize>,
57}
58
59impl Win32WindowHandle {
60    /// Create a new handle to a window.
61    ///
62    /// # Safety
63    ///
64    /// It is assumed that the Win32 handle belongs to the current thread. This
65    /// is necessary for the handle to be considered "valid" in all cases.
66    ///
67    /// # Example
68    ///
69    /// ```
70    /// # use core::num::NonZeroIsize;
71    /// # use raw_window_handle::Win32WindowHandle;
72    /// # struct HWND(isize);
73    /// #
74    /// let window: HWND;
75    /// # window = HWND(1);
76    /// let mut handle = Win32WindowHandle::new(NonZeroIsize::new(window.0).unwrap());
77    /// // Optionally set the GWLP_HINSTANCE.
78    /// # #[cfg(only_for_showcase)]
79    /// let hinstance = NonZeroIsize::new(unsafe { GetWindowLongPtrW(window, GWLP_HINSTANCE) }).unwrap();
80    /// # let hinstance = None;
81    /// handle.hinstance = hinstance;
82    /// ```
83    pub fn new(hwnd: NonZeroIsize) -> Self {
84        Self {
85            hwnd,
86            hinstance: None,
87        }
88    }
89}
90
91/// Raw window handle for WinRT.
92#[non_exhaustive]
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
94pub struct WinRtWindowHandle {
95    /// A WinRT `CoreWindow` handle.
96    pub core_window: NonNull<c_void>,
97}
98
99impl WinRtWindowHandle {
100    /// Create a new handle to a window.
101    ///
102    ///
103    /// # Example
104    ///
105    /// ```
106    /// # use core::ptr::NonNull;
107    /// # use raw_window_handle::WinRtWindowHandle;
108    /// # type CoreWindow = ();
109    /// #
110    /// let window: NonNull<CoreWindow>;
111    /// # window = NonNull::from(&());
112    /// let handle = WinRtWindowHandle::new(window.cast());
113    /// ```
114    pub fn new(core_window: NonNull<c_void>) -> Self {
115        Self { core_window }
116    }
117}