diff --git a/Source/NSScreen.m b/Source/NSScreen.m index d00908791..d4e899e88 100644 --- a/Source/NSScreen.m +++ b/Source/NSScreen.m @@ -132,7 +132,7 @@ static NSMutableArray *screenArray = nil; NSWindow *keyWindow; keyWindow = [NSApp keyWindow]; - if (keyWindow != nil) + if ((keyWindow != nil) && ([keyWindow screen] != nil)) { return [keyWindow screen]; } diff --git a/Source/NSWindow.m b/Source/NSWindow.m index ad43df092..43084d754 100644 --- a/Source/NSWindow.m +++ b/Source/NSWindow.m @@ -166,6 +166,7 @@ static GSWindowAnimationDelegate *animationDelegate; - (void) _lossOfKeyOrMainWindow; - (NSView *) _windowView; - (NSScreen *) _screenForFrame: (NSRect)frame; +- (NSScreen*) _screen; @end @implementation NSWindow (GNUstepPrivate) @@ -412,6 +413,16 @@ has blocked and waited for events. return theScreen; } +- (NSScreen*) _screen +{ + // Internal support method to allow 'screen' method to adhere to Cocoa behavior + // i.e. screen CAN return nil if no part of window shows up on screen + NSScreen *screen = [self screen]; + if (screen == nil) + screen = [NSScreen mainScreen]; + return screen; +} + @end @@ -1372,7 +1383,7 @@ titleWithRepresentedFilename(NSString *representedFilename) - (NSDictionary*) deviceDescription { - return [[self screen] deviceDescription]; + return [[self _screen] deviceDescription]; } - (NSGraphicsContext*) graphicsContext @@ -1382,15 +1393,14 @@ titleWithRepresentedFilename(NSString *representedFilename) - (CGFloat) userSpaceScaleFactor { - if (_styleMask & NSUnscaledWindowMask) + if ((_styleMask & NSUnscaledWindowMask) || (_screen == nil)) { return 1.0; } - else if (_screen != nil) + else { return [_screen userSpaceScaleFactor]; } - return 1.0; } - (NSInteger) gState @@ -1802,7 +1812,7 @@ titleWithRepresentedFilename(NSString *representedFilename) && _f.visible == NO) { NSRect nframe = [self constrainFrameRect: _frame - toScreen: [self screen]]; + toScreen: [self _screen]]; [self setFrame: nframe display: NO]; } // create deferred window @@ -2211,7 +2221,7 @@ titleWithRepresentedFilename(NSString *representedFilename) titled windows are constrained */ if (_styleMask & NSTitledWindowMask) { - frameRect = [self constrainFrameRect: frameRect toScreen: [self screen]]; + frameRect = [self constrainFrameRect: frameRect toScreen: [self _screen]]; } // If nothing changes, don't send it to the backend and don't redisplay @@ -4989,10 +4999,7 @@ current key view.
} // If window doesn't show up on any screen then just include main screen frame... - NSScreen *myScreen = [self screen]; - if (myScreen == nil) - myScreen = [NSScreen mainScreen]; - + NSScreen *myScreen = [self _screen]; /* * The screen rectangle should give the area of the screen in which * the window could be placed (ie a rectangle excluding the dock). @@ -5053,7 +5060,7 @@ current key view.
*/ - (BOOL) isZoomed { - NSRect maxRect = [[self screen] visibleFrame]; + NSRect maxRect = [[self _screen] visibleFrame]; if ([_delegate respondsToSelector: @selector(windowWillUseStandardFrame:defaultFrame:)]) { @@ -5092,7 +5099,7 @@ current key view.
*/ - (void) zoom: (id)sender { - NSRect maxRect = [[self screen] visibleFrame]; + NSRect maxRect = [[self _screen] visibleFrame]; if ([_delegate respondsToSelector: @selector(windowWillUseStandardFrame:defaultFrame:)]) { @@ -5103,7 +5110,7 @@ current key view.
maxRect = [self windowWillUseStandardFrame: self defaultFrame: maxRect]; } - maxRect = [self constrainFrameRect: maxRect toScreen: [self screen]]; + maxRect = [self constrainFrameRect: maxRect toScreen: [self _screen]]; // Compare the new frame with the current one if ((abs(NSMaxX(maxRect) - NSMaxX(_frame)) < DIST)