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 Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit