mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-22 13:10:59 +00:00
* 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:
parent
731abde796
commit
d4ea1a490f
4 changed files with 62 additions and 40 deletions
18
ChangeLog
18
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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:)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue