Implement MonitorId::get_hidpi_factor for macOS (#410)

* Implement MonitorId::get_hidpi_factor for macOS

* Added changelog entry
This commit is contained in:
Nicholas Lordello 2018-03-06 09:35:04 +01:00 committed by Pierre Krieger
parent 4c62d71950
commit f3d43016ad
4 changed files with 47 additions and 27 deletions

View file

@ -1,6 +1,10 @@
use cocoa::appkit::NSScreen;
use cocoa::base::{id, nil};
use cocoa::foundation::{NSString, NSUInteger};
use core_graphics::display::{CGDirectDisplayID, CGDisplay};
use std::collections::VecDeque;
use super::EventsLoop;
use super::window::IdRef;
#[derive(Clone)]
pub struct MonitorId(CGDirectDisplayID);
@ -51,8 +55,35 @@ impl MonitorId {
unimplemented!()
}
#[inline]
pub fn get_hidpi_factor(&self) -> f32 {
1.0
let screen = match self.get_nsscreen() {
Some(screen) => screen,
None => return 1.0, // default to 1.0 when we can't find the screen
};
unsafe { NSScreen::backingScaleFactor(screen) as f32 }
}
pub(crate) fn get_nsscreen(&self) -> Option<id> {
unsafe {
let native_id = self.get_native_identifier();
let screens = NSScreen::screens(nil);
let count: NSUInteger = msg_send![screens, count];
let key = IdRef::new(NSString::alloc(nil).init_str("NSScreenNumber"));
let mut matching_screen: Option<id> = None;
for i in 0..count {
let screen = msg_send![screens, objectAtIndex: i as NSUInteger];
let device_description = NSScreen::deviceDescription(screen);
let value: id = msg_send![device_description, objectForKey:*key];
if value != nil {
let screen_number: NSUInteger = msg_send![value, unsignedIntegerValue];
if screen_number as u32 == native_id {
matching_screen = Some(screen);
break;
}
}
}
matching_screen
}
}
}