1use util::ResultExt;
2use windows::Win32::{Foundation::*, System::Threading::*, UI::WindowsAndMessaging::*};
3
4pub(crate) trait HiLoWord {
5 fn hiword(&self) -> u16;
6 fn loword(&self) -> u16;
7 fn signed_hiword(&self) -> i16;
8 fn signed_loword(&self) -> i16;
9}
10
11impl HiLoWord for WPARAM {
12 fn hiword(&self) -> u16 {
13 ((self.0 >> 16) & 0xFFFF) as u16
14 }
15
16 fn loword(&self) -> u16 {
17 (self.0 & 0xFFFF) as u16
18 }
19
20 fn signed_hiword(&self) -> i16 {
21 ((self.0 >> 16) & 0xFFFF) as i16
22 }
23
24 fn signed_loword(&self) -> i16 {
25 (self.0 & 0xFFFF) as i16
26 }
27}
28
29impl HiLoWord for LPARAM {
30 fn hiword(&self) -> u16 {
31 ((self.0 >> 16) & 0xFFFF) as u16
32 }
33
34 fn loword(&self) -> u16 {
35 (self.0 & 0xFFFF) as u16
36 }
37
38 fn signed_hiword(&self) -> i16 {
39 ((self.0 >> 16) & 0xFFFF) as i16
40 }
41
42 fn signed_loword(&self) -> i16 {
43 (self.0 & 0xFFFF) as i16
44 }
45}
46
47pub(crate) unsafe fn get_window_long(hwnd: HWND, nindex: WINDOW_LONG_PTR_INDEX) -> isize {
48 #[cfg(target_pointer_width = "64")]
49 unsafe {
50 GetWindowLongPtrW(hwnd, nindex)
51 }
52 #[cfg(target_pointer_width = "32")]
53 unsafe {
54 GetWindowLongW(hwnd, nindex) as isize
55 }
56}
57
58pub(crate) unsafe fn set_window_long(
59 hwnd: HWND,
60 nindex: WINDOW_LONG_PTR_INDEX,
61 dwnewlong: isize,
62) -> isize {
63 #[cfg(target_pointer_width = "64")]
64 unsafe {
65 SetWindowLongPtrW(hwnd, nindex, dwnewlong)
66 }
67 #[cfg(target_pointer_width = "32")]
68 unsafe {
69 SetWindowLongW(hwnd, nindex, dwnewlong as i32) as isize
70 }
71}
72
73pub(crate) struct OwnedHandle(HANDLE);
74
75impl OwnedHandle {
76 pub(crate) fn new(handle: HANDLE) -> Self {
77 Self(handle)
78 }
79
80 #[inline(always)]
81 pub(crate) fn to_raw(&self) -> HANDLE {
82 self.0
83 }
84}
85
86impl Drop for OwnedHandle {
87 fn drop(&mut self) {
88 if !self.0.is_invalid() {
89 unsafe { CloseHandle(self.0) }.log_err();
90 }
91 }
92}
93
94pub(crate) fn create_event() -> windows::core::Result<OwnedHandle> {
95 Ok(OwnedHandle::new(unsafe {
96 CreateEventW(None, false, false, None)?
97 }))
98}
99
100pub(crate) fn windows_credentials_target_name(url: &str) -> String {
101 format!("zed:url={}", url)
102}