mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-05 10:20:51 +00:00
Translate coordinates using the primary screen not the main screen
This commit is contained in:
parent
6eba0ef630
commit
cd2ef784ea
1 changed files with 20 additions and 25 deletions
|
@ -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),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue