From 4167c66b86714ad09d4fd463bc92b7b8c03c55c5 Mon Sep 17 00:00:00 2001 From: "Quadri A. Adekunle" Date: Tue, 5 Mar 2024 11:08:29 +1100 Subject: [PATCH] macOS: Fix center window with fixed bounds size (#8475) This PR fixes window showing up in the center of the monitor when `center: true` option is provided. The idea is to set the `window_wize` when creating the `window` using `native_window.initWithContentRect_styleMask_backing_defer_screen_()` Before: SCR-20240227-qokf After: SCR-20240227-qlmg Release Notes: - N/A --- crates/gpui/examples/hello_world.rs | 10 +++++- crates/gpui/src/platform/mac/window.rs | 44 ++++++++++++++------------ 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/crates/gpui/examples/hello_world.rs b/crates/gpui/examples/hello_world.rs index d0578e6681..9361cbf437 100644 --- a/crates/gpui/examples/hello_world.rs +++ b/crates/gpui/examples/hello_world.rs @@ -23,7 +23,15 @@ impl Render for HelloWorld { fn main() { App::new().run(|cx: &mut AppContext| { - cx.open_window(WindowOptions::default(), |cx| { + let options = WindowOptions { + bounds: WindowBounds::Fixed(Bounds { + size: size(px(600.0), px(600.0)).into(), + origin: Default::default(), + }), + center: true, + ..Default::default() + }; + cx.open_window(options, |cx| { cx.new_view(|_cx| HelloWorld { text: "World".into(), }) diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index bdfd41a46f..8e48cbef30 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -530,8 +530,27 @@ impl MacWindow { } } + let window_rect = match options.bounds { + WindowBounds::Fullscreen => { + // Set a temporary size as we will asynchronously resize the window + NSRect::new(NSPoint::new(0., 0.), NSSize::new(1024., 768.)) + } + WindowBounds::Maximized => { + let display_bounds = display.bounds(); + global_bounds_to_ns_rect(display_bounds) + } + WindowBounds::Fixed(bounds) => { + let display_bounds = display.bounds(); + if bounds.intersects(&display_bounds) { + global_bounds_to_ns_rect(bounds) + } else { + global_bounds_to_ns_rect(display_bounds) + } + } + }; + let native_window = native_window.initWithContentRect_styleMask_backing_defer_screen_( - NSRect::new(NSPoint::new(0., 0.), NSSize::new(1024., 768.)), + window_rect, style_mask, NSBackingStoreBuffered, NO, @@ -685,25 +704,10 @@ impl MacWindow { native_window.orderFront_(nil); } - let screen = native_window.screen(); - match options.bounds { - WindowBounds::Fullscreen => { - // We need to toggle full screen asynchronously as doing so may - // call back into the platform handlers. - window.toggle_full_screen() - } - WindowBounds::Maximized => { - native_window.setFrame_display_(screen.visibleFrame(), YES); - } - WindowBounds::Fixed(bounds) => { - let display_bounds = display.bounds(); - let frame = if bounds.intersects(&display_bounds) { - global_bounds_to_ns_rect(bounds) - } else { - global_bounds_to_ns_rect(display_bounds) - }; - native_window.setFrame_display_(frame, YES); - } + if options.bounds == WindowBounds::Fullscreen { + // We need to toggle full screen asynchronously as doing so may + // call back into the platform handlers. + window.toggle_full_screen(); } window.0.lock().move_traffic_light();