diff --git a/crates/gpui/src/platform/mac/screen.rs b/crates/gpui/src/platform/mac/screen.rs index e44ea35480..002f355baa 100644 --- a/crates/gpui/src/platform/mac/screen.rs +++ b/crates/gpui/src/platform/mac/screen.rs @@ -25,43 +25,38 @@ pub struct Screen { } impl Screen { + /// Get the screen with the given UUID. pub fn find_by_id(uuid: Uuid) -> Option { - unsafe { - let native_screens = NSScreen::screens(nil); - (0..NSArray::count(native_screens)) - .into_iter() - .map(|ix| Screen { - native_screen: native_screens.objectAtIndex(ix), - }) - .find(|screen| platform::Screen::display_uuid(screen) == Some(uuid)) - } + Self::all().find(|screen| platform::Screen::display_uuid(screen) == Some(uuid)) } - pub fn all() -> Vec { - let mut screens = Vec::new(); + /// Get the primary screen - the one with the menu bar, and whose bottom left + /// corner is at the origin of the AppKit coordinate system. + fn primary() -> Self { + Self::all().next().unwrap() + } + + pub fn all() -> impl Iterator { unsafe { let native_screens = NSScreen::screens(nil); - for ix in 0..NSArray::count(native_screens) { - screens.push(Screen { - native_screen: native_screens.objectAtIndex(ix), - }); - } + (0..NSArray::count(native_screens)).map(move |ix| Screen { + native_screen: native_screens.objectAtIndex(ix), + }) } - screens } /// Convert the given rectangle in screen coordinates from GPUI's /// coordinate system to the AppKit coordinate system. /// - /// In GPUI's coordinates, the origin is at the top left of the main screen, with + /// In GPUI's coordinates, the origin is at the top left of the primary screen, with /// the Y axis pointing downward. In the AppKit coordindate system, the origin is at the - /// bottom left of the main screen, with the Y axis pointing upward. + /// bottom left of the primary screen, with the Y axis pointing upward. pub(crate) fn screen_rect_to_native(rect: RectF) -> NSRect { - let main_screen_height = unsafe { NSScreen::mainScreen(nil).frame().size.height }; + let primary_screen_height = unsafe { Self::primary().native_screen.frame().size.height }; NSRect::new( NSPoint::new( rect.origin_x() as f64, - main_screen_height - rect.origin_y() as f64 - rect.height() as f64, + primary_screen_height - rect.origin_y() as f64 - rect.height() as f64, ), NSSize::new(rect.width() as f64, rect.height() as f64), ) @@ -70,15 +65,15 @@ impl Screen { /// Convert the given rectangle in screen coordinates from the AppKit /// coordinate system to GPUI's coordinate system. /// - /// In GPUI's coordinates, the origin is at the top left of the main screen, with + /// In GPUI's coordinates, the origin is at the top left of the primary screen, with /// the Y axis pointing downward. In the AppKit coordindate system, the origin is at the - /// bottom left of the main screen, with the Y axis pointing upward. + /// bottom left of the primary screen, with the Y axis pointing upward. pub(crate) fn screen_rect_from_native(rect: NSRect) -> RectF { - let main_screen_height = unsafe { NSScreen::mainScreen(nil).frame().size.height }; + let primary_screen_height = unsafe { Self::primary().native_screen.frame().size.height }; RectF::new( vec2f( rect.origin.x as f32, - (main_screen_height - rect.origin.y - rect.size.height) as f32, + (primary_screen_height - rect.origin.y - rect.size.height) as f32, ), vec2f(rect.size.width as f32, rect.size.height as f32), )