This commit :
- removes global variables direct access
- better handles Aristo2 retro-compatibility
This commit is contained in:
Didier Korthoudt
2020-10-25 11:44:03 +01:00
parent 39738b9ded
commit fccd76ec4c
4 changed files with 78 additions and 38 deletions
+35 -7
View File
@@ -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.");
}
-3
View File
@@ -46,11 +46,8 @@ CPRunContinuesResponse = -1002;
CPApplicationLegacyOSBehavior = 1;
CPApplicationFollowOSBehavior = 2;
CPApplicationSelectedOSBehavior = CPApplicationLegacyOSBehavior;
CPApplicationShouldMimicWindows = NO;
CPApplicationOSBehaviorDidChangeNotification = @"CPApplicationOSBehaviorDidChangeNotification";
CPApplicationOSBehaviors = @{
@"CPApplicationLegacyOSBehavior": CPApplicationLegacyOSBehavior,
@"CPApplicationFollowOSBehavior": CPApplicationFollowOSBehavior
};
_CPApplicationSimulateWindowsOS = NO;
+5
View File
@@ -3505,6 +3505,11 @@ setBoundsOrigin:
#endif
}
- (BOOL)isCSSBased
{
return [[CPTheme defaultTheme] valueForAttributeWithName:@"css-based" forClass:CPView];
}
@end
+38 -28
View File
@@ -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)