## Summary macOS 27 Beta delays clicks in titlebar regions while AppKit determines whether a gesture should become a drag, single click, or double click. Zed's main workspace windows render a custom titlebar that already handles window movement via `Window::start_window_move`, so they do not need AppKit's native movable-titlebar behavior. This sets `is_movable` to `false` for the main `MultiWorkspace` windows and documents the `WindowOptions::is_movable` caveat for GPUI users with custom titlebars. ## Background The previous fix for this, #58947, used AppKit's private `_opaqueRectForWindowMoveWhenInTitlebar` SPI to mark GPUI's full-size content view as app-owned titlebar content. That fixed delayed titlebar clicks, but was later reverted in #59214 because it also affected windows that rely on AppKit's native titlebar dragging, like the settings window. This PR takes a narrower approach by only changing Zed's main custom-titlebar windows. Those windows already implement dragging explicitly via `Window::start_window_move`, so disabling AppKit's native movable-titlebar behavior fixes the macOS 27 Beta click delay without affecting other window types. Release Notes: - Fixed delayed clicks in the custom titlebar on macOS 27 Beta.
Unified · Split
| @@ -1495,7 +1495,12 @@ pub struct WindowOptions { · 1494 unmodified lines | |||
| 1495 | /// The kind of window to create | 1495 | /// The kind of window to create |
| 1496 | pub kind: WindowKind, | 1496 | pub kind: WindowKind, |
| 1497 | 1497 | ||
| 1498 | /// Whether the window should be movable by the user | 1498 | /// Whether the window should be movable by the user. |
| 1499 | /// | ||
| 1500 | /// On macOS 27, custom titlebar windows that implement their own drag behavior | ||
| 1501 | /// with [`Window::start_window_move`] should set this to `false`; otherwise | ||
| 1502 | /// AppKit can treat the titlebar region as system-owned and delay clicks | ||
| 1503 | /// while disambiguating titlebar double-clicks. | ||
| 1499 | pub is_movable: bool, | 1504 | pub is_movable: bool, |
| 1500 | 1505 | ||
| 1501 | /// Whether the window should be resizable by the user | 1506 | /// Whether the window should be resizable by the user |
| @@ -377,7 +377,8 @@ pub fn build_window_options(display_uuid: Option<Uuid>, cx: &mut App) -> WindowO · 376 unmodified lines | |||
| 377 | focus: false, | 377 | focus: false, |
| 378 | show: false, | 378 | show: false, |
| 379 | kind: WindowKind::Normal, | 379 | kind: WindowKind::Normal, |
| 380 | is_movable: true, | 380 | // Zed handles window movement itself, so disable AppKit's titlebar dragging. |
| 381 | is_movable: false, | ||
| 381 | display_id: display.map(|display| display.id()), | 382 | display_id: display.map(|display| display.id()), |
| 382 | window_background: cx.theme().window_background_appearance(), | 383 | window_background: cx.theme().window_background_appearance(), |
| 383 | app_id: Some(app_id.to_owned()), | 384 | app_id: Some(app_id.to_owned()), |