diff --git a/src/cocoa_init.m b/src/cocoa_init.m index 8779cdfab..06746d4c1 100644 --- a/src/cocoa_init.m +++ b/src/cocoa_init.m @@ -269,4 +269,3 @@ const char* _glfwPlatformGetVersionString(void) return version; } - diff --git a/src/cocoa_monitor.m b/src/cocoa_monitor.m index 50b72a4fb..14c7ed4b8 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); @@ -427,4 +426,3 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle) _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay); return monitor->ns.displayID; } - diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 7e131be66..32d1c213b 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 b5bb4662a..78a50eb9f 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); @@ -1286,4 +1307,3 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle) _GLFW_REQUIRE_INIT_OR_RETURN(nil); return window->ns.object; } -