diff --git a/src/cocoa_monitor.m b/src/cocoa_monitor.m index 50b72a4f..a99aa33f 100644 --- a/src/cocoa_monitor.m +++ b/src/cocoa_monitor.m @@ -286,7 +286,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) monitor = _glfwAllocMonitor(name, size.width, size.height); monitor->ns.displayID = displays[i]; - monitor->ns.screen = [screens objectAtIndex:j]; free(name); diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 7e131be6..32d1c213 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -92,7 +92,6 @@ typedef struct _GLFWmonitorNS { CGDirectDisplayID displayID; CGDisplayModeRef previousMode; - id screen; } _GLFWmonitorNS; diff --git a/src/cocoa_window.m b/src/cocoa_window.m index b5bb4662..15a624dc 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -32,6 +32,27 @@ #include +// Returns the screen that is specified by a displayID +// +static NSScreen *getScreen(CGDirectDisplayID displayID) +{ + // NOTE: Apple's documentation of [NSScreen screens] mentions that, + // "The (screens) array should not be cached. Screens can be + // added, removed, or dynamically reconfigured at any time." + // Because of this, we simply obtain the screen from a + // displayID whenever we need it. + NSArray *screens = [NSScreen screens]; + + for(NSScreen *screen in screens) { + NSDictionary *dictionary = [screen deviceDescription]; + NSNumber *number = [dictionary objectForKey:@"NSScreenNumber"]; + if ([number unsignedIntegerValue] == displayID) + return screen; + } + + return nil; +} + // Returns the specified standard cursor // static NSCursor* getStandardCursor(int shape) @@ -89,8 +110,8 @@ static GLboolean enterFullscreenMode(_GLFWwindow* window) // NOTE: The window is resized despite mode setting failure to make // glfwSetWindowSize more robust - [window->ns.object setFrame:[window->monitor->ns.screen frame] - display:YES]; + [window->ns.object setFrame:[getScreen(window->monitor->ns.displayID) frame] + display:YES]; return status; } @@ -838,7 +859,7 @@ static GLboolean createWindow(_GLFWwindow* window, NSRect contentRect; if (wndconfig->monitor) - contentRect = [wndconfig->monitor->ns.screen frame]; + contentRect = [getScreen(wndconfig->monitor->ns.displayID) frame]; else contentRect = NSMakeRect(0, 0, wndconfig->width, wndconfig->height);