wrapper.rs

 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}