1use std::ops::Deref;
2
3use util::ResultExt;
4use windows::Win32::{
5 Foundation::{HANDLE, HGLOBAL},
6 System::Memory::{GlobalLock, GlobalSize, GlobalUnlock},
7 UI::WindowsAndMessaging::HCURSOR,
8};
9
10#[derive(Debug, Clone, Copy)]
11pub(crate) struct SafeHandle {
12 raw: HANDLE,
13}
14
15unsafe impl Send for SafeHandle {}
16unsafe impl Sync for SafeHandle {}
17
18impl From<HANDLE> for SafeHandle {
19 fn from(value: HANDLE) -> Self {
20 SafeHandle { raw: value }
21 }
22}
23
24impl Deref for SafeHandle {
25 type Target = HANDLE;
26
27 fn deref(&self) -> &Self::Target {
28 &self.raw
29 }
30}
31
32#[derive(Debug, Clone, Copy)]
33pub(crate) struct SafeCursor {
34 raw: HCURSOR,
35}
36
37unsafe impl Send for SafeCursor {}
38unsafe impl Sync for SafeCursor {}
39
40impl From<HCURSOR> for SafeCursor {
41 fn from(value: HCURSOR) -> Self {
42 SafeCursor { raw: value }
43 }
44}
45
46impl Deref for SafeCursor {
47 type Target = HCURSOR;
48
49 fn deref(&self) -> &Self::Target {
50 &self.raw
51 }
52}
53
54#[derive(Debug, Clone)]
55pub(crate) struct SmartGlobal {
56 raw: HGLOBAL,
57}
58
59impl SmartGlobal {
60 pub(crate) fn from_raw_ptr(ptr: *mut std::ffi::c_void) -> Self {
61 Self { raw: HGLOBAL(ptr) }
62 }
63
64 pub(crate) fn lock(&self) -> *mut std::ffi::c_void {
65 unsafe { GlobalLock(self.raw) }
66 }
67
68 pub(crate) fn size(&self) -> usize {
69 unsafe { GlobalSize(self.raw) }
70 }
71}
72
73impl Drop for SmartGlobal {
74 fn drop(&mut self) {
75 unsafe {
76 GlobalUnlock(self.raw).log_err();
77 }
78 }
79}