From 67f00588b4927271cb8b89f1d0c10db3c9727093 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Sat, 3 May 2025 14:32:00 -0300 Subject: [PATCH] fix(macos): check monitor from window initial position to determine size (#1110) --- .github/fix-window-size.md | 5 +++++ src/platform_impl/macos/window.rs | 31 +++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 .github/fix-window-size.md diff --git a/.github/fix-window-size.md b/.github/fix-window-size.md new file mode 100644 index 00000000..d75ff04b --- /dev/null +++ b/.github/fix-window-size.md @@ -0,0 +1,5 @@ +--- +"tao": patch +--- + +Properly check target monitor from window initial position to determine its size with the proper scale factor on macOS. diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index 6959d51c..197bc980 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -174,13 +174,21 @@ fn create_window( let monitor_screen = monitor.ns_screen(); Some(monitor_screen.unwrap_or_else(|| appkit::NSScreen::mainScreen(mtm).unwrap())) } - Some(Fullscreen::Borderless(None)) => Some(appkit::NSScreen::mainScreen(mtm).unwrap()), + Some(Fullscreen::Borderless(None)) => Some( + attrs + .position + .and_then(screen_from_position) + .unwrap_or_else(|| appkit::NSScreen::mainScreen(mtm).unwrap()), + ), None => None, }; let frame = match &screen { Some(screen) => NSScreen::frame(screen), None => { - let screen = NSScreen::mainScreen(mtm).unwrap(); + let screen = attrs + .position + .and_then(screen_from_position) + .unwrap_or_else(|| appkit::NSScreen::mainScreen(mtm).unwrap()); let scale_factor = NSScreen::backingScaleFactor(&screen) as f64; let desired_size = attrs .inner_size @@ -323,6 +331,25 @@ fn create_window( } } +fn screen_from_position(position: Position) -> Option> { + for m in monitor::available_monitors() { + let monitor_pos = m.position(); + let monitor_size = m.size(); + + // type annotations required for 32bit targets. + let window_position = position.to_physical::(m.scale_factor()); + + let is_in_monitor = monitor_pos.x <= window_position.x + && window_position.x < monitor_pos.x + monitor_size.width as i32 + && monitor_pos.y <= window_position.y + && window_position.y < monitor_pos.y + monitor_size.height as i32; + if is_in_monitor { + return m.ns_screen(); + } + } + None +} + pub(super) fn get_ns_theme() -> Theme { unsafe { let appearances: Vec> = vec![