diff --git a/.cargo/config.toml b/.cargo/config.toml index 39fabdb5b8..a657ae61b9 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -12,3 +12,7 @@ rustflags = ["-C", "link-arg=-fuse-ld=mold"] [target.aarch64-unknown-linux-gnu] linker = "clang" rustflags = ["-C", "link-arg=-fuse-ld=mold"] + +# This cfg will reduce the size of `windows::core::Error` from 16 bytes to 4 bytes +[target.'cfg(target_os = "windows")'] +rustflags = ["--cfg", "windows_slim_errors"] diff --git a/Cargo.lock b/Cargo.lock index bf6248d5a5..2185377a2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2142,7 +2142,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2353,7 +2353,7 @@ dependencies = [ "tiny_http", "url", "util", - "windows 0.57.0", + "windows 0.58.0", "worktree", ] @@ -4331,7 +4331,7 @@ dependencies = [ "text", "time", "util", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -4651,7 +4651,7 @@ dependencies = [ "unindent", "url", "util", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -4874,8 +4874,8 @@ dependencies = [ "wayland-cursor", "wayland-protocols", "wayland-protocols-plasma", - "windows 0.57.0", - "windows-core 0.57.0", + "windows 0.58.0", + "windows-core 0.58.0", "x11-clipboard", "x11rb", "xim", @@ -6314,7 +6314,7 @@ dependencies = [ "serde_json", "smol", "util", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -6794,7 +6794,7 @@ dependencies = [ "tempfile", "util", "walkdir", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -10768,7 +10768,7 @@ dependencies = [ "theme", "thiserror", "util", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -11094,7 +11094,7 @@ dependencies = [ "ui", "util", "vcs_menu", - "windows 0.57.0", + "windows 0.58.0", "workspace", "zed_actions", ] @@ -11722,7 +11722,7 @@ dependencies = [ "story", "strum", "theme", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -12857,17 +12857,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core 0.52.0", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.5", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] @@ -12876,26 +12876,27 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", "windows-result", - "windows-targets 0.52.5", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", @@ -12904,9 +12905,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", @@ -12915,11 +12916,21 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -12946,7 +12957,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -12981,18 +12992,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -13009,9 +13020,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -13027,9 +13038,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -13045,15 +13056,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -13069,9 +13080,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -13087,9 +13098,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -13105,9 +13116,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -13123,9 +13134,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" diff --git a/Cargo.toml b/Cargo.toml index 0bba99a7f5..c5b3397c85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -445,7 +445,7 @@ wit-component = "0.201" sys-locale = "0.3.1" [workspace.dependencies.windows] -version = "0.57" +version = "0.58" features = [ "implement", "Foundation_Numerics", diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index 049acded99..d37ba7f7ab 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -150,7 +150,7 @@ x11-clipboard = "0.9.2" [target.'cfg(windows)'.dependencies] windows.workspace = true -windows-core = "0.57" +windows-core = "0.58" [[example]] name = "hello_world" diff --git a/crates/gpui/src/platform/windows.rs b/crates/gpui/src/platform/windows.rs index f8ea897fb8..aa484eccdc 100644 --- a/crates/gpui/src/platform/windows.rs +++ b/crates/gpui/src/platform/windows.rs @@ -6,6 +6,7 @@ mod platform; mod system_settings; mod util; mod window; +mod wrapper; pub(crate) use direct_write::*; pub(crate) use dispatcher::*; @@ -15,5 +16,6 @@ pub(crate) use platform::*; pub(crate) use system_settings::*; pub(crate) use util::*; pub(crate) use window::*; +pub(crate) use wrapper::*; pub(crate) use windows::Win32::Foundation::HWND; diff --git a/crates/gpui/src/platform/windows/direct_write.rs b/crates/gpui/src/platform/windows/direct_write.rs index 912dee7893..1e5e3f2e43 100644 --- a/crates/gpui/src/platform/windows/direct_write.rs +++ b/crates/gpui/src/platform/windows/direct_write.rs @@ -924,7 +924,7 @@ struct RendererContext<'t, 'a, 'b> { } #[allow(non_snake_case)] -impl IDWritePixelSnapping_Impl for TextRenderer { +impl IDWritePixelSnapping_Impl for TextRenderer_Impl { fn IsPixelSnappingDisabled( &self, _clientdrawingcontext: *const ::core::ffi::c_void, @@ -959,7 +959,7 @@ impl IDWritePixelSnapping_Impl for TextRenderer { } #[allow(non_snake_case)] -impl IDWriteTextRenderer_Impl for TextRenderer { +impl IDWriteTextRenderer_Impl for TextRenderer_Impl { fn DrawGlyphRun( &self, clientdrawingcontext: *const ::core::ffi::c_void, diff --git a/crates/gpui/src/platform/windows/display.rs b/crates/gpui/src/platform/windows/display.rs index 3bbbe36489..9d62fde951 100644 --- a/crates/gpui/src/platform/windows/display.rs +++ b/crates/gpui/src/platform/windows/display.rs @@ -27,6 +27,10 @@ pub(crate) struct WindowsDisplay { uuid: Uuid, } +// The `HMONITOR` is thread-safe. +unsafe impl Send for WindowsDisplay {} +unsafe impl Sync for WindowsDisplay {} + impl WindowsDisplay { pub(crate) fn new(display_id: DisplayId) -> Option { let screen = available_monitors().into_iter().nth(display_id.0 as _)?; diff --git a/crates/gpui/src/platform/windows/events.rs b/crates/gpui/src/platform/windows/events.rs index 3923242409..ec536aea09 100644 --- a/crates/gpui/src/platform/windows/events.rs +++ b/crates/gpui/src/platform/windows/events.rs @@ -217,7 +217,7 @@ fn handle_destroy_msg(handle: HWND, state_ptr: Rc) -> Opt callback(); } unsafe { - PostMessageW(None, CLOSE_ONE_WINDOW, None, LPARAM(handle.0)).log_err(); + PostMessageW(None, CLOSE_ONE_WINDOW, None, LPARAM(handle.0 as isize)).log_err(); } Some(0) } @@ -1040,7 +1040,7 @@ fn handle_nc_mouse_up_msg( } fn handle_cursor_changed(lparam: LPARAM, state_ptr: Rc) -> Option { - state_ptr.state.borrow_mut().current_cursor = HCURSOR(lparam.0); + state_ptr.state.borrow_mut().current_cursor = HCURSOR(lparam.0 as _); Some(0) } diff --git a/crates/gpui/src/platform/windows/platform.rs b/crates/gpui/src/platform/windows/platform.rs index 6dbe14ffed..894c799545 100644 --- a/crates/gpui/src/platform/windows/platform.rs +++ b/crates/gpui/src/platform/windows/platform.rs @@ -191,7 +191,7 @@ impl Platform for WindowsPlatform { match msg.message { WM_QUIT => break 'a, CLOSE_ONE_WINDOW => { - if self.close_one_window(HWND(msg.lParam.0)) { + if self.close_one_window(HWND(msg.lParam.0 as _)) { break 'a; } } @@ -484,7 +484,7 @@ impl Platform for WindowsPlatform { let hcursor = load_cursor(style); let mut lock = self.state.borrow_mut(); if lock.current_cursor.0 != hcursor.0 { - self.post_message(CURSOR_STYLE_CHANGED, WPARAM(0), LPARAM(hcursor.0)); + self.post_message(CURSOR_STYLE_CHANGED, WPARAM(0), LPARAM(hcursor.0 as isize)); lock.current_cursor = hcursor; } } @@ -595,7 +595,7 @@ fn open_target(target: &str) { None, SW_SHOWDEFAULT, ); - if ret.0 <= 32 { + if ret.0 as isize <= 32 { log::error!("Unable to open target: {}", std::io::Error::last_os_error()); } } @@ -611,7 +611,7 @@ fn open_target_in_explorer(target: &str) { None, SW_SHOWDEFAULT, ); - if ret.0 <= 32 { + if ret.0 as isize <= 32 { log::error!( "Unable to open target in explorer: {}", std::io::Error::last_os_error() @@ -643,11 +643,12 @@ unsafe fn show_savefile_dialog(directory: PathBuf) -> Result { Ok(dialog) } -fn begin_vsync(vsync_evnet: HANDLE) { +fn begin_vsync(vsync_event: HANDLE) { + let event: SafeHandle = vsync_event.into(); std::thread::spawn(move || unsafe { loop { windows::Win32::Graphics::Dwm::DwmFlush().log_err(); - SetEvent(vsync_evnet).log_err(); + SetEvent(*event).log_err(); } }); } @@ -723,7 +724,7 @@ fn set_data_to_clipboard(data: &[u16], format: u32) -> Result<()> { let handle = GlobalLock(global); u_memcpy(handle as _, data.as_ptr(), data.len() as _); let _ = GlobalUnlock(global); - SetClipboardData(format, HANDLE(global.0 as isize))?; + SetClipboardData(format, HANDLE(global.0))?; } Ok(()) } diff --git a/crates/gpui/src/platform/windows/util.rs b/crates/gpui/src/platform/windows/util.rs index e39390056e..a9263059e1 100644 --- a/crates/gpui/src/platform/windows/util.rs +++ b/crates/gpui/src/platform/windows/util.rs @@ -85,13 +85,13 @@ pub(crate) fn windows_credentials_target_name(url: &str) -> String { } pub(crate) fn load_cursor(style: CursorStyle) -> HCURSOR { - static ARROW: OnceLock = OnceLock::new(); - static IBEAM: OnceLock = OnceLock::new(); - static CROSS: OnceLock = OnceLock::new(); - static HAND: OnceLock = OnceLock::new(); - static SIZEWE: OnceLock = OnceLock::new(); - static SIZENS: OnceLock = OnceLock::new(); - static NO: OnceLock = OnceLock::new(); + static ARROW: OnceLock = OnceLock::new(); + static IBEAM: OnceLock = OnceLock::new(); + static CROSS: OnceLock = OnceLock::new(); + static HAND: OnceLock = OnceLock::new(); + static SIZEWE: OnceLock = OnceLock::new(); + static SIZENS: OnceLock = OnceLock::new(); + static NO: OnceLock = OnceLock::new(); let (lock, name) = match style { CursorStyle::IBeam | CursorStyle::IBeamCursorForVerticalLayout => (&IBEAM, IDC_IBEAM), CursorStyle::Crosshair => (&CROSS, IDC_CROSS), @@ -107,14 +107,15 @@ pub(crate) fn load_cursor(style: CursorStyle) -> HCURSOR { CursorStyle::OperationNotAllowed => (&NO, IDC_NO), _ => (&ARROW, IDC_ARROW), }; - *lock.get_or_init(|| { + *(*lock.get_or_init(|| { HCURSOR( unsafe { LoadImageW(None, name, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED) } .log_err() .unwrap_or_default() .0, ) - }) + .into() + })) } #[inline] diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index 7857f71766..6a22f49de3 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -297,7 +297,7 @@ impl WindowsWindow { current_cursor, }; let lpparam = Some(&context as *const _ as *const _); - let raw_hwnd = unsafe { + let creation_result = unsafe { CreateWindowExW( dwexstyle, classname, @@ -313,7 +313,10 @@ impl WindowsWindow { lpparam, ) }; + // We should call `?` on state_ptr first, then call `?` on raw_hwnd. + // Or, we will lose the error info reported by `WindowsWindowState::new` let state_ptr = context.inner.take().unwrap()?; + let raw_hwnd = creation_result?; register_drag_drop(state_ptr.clone())?; unsafe { @@ -343,9 +346,10 @@ impl WindowsWindow { impl rwh::HasWindowHandle for WindowsWindow { fn window_handle(&self) -> std::result::Result, rwh::HandleError> { - let raw = - rwh::Win32WindowHandle::new(unsafe { NonZeroIsize::new_unchecked(self.0.hwnd.0) }) - .into(); + let raw = rwh::Win32WindowHandle::new(unsafe { + NonZeroIsize::new_unchecked(self.0.hwnd.0 as isize) + }) + .into(); Ok(unsafe { rwh::WindowHandle::borrow_raw(raw) }) } } @@ -509,8 +513,8 @@ impl PlatformWindow for WindowsWindow { fn activate(&self) { let hwnd = self.0.hwnd; - unsafe { SetActiveWindow(hwnd) }; - unsafe { SetFocus(hwnd) }; + unsafe { SetActiveWindow(hwnd).log_err() }; + unsafe { SetFocus(hwnd).log_err() }; // todo(windows) // crate `windows 0.56` reports true as Err unsafe { SetForegroundWindow(hwnd).as_bool() }; @@ -678,7 +682,7 @@ impl WindowsDragDropHandler { } #[allow(non_snake_case)] -impl IDropTarget_Impl for WindowsDragDropHandler { +impl IDropTarget_Impl for WindowsDragDropHandler_Impl { fn DragEnter( &self, pdataobj: Option<&IDataObject>, @@ -956,7 +960,7 @@ unsafe extern "system" fn wnd_proc( } pub(crate) fn try_get_window_inner(hwnd: HWND) -> Option> { - if hwnd == HWND(0) { + if hwnd.is_invalid() { return None; } @@ -1058,7 +1062,7 @@ mod windows_renderer { }; pub(super) fn windows_renderer(hwnd: HWND, transparent: bool) -> anyhow::Result { - let raw = RawWindow { hwnd: hwnd.0 }; + let raw = RawWindow { hwnd }; let gpu: Arc = Arc::new( unsafe { gpu::Context::init_windowed( @@ -1081,15 +1085,15 @@ mod windows_renderer { } struct RawWindow { - hwnd: isize, + hwnd: HWND, } impl rwh::HasWindowHandle for RawWindow { fn window_handle(&self) -> Result, rwh::HandleError> { Ok(unsafe { - let hwnd = NonZeroIsize::new_unchecked(self.hwnd); + let hwnd = NonZeroIsize::new_unchecked(self.hwnd.0 as isize); let mut handle = rwh::Win32WindowHandle::new(hwnd); - let hinstance = get_window_long(HWND(self.hwnd), GWLP_HINSTANCE); + let hinstance = get_window_long(self.hwnd, GWLP_HINSTANCE); handle.hinstance = NonZeroIsize::new(hinstance); rwh::WindowHandle::borrow_raw(handle.into()) }) diff --git a/crates/gpui/src/platform/windows/wrapper.rs b/crates/gpui/src/platform/windows/wrapper.rs new file mode 100644 index 0000000000..6015dffdab --- /dev/null +++ b/crates/gpui/src/platform/windows/wrapper.rs @@ -0,0 +1,47 @@ +use std::ops::Deref; + +use windows::Win32::{Foundation::HANDLE, UI::WindowsAndMessaging::HCURSOR}; + +#[derive(Debug, Clone, Copy)] +pub(crate) struct SafeHandle { + raw: HANDLE, +} + +unsafe impl Send for SafeHandle {} +unsafe impl Sync for SafeHandle {} + +impl From for SafeHandle { + fn from(value: HANDLE) -> Self { + SafeHandle { raw: value } + } +} + +impl Deref for SafeHandle { + type Target = HANDLE; + + fn deref(&self) -> &Self::Target { + &self.raw + } +} + +#[derive(Debug, Clone, Copy)] +pub(crate) struct SafeCursor { + raw: HCURSOR, +} + +unsafe impl Send for SafeCursor {} +unsafe impl Sync for SafeCursor {} + +impl From for SafeCursor { + fn from(value: HCURSOR) -> Self { + SafeCursor { raw: value } + } +} + +impl Deref for SafeCursor { + type Target = HCURSOR; + + fn deref(&self) -> &Self::Target { + &self.raw + } +} diff --git a/crates/terminal/src/pty_info.rs b/crates/terminal/src/pty_info.rs index 26238be0bd..5fc3b05f78 100644 --- a/crates/terminal/src/pty_info.rs +++ b/crates/terminal/src/pty_info.rs @@ -38,9 +38,9 @@ impl ProcessIdGetter { fn new(pty: &Pty) -> ProcessIdGetter { let child = pty.child_watcher(); let handle = child.raw_handle(); - let fallback_pid = child - .pid() - .unwrap_or_else(|| unsafe { NonZeroU32::new_unchecked(GetProcessId(HANDLE(handle))) }); + let fallback_pid = child.pid().unwrap_or_else(|| unsafe { + NonZeroU32::new_unchecked(GetProcessId(HANDLE(handle as _))) + }); ProcessIdGetter { handle: handle as i32,