windows: Respect "appears transparent" for title bar (#9454)

Ezekiel Warren and Mikayla Maki created

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 <mikayla@zed.dev>

Change summary

crates/gpui/src/platform/windows/window.rs | 68 ++++++++++++++++++-----
1 file changed, 52 insertions(+), 16 deletions(-)

Detailed changes

crates/gpui/src/platform/windows/window.rs 🔗

@@ -49,6 +49,7 @@ pub(crate) struct WindowsWindowInner {
     platform_inner: Rc<WindowsPlatformInner>,
     pub(crate) handle: AnyWindowHandle,
     scale_factor: f32,
+    hide_title_bar: bool,
     display: RefCell<Rc<WindowsDisplay>>,
 }
 
@@ -58,6 +59,7 @@ impl WindowsWindowInner {
         cs: &CREATESTRUCTW,
         platform_inner: Rc<WindowsPlatformInner>,
         handle: AnyWindowHandle,
+        hide_title_bar: bool,
         display: Rc<WindowsDisplay>,
     ) -> 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<Rc<WindowsWindowInner>>,
     platform_inner: Rc<WindowsPlatformInner>,
     handle: AnyWindowHandle,
+    hide_title_bar: bool,
     display: Rc<WindowsDisplay>,
 }
 
@@ -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));