Translate coordinates using the primary screen not the main screen

This commit is contained in:
Max Brunsfeld 2023-08-17 16:12:52 -07:00
parent 6eba0ef630
commit cd2ef784ea

View file

@ -25,43 +25,38 @@ pub struct Screen {
} }
impl Screen { impl Screen {
/// Get the screen with the given UUID.
pub fn find_by_id(uuid: Uuid) -> Option<Self> { pub fn find_by_id(uuid: Uuid) -> Option<Self> {
unsafe { Self::all().find(|screen| platform::Screen::display_uuid(screen) == Some(uuid))
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))
}
} }
pub fn all() -> Vec<Self> { /// Get the primary screen - the one with the menu bar, and whose bottom left
let mut screens = Vec::new(); /// 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 { unsafe {
let native_screens = NSScreen::screens(nil); let native_screens = NSScreen::screens(nil);
for ix in 0..NSArray::count(native_screens) { (0..NSArray::count(native_screens)).map(move |ix| Screen {
screens.push(Screen {
native_screen: native_screens.objectAtIndex(ix), native_screen: native_screens.objectAtIndex(ix),
}); })
} }
} }
screens
}
/// Convert the given rectangle in screen coordinates from GPUI's /// Convert the given rectangle in screen coordinates from GPUI's
/// coordinate system to the AppKit coordinate system. /// 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 /// 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 { 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( NSRect::new(
NSPoint::new( NSPoint::new(
rect.origin_x() as f64, 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), 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 /// Convert the given rectangle in screen coordinates from the AppKit
/// coordinate system to GPUI's coordinate system. /// 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 /// 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 { 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( RectF::new(
vec2f( vec2f(
rect.origin.x as f32, 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), vec2f(rect.size.width as f32, rect.size.height as f32),
) )