From fccd76ec4c7094e86097e75ba021dfbed6527010 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Sun, 25 Oct 2020 11:44:03 +0100 Subject: [PATCH] v02 This commit : - removes global variables direct access - better handles Aristo2 retro-compatibility --- AppKit/CPApplication.j | 42 +++++++++++++--- AppKit/CPApplication_Constants.j | 3 -- AppKit/CPView.j | 5 ++ AppKit/CPWindow/_CPStandardWindowView.j | 66 ++++++++++++++----------- 4 files changed, 78 insertions(+), 38 deletions(-) diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index 52d4f2bb2..54400d0a4 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -122,6 +122,10 @@ var CPApplicationDelegate_applicationShouldTerminate_ = 1 << 0, CPPanel _aboutPanel; CPThemeBlend _themeBlend @accessors(property=themeBlend); + + // OS behavior + CPApplicationOSBehavior _OSBehavior; + BOOL _simulatesWindows; } /*! @@ -154,6 +158,9 @@ var CPApplicationDelegate_applicationShouldTerminate_ = 1 << 0, _eventListenerInsertionIndex = 0; _windows = [[CPNull null]]; + + _OSBehavior = CPApplicationLegacyOSBehavior; + _simulatesWindows = NO; } return self; @@ -1264,7 +1271,7 @@ var CPApplicationDelegate_applicationShouldTerminate_ = 1 << 0, } // See CPApplication_Constants.j for comments -+ (void)setOSBehavior:(CPApplicationOSBehavior)anOSBehavior +- (void)setOSBehavior:(CPApplicationOSBehavior)anOSBehavior { // Verify if provided OS behavior is valid if ([[CPApplicationOSBehaviors allKeysForObject:anOSBehavior] count] == 0) @@ -1273,13 +1280,34 @@ var CPApplicationDelegate_applicationShouldTerminate_ = 1 << 0, return; } - CPApplicationSelectedOSBehavior = anOSBehavior; - CPApplicationShouldMimicWindows = (CPApplicationSelectedOSBehavior == CPApplicationFollowOSBehavior) - && (CPBrowserIsOperatingSystem(CPWindowsOperatingSystem) || _CPApplicationSimulateWindowsOS); + _OSBehavior = anOSBehavior; [[CPNotificationCenter defaultCenter] postNotificationName:CPApplicationOSBehaviorDidChangeNotification object:CPApp userInfo:nil]; } +- (CPApplicationOSBehavior)OSBehavior +{ + return _OSBehavior; +} + +- (BOOL)shouldMimicWindows +{ + return (_OSBehavior == CPApplicationFollowOSBehavior) && (CPBrowserIsOperatingSystem(CPWindowsOperatingSystem) || _simulatesWindows); +} + +- (void)setSimulatesWindows:(BOOL)shouldSimulateWindows +{ + if (_simulatesWindows === shouldSimulateWindows) + return; + + _simulatesWindows = shouldSimulateWindows; +} + +- (BOOL)simulatesWindows +{ + return _simulatesWindows; +} + @end var _CPModalSessionMake = function(aWindow, aStopCode) @@ -1409,7 +1437,7 @@ var _CPAppBootstrapperActions = nil; [CPTheme setDefaultTheme:[CPTheme themeNamed:[CPApplication defaultThemeName]]]; // Search in the Info.plist if the special CPApplicationSimulateWindowsOS flag is set (for testing) - _CPApplicationSimulateWindowsOS = !![[CPBundle mainBundle] objectForInfoDictionaryKey:"CPApplicationSimulateWindowsOS"]; + [CPApp setSimulatesWindows:!![[CPBundle mainBundle] objectForInfoDictionaryKey:"CPApplicationSimulateWindowsOS"]]; // Before loading the main CIB, try to find if a CPApplicationOSBehavior is specified in the Info.plist or in the user defaults // (with user defaults precedence). Value stored must be a string representing the name of the OS behavior. @@ -1421,7 +1449,7 @@ var _CPAppBootstrapperActions = nil; var osBehavior = [CPApplicationOSBehaviors objectForKey:userOSBehavior]; if (osBehavior) - [CPApplication setOSBehavior:osBehavior]; + [CPApp setOSBehavior:osBehavior]; else CPLog.warn("Invalid CPApplicationOSBehavior specified in user defaults (found:"+userOSBehavior+"). Ignored."); } @@ -1431,7 +1459,7 @@ var _CPAppBootstrapperActions = nil; var osBehavior = [CPApplicationOSBehaviors objectForKey:plistOSBehavior]; if (osBehavior) - [CPApplication setOSBehavior:osBehavior]; + [CPApp setOSBehavior:osBehavior]; else CPLog.warn("Invalid CPApplicationOSBehavior specified in Info.plist (found:"+plistOSBehavior+"). Ignored."); } diff --git a/AppKit/CPApplication_Constants.j b/AppKit/CPApplication_Constants.j index a35d88bbe..89e939f62 100644 --- a/AppKit/CPApplication_Constants.j +++ b/AppKit/CPApplication_Constants.j @@ -46,11 +46,8 @@ CPRunContinuesResponse = -1002; CPApplicationLegacyOSBehavior = 1; CPApplicationFollowOSBehavior = 2; -CPApplicationSelectedOSBehavior = CPApplicationLegacyOSBehavior; -CPApplicationShouldMimicWindows = NO; CPApplicationOSBehaviorDidChangeNotification = @"CPApplicationOSBehaviorDidChangeNotification"; CPApplicationOSBehaviors = @{ @"CPApplicationLegacyOSBehavior": CPApplicationLegacyOSBehavior, @"CPApplicationFollowOSBehavior": CPApplicationFollowOSBehavior }; -_CPApplicationSimulateWindowsOS = NO; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 847bb5af5..9219f7534 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -3505,6 +3505,11 @@ setBoundsOrigin: #endif } +- (BOOL)isCSSBased +{ + return [[CPTheme defaultTheme] valueForAttributeWithName:@"css-based" forClass:CPView]; +} + @end diff --git a/AppKit/CPWindow/_CPStandardWindowView.j b/AppKit/CPWindow/_CPStandardWindowView.j index 93c298ae1..ff0944be2 100644 --- a/AppKit/CPWindow/_CPStandardWindowView.j +++ b/AppKit/CPWindow/_CPStandardWindowView.j @@ -317,7 +317,9 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; { if (shouldRefreshLayout) { - if (CPApplicationShouldMimicWindows) + var mimicWindows = [CPApp shouldMimicWindows]; + + if (mimicWindows) [self setThemeState:CPThemeStateWindowsPlatform]; else [self unsetThemeState:CPThemeStateWindowsPlatform]; @@ -336,7 +338,29 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; delta1, delta2; - if (CPApplicationShouldMimicWindows) + // For retro-compatibility + if (![self isCSSBased]) + { + if (mimicWindows) + { + // There's no zoom button in Aristo2 + closeThemeOrigin = CGPointMake(-24.0, 8.0); + minimizeThemeOrigin = CGPointMake(-43.0, 8.0); + + // FIXME: if someone designs a zoom button in Aristo2 one day, use those values + // closeThemeOrigin = CGPointMake(-24.0, 8.0); + // minimizeThemeOrigin = CGPointMake(-62.0, 8.0); + // zoomThemeOrigin = CGPointMake(-43.0, 8.0); + } + else + { + closeThemeOrigin = CGPointMake(8.0, 8.0); + minimizeThemeOrigin = CGPointMake(27.0, 8.0); + zoomThemeOrigin = CGPointMake(46.0, 8.0); + } + } + + if (mimicWindows) { offset = [self bounds].size.width; mask = CPViewMinXMargin; @@ -359,15 +383,12 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; // For retro-compatibility: if (!closeThemeSize) - { - closeThemeSize = CGSizeMake(16.0, 16.0); - closeThemeOrigin = CGPointMake(8.0, 8.0); - } + closeThemeSize = CGSizeMake(16.0, 16.0); [_closeButton setFrame:CGRectMake(closeThemeOrigin.x + offset, closeThemeOrigin.y, closeThemeSize.width, closeThemeSize.height)]; [_closeButton setAutoresizingMask:mask]; - _buttonsWidth = ABS(closeThemeOrigin.x) + (CPApplicationShouldMimicWindows ? 0 : closeThemeSize.width); + _buttonsWidth = ABS(closeThemeOrigin.x) + (mimicWindows ? 0 : closeThemeSize.width); } else { @@ -375,7 +396,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; zoomThemeOrigin.x -= delta1; } - if (CPApplicationShouldMimicWindows) + if (mimicWindows) { if (_styleMask & CPResizableWindowMask) { @@ -383,10 +404,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; // For retro-compatibility: if (!zoomThemeSize) - { - zoomThemeSize = CGSizeMake(16.0, 16.0); - zoomThemeOrigin = CGPointMake(46.0, 8.0); - } + zoomThemeSize = CGSizeMake(16.0, 16.0); [_zoomButton setFrame:CGRectMake(zoomThemeOrigin.x + offset, zoomThemeOrigin.y, zoomThemeSize.width, zoomThemeSize.height)]; [_zoomButton setAutoresizingMask:mask]; @@ -402,10 +420,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; // For retro-compatibility: if (!minimizeThemeSize) - { - minimizeThemeSize = CGSizeMake(16.0, 16.0); - minimizeThemeOrigin = CGPointMake(27.0, 8.0); - } + minimizeThemeSize = CGSizeMake(16.0, 16.0); [_minimizeButton setFrame:CGRectMake(minimizeThemeOrigin.x + offset, minimizeThemeOrigin.y, minimizeThemeSize.width, minimizeThemeSize.height)]; [_minimizeButton setAutoresizingMask:mask]; @@ -424,10 +439,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; // For retro-compatibility: if (!minimizeThemeSize) - { - minimizeThemeSize = CGSizeMake(16.0, 16.0); - minimizeThemeOrigin = CGPointMake(27.0, 8.0); - } + minimizeThemeSize = CGSizeMake(16.0, 16.0); [_minimizeButton setFrame:CGRectMake(minimizeThemeOrigin.x + offset, minimizeThemeOrigin.y, minimizeThemeSize.width, minimizeThemeSize.height)]; [_minimizeButton setAutoresizingMask:mask]; @@ -443,10 +455,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; // For retro-compatibility: if (!zoomThemeSize) - { - zoomThemeSize = CGSizeMake(16.0, 16.0); - zoomThemeOrigin = CGPointMake(46.0, 8.0); - } + zoomThemeSize = CGSizeMake(16.0, 16.0); [_zoomButton setFrame:CGRectMake(zoomThemeOrigin.x + offset, zoomThemeOrigin.y, zoomThemeSize.width, zoomThemeSize.height)]; [_zoomButton setAutoresizingMask:mask]; @@ -567,7 +576,8 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; - (void)layoutSubviews { - var width = [self bounds].size.width; + var width = [self bounds].size.width, + mimicWindows = [CPApp shouldMimicWindows]; [super layoutSubviews]; @@ -582,9 +592,9 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; if (width - 2 * _buttonsWidth < _minimumTitleFieldSize) { if (width - _buttonsWidth - _titleMargin < _minimumTitleFieldSize) - [_titleField setFrame:CGRectMake((CPApplicationShouldMimicWindows ? _titleMargin : _buttonsWidth), 0, width - _buttonsWidth - _titleMargin, _titleBarHeight)]; + [_titleField setFrame:CGRectMake((mimicWindows ? _titleMargin : _buttonsWidth), 0, width - _buttonsWidth - _titleMargin, _titleBarHeight)]; else - [_titleField setFrame:CGRectMake((CPApplicationShouldMimicWindows ? width - _buttonsWidth - _minimumTitleFieldSize : _buttonsWidth), 0, _minimumTitleFieldSize, _titleBarHeight)]; + [_titleField setFrame:CGRectMake((mimicWindows ? width - _buttonsWidth - _minimumTitleFieldSize : _buttonsWidth), 0, _minimumTitleFieldSize, _titleBarHeight)]; } } @@ -654,7 +664,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; var triggeredButton = [[anEvent trackingArea] userInfo], state = CPThemeStateHovered; - if (CPApplicationShouldMimicWindows) + if ([CPApp shouldMimicWindows]) state = state.and(CPThemeStateWindowsPlatform); if (triggeredButton === _closeButton)