Translate coordinates using the primary screen not the main screen

Max Brunsfeld created

Change summary

crates/gpui/src/platform/mac/screen.rs | 45 ++++++++++++---------------
1 file changed, 20 insertions(+), 25 deletions(-)

Detailed changes

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<Self> {
-        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<Self> {
-        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<Item = Self> {
         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),
         )