util.rs

  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}