* Source/NSWindow.m (initWithContentRect:styleMask:backing:defer:):

added observer of NSApplicationDidChangeScreenParametersNotification.
  (applicationDidChangeScreenParameters:): callback for added notification -
  updates window position, set new screen object and saves frame if
  autosave name exists.

* Source/NSScreen.m (initialize): remove observer of
  NSApplicationDidChangeScreenParametersNotification - NSScreen shouldn't
  do it. Backend explicitely calls -resetScreens before posting notification.
  (_initWithScreenNumber:): ditto.
  (_resetScreens): removed.
  (deviceDescription): removed duplicated addition of NSDeviceSize object.

* Source/NSApplication.m (finishLaunching): remove observer of
  NSApplicationDidChangeScreenParametersNotification.
This commit is contained in:
Sergii Stoian 2020-01-26 03:13:16 +02:00
parent 731abde796
commit d4ea1a490f
4 changed files with 62 additions and 40 deletions

View file

@ -1,3 +1,21 @@
2020-01-26 Sergii Stoian <stoyan255@gmail.com>
* Source/NSWindow.m (initWithContentRect:styleMask:backing:defer:):
added observer of NSApplicationDidChangeScreenParametersNotification.
(applicationDidChangeScreenParameters:): callback for added notification -
updates window position, set new screen object and saves frame if
autosave name exists.
* Source/NSScreen.m (initialize): remove observer of
NSApplicationDidChangeScreenParametersNotification - NSScreen shouldn't
do it. Backend explicitely calls -resetScreens before posting notification.
(_initWithScreenNumber:): ditto.
(_resetScreens): removed.
(deviceDescription): removed duplicated addition of NSDeviceSize object.
* Source/NSApplication.m (finishLaunching): remove observer of
NSApplicationDidChangeScreenParametersNotification.
2020-01-24 Sergii Stoian <stoyan255@gmail.com>
* Source/NSScreen.m (_initWithScreenNumber:): add self as observer to

View file

@ -1100,12 +1100,6 @@ static BOOL _isAutolaunchChecked = NO;
[nc addObserver: self selector: @selector(_windowDidResignMain:)
name: NSWindowDidResignMainNotification object: nil];
/* Register self as observer to window events. */
[nc addObserver: self
selector: @selector(applicationDidChangeScreenParameters:)
name: NSApplicationDidChangeScreenParametersNotification
object: nil];
/* register as observer for hide/unhide notifications */
[[[NSWorkspace sharedWorkspace] notificationCenter]
addObserver: self selector: @selector(_workspaceNotification:)

View file

@ -60,12 +60,7 @@
if (self == [NSScreen class])
{
[self setVersion: 1];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(_resetScreens:)
name: NSApplicationDidChangeScreenParametersNotification
object: nil];
}
}
}
static NSMutableArray *screenArray = nil;
@ -73,11 +68,6 @@ static NSMutableArray *screenArray = nil;
/**
* Resets the cached list of screens.
*/
+ (void) _resetScreens: (NSNotification*)notification
{
[self resetScreens];
}
+ (void) resetScreens
{
DESTROY(screenArray);
@ -228,14 +218,6 @@ static NSMutableArray *screenArray = nil;
_depth = [srv windowDepthForScreen: _screenNumber];
_supportedWindowDepths = NULL;
/* Register self as observer to screen events. */
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(applicationDidChangeScreenParameters:)
name: NSApplicationDidChangeScreenParametersNotification
object: nil];
return self;
}
@ -325,10 +307,6 @@ static NSMutableArray *screenArray = nil;
[devDesc setObject: colorSpaceName
forKey: NSDeviceColorSpaceName];
// Add size. For screen it's resolution (e.g. 1600x1200).
[devDesc setObject: [NSValue valueWithSize: [self frame].size]
forKey: NSDeviceSize];
_reserved = (void*)[devDesc copy];
RELEASE(devDesc);
}
@ -416,7 +394,7 @@ static NSMutableArray *screenArray = nil;
// Release the memory for the depths array.
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
NSLog(@"[NSScreen] dealloc");
// _supportedWindowDepths can be NULL since it may or may not
// be necessary to get this info. The most common use of NSScreen
// is to get the depth and frame attributes.
@ -461,16 +439,6 @@ static NSMutableArray *screenArray = nil;
return 1.0;
}
// This notification callback shouldn't be called. But some objects (NSWindow)
// may retain NSScren instance and not handle screen parameters changes.
// Update our ivars for them.
- (void) applicationDidChangeScreenParameters: (NSNotification*)aNotification
{
GSDisplayServer *srv = GSCurrentServer();
_frame = [srv boundsForScreen: _screenNumber];
_depth = [srv windowDepthForScreen: _screenNumber];
}
@end

View file

@ -1106,6 +1106,10 @@ many times.
selector: @selector(colorListChanged:)
name: NSColorListDidChangeNotification
object: nil];
[nc addObserver: self
selector: @selector(applicationDidChangeScreenParameters:)
name: NSApplicationDidChangeScreenParametersNotification
object: NSApp];
NSDebugLLog(@"NSWindow", @"NSWindow end of init\n");
return self;
@ -2701,6 +2705,44 @@ titleWithRepresentedFilename(NSString *representedFilename)
return _screen;
}
- (void) applicationDidChangeScreenParameters: (NSNotification *)aNotif
{
NSSize oldScreenSize = [_screen frame].size;
int screenNumber = [_screen screenNumber];
NSSize newScreenSize;
NSRect newFrame;
// NSLog(@"[NSWindow - %@] Old/New Screen RC: %lu/%lu",
// [self className], [_screen retainCount],
// [[[NSScreen screens] objectAtIndex: 0] retainCount]);
// We need to get new screen from renewed screen list because
// [NSScreen mainScreen] returns NSScreen object of key window and that object
// will never be released.
for (NSScreen *scr in [NSScreen screens])
{
if ([scr screenNumber] == screenNumber)
ASSIGN(_screen, scr);
}
// Do not adjust frame for mini and appicon windows - it's a WM's job.
if ([self isKindOfClass: [NSMiniWindow class]] || self == [NSApp iconWindow])
return;
newScreenSize = [_screen frame].size;
// NSLog(@"[NSWindow - %@] Old/New Screen (%lu): %.0f/%.0f",
// [self className], [_screen retainCount],
// oldScreenSize.width, newScreenSize.width);
newFrame = _frame;
newFrame.origin.y += newScreenSize.height - oldScreenSize.height;
[self setFrame: newFrame display: NO];
if (_autosaveName != nil)
{
[self saveFrameUsingName: _autosaveName];
}
}
- (void) setDepthLimit: (NSWindowDepth)limit
{
if (limit == 0)