Revision: 15347
http://sourceforge.net/p/skim-app/code/15347
Author: hofman
Date: 2025-06-02 15:31:32 +0000 (Mon, 02 Jun 2025)
Log Message:
-----------
Always use cross fade animation for full screen, e.g. for smooth animation to
different full screen setup or background color
Modified Paths:
--------------
trunk/SKMainWindowController.m
trunk/SKMainWindowController_FullScreen.m
Modified: trunk/SKMainWindowController.m
===================================================================
--- trunk/SKMainWindowController.m 2025-06-02 14:35:22 UTC (rev 15346)
+++ trunk/SKMainWindowController.m 2025-06-02 15:31:32 UTC (rev 15347)
@@ -152,7 +152,6 @@
#define SCROLLPOINT_KEY @"scrollPoint"
#define LOCKED_KEY @"locked"
#define CROPBOXES_KEY @"cropBpxes"
-#define USECUSTOMANIMATION_KEY @"useCustomAnimation"
#define TRANSITION_KEY @"transition"
#define PAGETRANSITIONS_KEY @"pageTransitions"
@@ -614,7 +613,7 @@
[setup addEntriesFromDictionary:[pdfView displaySettings]];
if ([self interactionMode] != SKNormalMode || [[pdfView document]
isLocked]) {
[setup addEntriesFromDictionary:savedNormalSetup];
- [setup removeObjectsForKeys:@[HASHORIZONTALSCROLLER_KEY,
HASVERTICALSCROLLER_KEY, AUTOHIDESSCROLLERS_KEY, DRAWSBACKGROUND_KEY,
TABGROUP_KEY, TABINDEX_KEY, USECUSTOMANIMATION_KEY, LOCKED_KEY]];
+ [setup removeObjectsForKeys:@[HASHORIZONTALSCROLLER_KEY,
HASVERTICALSCROLLER_KEY, AUTOHIDESSCROLLERS_KEY, DRAWSBACKGROUND_KEY,
TABGROUP_KEY, TABINDEX_KEY, LOCKED_KEY]];
}
return setup;
Modified: trunk/SKMainWindowController_FullScreen.m
===================================================================
--- trunk/SKMainWindowController_FullScreen.m 2025-06-02 14:35:22 UTC (rev
15346)
+++ trunk/SKMainWindowController_FullScreen.m 2025-06-02 15:31:32 UTC (rev
15347)
@@ -77,7 +77,6 @@
#define DRAWSBACKGROUND_KEY @"drawsBackground"
#define TABGROUP_KEY @"tabGroup"
#define TABINDEX_KEY @"tabIndex"
-#define USECUSTOMANIMATION_KEY @"useCustomAnimation"
#define SKAutoHideToolbarInFullScreenKey @"SKAutoHideToolbarInFullScreen"
#define SKResizablePresentationKey @"SKResizablePresentation"
@@ -540,13 +539,7 @@
return 0.0;
}
-static inline void setAlphaValueOfTitleBarControls(NSWindow *window, CGFloat
alpha, BOOL animate) {
- for (NSView *view in [[[window standardWindowButton:NSWindowCloseButton]
superview] subviews])
- if ([view isKindOfClass:[NSControl class]])
- [(animate ? (id)[view animator] : (id)view) setAlphaValue:alpha];
-}
-
-- (NSArray *)customWindowsToEnterOrExitFullScreen:(BOOL)force {
+- (NSArray *)customWindowsToEnterOrExitFullScreen {
NSMutableArray *windows = [NSMutableArray array];
for (NSWindowController *wc in [[self document] windowControllers]) {
NSWindow *window = [wc window];
@@ -553,12 +546,8 @@
if ([window isVisible])
[windows addObject:window];
}
- if (force == NO && [windows count] == 1)
- return nil;
- if ([[NSWorkspace sharedWorkspace]
accessibilityDisplayShouldReduceMotion]) {
- savedNormalWindow = [[SKAnimatedBorderlessWindow alloc]
initWithContentRect:[[self window] frame]];
- [windows addObject:savedNormalWindow];
- }
+ savedNormalWindow = [[SKAnimatedBorderlessWindow alloc]
initWithContentRect:[[self window] frame]];
+ [windows addObject:savedNormalWindow];
return windows;
}
@@ -603,72 +592,56 @@
}
- (NSArray *)customWindowsToEnterFullScreenForWindow:(NSWindow *)window {
- return [self customWindowsToEnterOrExitFullScreen:NO];
+ return [self customWindowsToEnterOrExitFullScreen];
}
- (void)window:(NSWindow *)window
startCustomAnimationToEnterFullScreenWithDuration:(NSTimeInterval)duration {
- [savedNormalSetup setObject:@YES forKey:USECUSTOMANIMATION_KEY];
- BOOL showToolbarInFullscreeen = [[window toolbar] isVisible] &&
autoHideToolbarInFullScreen() == NO;
- if (fullScreenToolbarOffset <= 0.0 && showToolbarInFullscreeen)
- fullScreenToolbarOffset = toolbarViewOffset(window);
NSRect frame = [[window screen] frame];
if ([[NSUserDefaults standardUserDefaults]
boolForKey:AppleMenuBarVisibleInFullscreenKey])
frame.size.height -= [[NSApp mainMenu] menuBarHeight] ?: 24.0;
- if (savedNormalWindow != nil) {
- NSWindow *displayWindow = savedNormalWindow;
- savedNormalWindow = nil;
- [self displayStaticContentInWindow:displayWindow
ordered:NSWindowBelow];
- NSTitlebarAccessoryViewController *noteToolbar = nil;
- CALayer *blackLayer = nil;
- if (showToolbarInFullscreeen) {
- CGFloat offset = fullScreenOffset(window);
- frame.size.height += offset;
- NSUInteger i = noteToolbarController ? [[window
titlebarAccessoryViewControllers] indexOfObject:noteToolbarController] :
NSNotFound;
- if (i != NSNotFound) {
- noteToolbar = noteToolbarController;
- [window removeTitlebarAccessoryViewControllerAtIndex:i];
- }
- [(SKMainWindow *)window setDisableConstrainedFrame:YES];
- [window setFrame:frame display:YES];
- [(SKMainWindow *)window setDisableConstrainedFrame:NO];
- blackLayer = [CALayer layer];
- [blackLayer
setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
- [blackLayer setZPosition:1.0];
- [blackLayer setFrame:SKSliceRect([window
convertRectFromScreen:frame], offset, NSMaxYEdge)];
- [[[[window contentView] superview] layer] addSublayer:blackLayer];
- setAlphaValueOfTitleBarControls(window, 0.0, NO);
- [self windowWillEnterFullScreenStyle:window];
- } else {
- [window setStyleMask:[window styleMask] |
NSWindowStyleMaskFullScreen];
- [window setFrame:frame display:YES];
+ NSWindow *displayWindow = savedNormalWindow;
+ savedNormalWindow = nil;
+ [self displayStaticContentInWindow:displayWindow ordered:NSWindowBelow];
+ NSTitlebarAccessoryViewController *noteToolbar = nil;
+ CALayer *blackLayer = nil;
+ if ([[window toolbar] isVisible] && autoHideToolbarInFullScreen() == NO) {
+ if (fullScreenToolbarOffset <= 0.0)
+ fullScreenToolbarOffset = toolbarViewOffset(window);
+ CGFloat offset = fullScreenOffset(window);
+ frame.size.height += offset;
+ NSUInteger i = noteToolbarController ? [[window
titlebarAccessoryViewControllers] indexOfObject:noteToolbarController] :
NSNotFound;
+ if (i != NSNotFound) {
+ noteToolbar = noteToolbarController;
+ [window removeTitlebarAccessoryViewControllerAtIndex:i];
}
- [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
- [context setDuration:duration];
- [context setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
- [[window animator] setAlphaValue:1.0];
- }
- completionHandler:^{
- [displayWindow orderOut:nil];
- [blackLayer removeFromSuperlayer];
- if (noteToolbar)
- [window addTitlebarAccessoryViewController:noteToolbar];
- }];
- } else {
- frame.size.height += fullScreenOffset(window);
[(SKMainWindow *)window setDisableConstrainedFrame:YES];
+ [window setFrame:frame display:YES];
+ [(SKMainWindow *)window setDisableConstrainedFrame:NO];
+ blackLayer = [CALayer layer];
+ [blackLayer setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
+ [blackLayer setZPosition:1.0];
+ [blackLayer setFrame:SKSliceRect([window convertRectFromScreen:frame],
offset, NSMaxYEdge)];
+ [[[[window contentView] superview] layer] addSublayer:blackLayer];
+ for (NSView *view in [[[window
standardWindowButton:NSWindowCloseButton] superview] subviews]) {
+ if ([view isKindOfClass:[NSControl class]])
+ [view setAlphaValue:0.0];
+ }
[self windowWillEnterFullScreenStyle:window];
- [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
- [context setDuration:duration - 0.02];
- if (@available(macOS 12.0, *))
- [[(SKMainWindow *)window animator] setWindowFrame:frame];
- else
- [[window animator] setFrame:frame display:NO];
- setAlphaValueOfTitleBarControls(window, 0.0, YES);
- }
- completionHandler:^{
- [(SKMainWindow *)window setDisableConstrainedFrame:NO];
- }];
+ } else {
+ [window setStyleMask:[window styleMask] | NSWindowStyleMaskFullScreen];
+ [window setFrame:frame display:YES];
}
+ [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
+ [context setDuration:duration];
+ [context setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
+ [[window animator] setAlphaValue:1.0];
+ }
+ completionHandler:^{
+ [displayWindow orderOut:nil];
+ [blackLayer removeFromSuperlayer];
+ if (noteToolbar)
+ [window addTitlebarAccessoryViewController:noteToolbar];
+ }];
}
- (void)windowDidEnterFullScreen:(NSNotification *)notification {
@@ -684,10 +657,8 @@
- (void)windowDidFailToEnterFullScreen:(NSWindow *)window {
[self windowWillExitFullScreenStyle:window];
- if ([[pdfView document] isLocked] == NO || [savedNormalSetup count] < 3)
+ if ([[pdfView document] isLocked] == NO || [savedNormalSetup count] == 1)
[savedNormalSetup removeAllObjects];
- else
- [savedNormalSetup removeObjectForKey:USECUSTOMANIMATION_KEY];
[self forceSubwindowsOnTop:NO];
savedNormalWindow = nil;
mwcFlags.isSwitchingFullScreen = 0;
@@ -698,47 +669,29 @@
}
- (NSArray *)customWindowsToExitFullScreenForWindow:(NSWindow *)window {
- return [self customWindowsToEnterOrExitFullScreen:[[savedNormalSetup
objectForKey:USECUSTOMANIMATION_KEY] boolValue]];
+ return [self customWindowsToEnterOrExitFullScreen];
}
- (void)window:(NSWindow *)window
startCustomAnimationToExitFullScreenWithDuration:(NSTimeInterval)duration {
NSRect frame = NSRectFromString([savedNormalSetup
objectForKey:MAINWINDOWFRAME_KEY]);
- if (savedNormalWindow != nil) {
- BOOL covered = NSContainsRect([window frame], frame);
- NSWindow *displayWindow = savedNormalWindow;
- savedNormalWindow = nil;
- [self displayStaticContentInWindow:displayWindow
ordered:NSWindowAbove];
- [window setStyleMask:[window styleMask] &
~NSWindowStyleMaskFullScreen];
- setAlphaValueOfTitleBarControls(window, 1.0, NO);
- [window setFrame:frame display:YES];
- if (covered)
- [window setAlphaValue:1.0];
- [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
- [context setDuration:duration];
- [context setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
- if (covered == NO)
- [[window animator] setAlphaValue:1.0];
- [[displayWindow animator] setAlphaValue:0.0];
- }
- completionHandler:^{
- [displayWindow orderOut:nil];
- }];
- } else {
- NSRect startFrame = [window frame];
- startFrame.size.height += fullScreenOffset(window);
- [window setStyleMask:[window styleMask] &
~NSWindowStyleMaskFullScreen];
- setAlphaValueOfTitleBarControls(window, 0.0, NO);
- [(SKMainWindow *)window setDisableConstrainedFrame:YES];
- [window setFrame:startFrame display:YES];
- [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
- [context setDuration:duration];
- [[window animator] setFrame:frame display:YES];
- setAlphaValueOfTitleBarControls(window, 1.0, YES);
- }
- completionHandler:^{
- [(SKMainWindow *)window setDisableConstrainedFrame:NO];
- }];
- }
+ BOOL covered = NSContainsRect([window frame], frame);
+ NSWindow *displayWindow = savedNormalWindow;
+ savedNormalWindow = nil;
+ [self displayStaticContentInWindow:displayWindow ordered:NSWindowAbove];
+ [window setStyleMask:[window styleMask] & ~NSWindowStyleMaskFullScreen];
+ [window setFrame:frame display:YES];
+ if (covered)
+ [window setAlphaValue:1.0];
+ [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
+ [context setDuration:duration];
+ [context setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
+ if (covered == NO)
+ [[window animator] setAlphaValue:1.0];
+ [[displayWindow animator] setAlphaValue:0.0];
+ }
+ completionHandler:^{
+ [displayWindow orderOut:nil];
+ }];
}
- (void)windowDidExitFullScreen:(NSNotification *)notification {
@@ -745,10 +698,8 @@
NSString *frameString = [savedNormalSetup
objectForKey:MAINWINDOWFRAME_KEY];
if (frameString)
[[self window] setFrame:NSRectFromString(frameString) display:YES];
- if ([[pdfView document] isLocked] == NO || [savedNormalSetup count] < 3)
+ if ([[pdfView document] isLocked] == NO || [savedNormalSetup count] == 1)
[savedNormalSetup removeAllObjects];
- else
- [savedNormalSetup removeObjectForKey:USECUSTOMANIMATION_KEY];
[self forceSubwindowsOnTop:NO];
mwcFlags.isSwitchingFullScreen = 0;
if (mwcFlags.wantsPresentationOrFullScreen) {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit