From 70776fab411a6b8f1b36d1f450b8cf9b56cfbd23 Mon Sep 17 00:00:00 2001 From: Ryan Stewart Date: Mon, 16 Mar 2015 14:09:45 -0700 Subject: honor the passed-in MonitorID when using with_fullscreen() in cocoa backend --- src/cocoa/mod.rs | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) (limited to 'src/cocoa') diff --git a/src/cocoa/mod.rs b/src/cocoa/mod.rs index 5aa34fa..825f6f3 100644 --- a/src/cocoa/mod.rs +++ b/src/cocoa/mod.rs @@ -8,6 +8,7 @@ use libc; use Api; use BuilderAttribs; use GlRequest; +use NativeMonitorID; use cocoa::base::{Class, id, YES, NO, NSUInteger, nil, objc_allocateClassPair, class, objc_registerClassPair}; use cocoa::base::{selector, msg_send, msg_send_stret, class_addMethod, class_addIvar}; @@ -406,15 +407,41 @@ impl Window { fn create_window(dimensions: (u32, u32), title: &str, monitor: Option) -> Option { unsafe { - let frame = if monitor.is_some() { - let screen = NSScreen::mainScreen(nil); - NSScreen::frame(screen) - } else { - let (width, height) = dimensions; - NSRect::new(NSPoint::new(0., 0.), NSSize::new(width as f64, height as f64)) + let screen = monitor.map(|monitor_id| { + let native_id = match monitor_id.get_native_identifier() { + NativeMonitorID::Numeric(num) => num, + _ => panic!("OS X monitors should always have a numeric native ID") + }; + let matching_screen = { + let screens = NSScreen::screens(nil); + let count: NSUInteger = msg_send()(screens, selector("count")); + let key = IdRef::new(NSString::alloc(nil).init_str("NSScreenNumber")); + let mut matching_screen: Option = None; + for i in range(0, count) { + let screen = msg_send()(screens, selector("objectAtIndex:"), i as NSUInteger); + let device_description = NSScreen::deviceDescription(screen); + let value = msg_send()(device_description, selector("objectForKey:"), *key); + if value != nil { + let screen_number: NSUInteger = msg_send()(value, selector("unsignedIntValue")); + if screen_number as u32 == native_id { + matching_screen = Some(screen); + break; + } + } + } + matching_screen + }; + matching_screen.unwrap_or(NSScreen::mainScreen(nil)) + }); + let frame = match screen { + Some(screen) => NSScreen::frame(screen), + None => { + let (width, height) = dimensions; + NSRect::new(NSPoint::new(0., 0.), NSSize::new(width as f64, height as f64)) + } }; - let masks = if monitor.is_some() { + let masks = if screen.is_some() { NSBorderlessWindowMask as NSUInteger } else { NSTitledWindowMask as NSUInteger | @@ -436,7 +463,7 @@ impl Window { let title = IdRef::new(NSString::alloc(nil).init_str(title)); window.setTitle_(*title); window.setAcceptsMouseMovedEvents_(YES); - if monitor.is_some() { + if screen.is_some() { window.setLevel_(NSMainMenuWindowLevel as i64 + 1); } else { -- cgit v1.2.3