From e22d31b52d6fc5a790530e191b002b76fb7af808 Mon Sep 17 00:00:00 2001 From: Ezekiel Warren Date: Mon, 18 Mar 2024 11:39:46 -0700 Subject: [PATCH] windows: Respect "appears transparent" for title bar (#9454) now respecting the 'appears transparent' titlebar option which is used in the storybook crate. created for #9453 # storybook running ``` cargo run -p storybook components/text ``` | before | after | | --- | --- | | ![image](https://github.com/zed-industries/zed/assets/1284289/88cd93de-4ca9-40d6-aa53-aa7bc65e1f5c) | ![image](https://github.com/zed-industries/zed/assets/1284289/b3528775-219b-46b7-9f99-da5b88330fbd) | Release Notes: - N/A Co-authored-by: Mikayla Maki --- crates/gpui/src/platform/windows/window.rs | 68 +++++++++++++++++----- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index b55c28fed4b4702e143802516bbb1acb02c503ca..21f82b093c001fa688e58d09c20949079dba893b 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -49,6 +49,7 @@ pub(crate) struct WindowsWindowInner { platform_inner: Rc, pub(crate) handle: AnyWindowHandle, scale_factor: f32, + hide_title_bar: bool, display: RefCell>, } @@ -58,6 +59,7 @@ impl WindowsWindowInner { cs: &CREATESTRUCTW, platform_inner: Rc, handle: AnyWindowHandle, + hide_title_bar: bool, display: Rc, ) -> Self { let origin = Cell::new(Point::new((cs.x as f64).into(), (cs.y as f64).into())); @@ -115,6 +117,7 @@ impl WindowsWindowInner { platform_inner, handle, scale_factor: 1.0, + hide_title_bar, display, } } @@ -775,6 +778,10 @@ impl WindowsWindowInner { /// SEE: https://learn.microsoft.com/en-us/windows/win32/winmsg/wm-nccalcsize fn handle_calc_client_size(&self, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { + if !self.hide_title_bar { + return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; + } + if wparam.0 == 0 { return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; } @@ -797,8 +804,10 @@ impl WindowsWindowInner { } fn handle_activate_msg(&self, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { - if let Some(titlebar_rect) = self.get_titlebar_rect().log_err() { - unsafe { InvalidateRect(self.hwnd, Some(&titlebar_rect), FALSE) }; + if self.hide_title_bar { + if let Some(titlebar_rect) = self.get_titlebar_rect().log_err() { + unsafe { InvalidateRect(self.hwnd, Some(&titlebar_rect), FALSE) }; + } } return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; } @@ -814,20 +823,23 @@ impl WindowsWindowInner { height: GlobalPixels::from(height as f64), }); - // Inform the application of the frame change to force redrawing with the new - // client area that is extended into the title bar - unsafe { - SetWindowPos( - self.hwnd, - HWND::default(), - size_rect.left, - size_rect.top, - width, - height, - SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE, - ) - .log_err() - }; + if self.hide_title_bar { + // Inform the application of the frame change to force redrawing with the new + // client area that is extended into the title bar + unsafe { + SetWindowPos( + self.hwnd, + HWND::default(), + size_rect.left, + size_rect.top, + width, + height, + SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE, + ) + .log_err() + }; + } + LRESULT(0) } @@ -836,6 +848,10 @@ impl WindowsWindowInner { } fn handle_hit_test_msg(&self, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { + if !self.hide_title_bar { + return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; + } + // default handler for resize areas let hit = unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; if matches!( @@ -886,6 +902,10 @@ impl WindowsWindowInner { } fn handle_nc_mouse_move_msg(&self, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { + if !self.hide_title_bar { + return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; + } + let mut cursor_point = POINT { x: lparam.signed_loword().into(), y: lparam.signed_hiword().into(), @@ -916,6 +936,10 @@ impl WindowsWindowInner { wparam: WPARAM, lparam: LPARAM, ) -> LRESULT { + if !self.hide_title_bar { + return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; + } + let mut callbacks = self.callbacks.borrow_mut(); if let Some(callback) = callbacks.input.as_mut() { let mut cursor_point = POINT { @@ -951,6 +975,10 @@ impl WindowsWindowInner { wparam: WPARAM, lparam: LPARAM, ) -> LRESULT { + if !self.hide_title_bar { + return unsafe { DefWindowProcW(self.hwnd, msg, wparam, lparam) }; + } + let mut callbacks = self.callbacks.borrow_mut(); if let Some(callback) = callbacks.input.as_mut() { let mut cursor_point = POINT { @@ -1043,6 +1071,7 @@ struct WindowCreateContext { inner: Option>, platform_inner: Rc, handle: AnyWindowHandle, + hide_title_bar: bool, display: Rc, } @@ -1053,6 +1082,11 @@ impl WindowsWindow { options: WindowParams, ) -> Self { let classname = register_wnd_class(); + let hide_title_bar = options + .titlebar + .as_ref() + .map(|titlebar| titlebar.appears_transparent) + .unwrap_or(false); let windowname = HSTRING::from( options .titlebar @@ -1073,6 +1107,7 @@ impl WindowsWindow { inner: None, platform_inner: platform_inner.clone(), handle, + hide_title_bar, // todo(windows) move window to target monitor // options.display_id display: Rc::new(WindowsDisplay::primary_monitor().unwrap()), @@ -1526,6 +1561,7 @@ unsafe extern "system" fn wnd_proc( cs, ctx.platform_inner.clone(), ctx.handle, + ctx.hide_title_bar, ctx.display.clone(), )); let weak = Box::new(Rc::downgrade(&inner));