Revision: 15276 http://sourceforge.net/p/skim-app/code/15276 Author: hofman Date: 2025-05-24 16:18:27 +0000 (Sat, 24 May 2025) Log Message: ----------- move screen method to NSScreen category
Modified Paths: -------------- trunk/NSScreen_SKExtensions.h trunk/NSScreen_SKExtensions.m trunk/SKMainWindowController_FullScreen.m Modified: trunk/NSScreen_SKExtensions.h =================================================================== --- trunk/NSScreen_SKExtensions.h 2025-05-24 15:50:56 UTC (rev 15275) +++ trunk/NSScreen_SKExtensions.h 2025-05-24 16:18:27 UTC (rev 15276) @@ -50,6 +50,8 @@ @property (nonatomic, readonly) NSScreen *primaryScreen; +@property (nonatomic, readonly) NSArray<NSScreen *> *alternateScreens; + @property (class, readonly) CGFloat maxBackingScaleFactor; @end Modified: trunk/NSScreen_SKExtensions.m =================================================================== --- trunk/NSScreen_SKExtensions.m 2025-05-24 15:50:56 UTC (rev 15275) +++ trunk/NSScreen_SKExtensions.m 2025-05-24 16:18:27 UTC (rev 15276) @@ -102,6 +102,37 @@ return self; } +static inline BOOL insufficientScreenSize(NSValue *value) { + NSSize size = [value sizeValue]; + return size.height < 100.0 || size.width < 100.0; +} + +- (NSArray *)alternateScreens { + NSMutableDictionary *screens = [NSMutableDictionary dictionary]; + NSMutableArray *screenNumbers = [NSMutableArray array]; + NSNumber *screenNumber = nil; + for (NSScreen *aScreen in [NSScreen screens]) { + NSDictionary *deviceDescription = [aScreen deviceDescription]; + if ([deviceDescription objectForKey:NSDeviceIsScreen] == nil || + insufficientScreenSize([deviceDescription objectForKey:NSDeviceSize])) + continue; + NSNumber *aScreenNumber = [deviceDescription objectForKey:@"NSScreenNumber"]; + [screens setObject:aScreen forKey:aScreenNumber]; + CGDirectDisplayID displayID = (CGDirectDisplayID)[aScreenNumber unsignedIntValue]; + displayID = CGDisplayMirrorsDisplay(displayID); + if (displayID == kCGNullDirectDisplay) + [screenNumbers addObject:aScreenNumber]; + if ([aScreen isEqual:self]) + screenNumber = displayID == kCGNullDirectDisplay ? aScreenNumber : [NSNumber numberWithUnsignedInt:displayID]; + } + NSMutableArray *alternateScreens = [NSMutableArray array]; + for (NSNumber *aScreenNumber in screenNumbers) { + if ([aScreenNumber isEqual:screenNumber] == NO) + [alternateScreens addObject:[screens objectForKey:aScreenNumber]]; + } + return alternateScreens; +} + + (CGFloat)maxBackingScaleFactor { CGFloat scale = 1.0; for (NSScreen *screen in [NSScreen screens]) { Modified: trunk/SKMainWindowController_FullScreen.m =================================================================== --- trunk/SKMainWindowController_FullScreen.m 2025-05-24 15:50:56 UTC (rev 15275) +++ trunk/SKMainWindowController_FullScreen.m 2025-05-24 16:18:27 UTC (rev 15276) @@ -143,7 +143,7 @@ } } -#pragma mark Custom Full Screen Windows +#pragma mark Presentation Support Methods - (BOOL)handleRightMouseDown:(NSEvent *)theEvent { if ([self interactionMode] == SKPresentationMode) { @@ -153,44 +153,6 @@ return NO; } -- (void)forceSubwindowsOnTop:(BOOL)flag { - for (NSWindowController *wc in [[self document] windowControllers]) { - if ([wc respondsToSelector:@selector(setForceOnTop:)] && wc != presentationPreview) - [(id)wc setForceOnTop:flag]; - } -} - -static inline BOOL insufficientScreenSize(NSValue *value) { - NSSize size = [value sizeValue]; - return size.height < 100.0 || size.width < 100.0; -} - -- (NSArray *)alternateScreensForScreen:(NSScreen *)screen { - NSMutableDictionary *screens = [NSMutableDictionary dictionary]; - NSMutableArray *screenNumbers = [NSMutableArray array]; - NSNumber *screenNumber = nil; - for (NSScreen *aScreen in [NSScreen screens]) { - NSDictionary *deviceDescription = [aScreen deviceDescription]; - if ([deviceDescription objectForKey:NSDeviceIsScreen] == nil || - insufficientScreenSize([deviceDescription objectForKey:NSDeviceSize])) - continue; - NSNumber *aScreenNumber = [deviceDescription objectForKey:@"NSScreenNumber"]; - [screens setObject:aScreen forKey:aScreenNumber]; - CGDirectDisplayID displayID = (CGDirectDisplayID)[aScreenNumber unsignedIntValue]; - displayID = CGDisplayMirrorsDisplay(displayID); - if (displayID == kCGNullDirectDisplay) - [screenNumbers addObject:aScreenNumber]; - if ([aScreen isEqual:screen]) - screenNumber = displayID == kCGNullDirectDisplay ? aScreenNumber : [NSNumber numberWithUnsignedInt:displayID]; - } - NSMutableArray *alternateScreens = [NSMutableArray array]; - for (NSNumber *aScreenNumber in screenNumbers) { - if ([aScreenNumber isEqual:screenNumber] == NO) - [alternateScreens addObject:[screens objectForKey:aScreenNumber]]; - } - return alternateScreens; -} - - (void)showNotesForPresentationWindow:(NSWindow *)window { PDFDocument *pdfDoc = [[self presentationNotesDocument] pdfDocument]; NSInteger offset = [self presentationNotesOffset]; @@ -201,7 +163,7 @@ [presentationPreview setDelegate:self]; NSScreen *screen = [window screen]; - screen = [[self alternateScreensForScreen:screen] firstObject] ?: screen; + screen = [[screen alternateScreens] firstObject] ?: screen; [presentationPreview setPdfDocument:[pdfView document] previewPageNumber:pageIndex @@ -214,43 +176,6 @@ [self addPresentationNotesNavigation]; } -- (void)displayStaticContentForWindow:(NSWindow *)window { - NSRect frame = [window frame]; - CGImageRef cgImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, (CGWindowID)[window windowNumber], kCGWindowImageBoundsIgnoreFraming | kCGWindowImageBestResolution); - if (([window styleMask] & NSWindowStyleMaskFullScreen) != 0 && autoHideToolbarInFullScreen() == NO && [[window toolbar] isVisible]) { - NSWindow *tbWindow = nil; - for (tbWindow in [window childWindows]) - if ([NSStringFromClass([tbWindow class]) containsString:@"Toolbar"]) - break; - if (tbWindow) { - CGImageRef tbCgImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, (CGWindowID)[tbWindow windowNumber], kCGWindowImageBoundsIgnoreFraming | kCGWindowImageBestResolution); - NSRect tbFrame = [tbWindow frame]; - size_t width = CGImageGetWidth(cgImage), height = CGImageGetHeight(cgImage); - CGFloat sx = width / NSWidth(frame), sy = height / NSHeight(frame); - CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(cgImage), CGImageGetBytesPerRow(cgImage), CGImageGetColorSpace(cgImage), CGImageGetBitmapInfo(cgImage)); - CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, width, height), cgImage); - CGContextDrawImage(ctx, CGRectMake(sx * (NSMinX(tbFrame) - NSMinX(frame)), sy * (NSMinY(tbFrame) - NSMinY(frame)), sx * NSWidth(tbFrame), sy * NSHeight(tbFrame)), tbCgImage); - CGImageRelease(tbCgImage); - CGImageRelease(cgImage); - cgImage = CGBitmapContextCreateImage(ctx); - CGContextRelease(ctx); - } - } - NSImage *image = [[NSImage alloc] initWithCGImage:cgImage size:frame.size]; - CGImageRelease(cgImage); - if (animationWindow == nil) - animationWindow = [[SKAnimatedBorderlessWindow alloc] initWithContentRect:frame]; - else - [animationWindow setFrame:frame display:NO]; - [animationWindow addImageViewWithImage:image]; - [animationWindow setHasShadow:[window hasShadow]]; - [animationWindow setLevel:[window level]]; - [animationWindow orderWindow:NSWindowAbove relativeTo:window]; - [window setAlphaValue:0.0]; -} - -#pragma mark SKPresentationView delegate - - (void)handlePresentationViewPageChanged:(NSNotification *)notification { PDFPage *page = [presentationView page]; if (page) { @@ -318,7 +243,7 @@ NSScreen *screen = [mainWindow screen]; if ([self presentationNotesDocument] && [self presentationNotesDocument] != [self document]) { - NSArray *screens = [self alternateScreensForScreen:[[[self presentationNotesDocument] mainWindow] screen]]; + NSArray *screens = [[[[self presentationNotesDocument] mainWindow] screen] alternateScreens]; if ([screens count] > 0 && [screens containsObject:[screen primaryScreen]] == NO) screen = [screens firstObject]; } @@ -537,6 +462,50 @@ return mwcFlags.isSwitchingFullScreen == 0 && [self interactionMode] == SKPresentationMode; } +#pragma mark Full Screen Support Methods + +- (void)forceSubwindowsOnTop:(BOOL)flag { + for (NSWindowController *wc in [[self document] windowControllers]) { + if ([wc respondsToSelector:@selector(setForceOnTop:)] && wc != presentationPreview) + [(id)wc setForceOnTop:flag]; + } +} + +- (void)displayStaticContentForWindow:(NSWindow *)window { + NSRect frame = [window frame]; + CGImageRef cgImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, (CGWindowID)[window windowNumber], kCGWindowImageBoundsIgnoreFraming | kCGWindowImageBestResolution); + if (([window styleMask] & NSWindowStyleMaskFullScreen) != 0 && autoHideToolbarInFullScreen() == NO && [[window toolbar] isVisible]) { + NSWindow *tbWindow = nil; + for (tbWindow in [window childWindows]) + if ([NSStringFromClass([tbWindow class]) containsString:@"Toolbar"]) + break; + if (tbWindow) { + CGImageRef tbCgImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, (CGWindowID)[tbWindow windowNumber], kCGWindowImageBoundsIgnoreFraming | kCGWindowImageBestResolution); + NSRect tbFrame = [tbWindow frame]; + size_t width = CGImageGetWidth(cgImage), height = CGImageGetHeight(cgImage); + CGFloat sx = width / NSWidth(frame), sy = height / NSHeight(frame); + CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(cgImage), CGImageGetBytesPerRow(cgImage), CGImageGetColorSpace(cgImage), CGImageGetBitmapInfo(cgImage)); + CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, width, height), cgImage); + CGContextDrawImage(ctx, CGRectMake(sx * (NSMinX(tbFrame) - NSMinX(frame)), sy * (NSMinY(tbFrame) - NSMinY(frame)), sx * NSWidth(tbFrame), sy * NSHeight(tbFrame)), tbCgImage); + CGImageRelease(tbCgImage); + CGImageRelease(cgImage); + cgImage = CGBitmapContextCreateImage(ctx); + CGContextRelease(ctx); + } + } + NSImage *image = [[NSImage alloc] initWithCGImage:cgImage size:frame.size]; + CGImageRelease(cgImage); + if (animationWindow == nil) + animationWindow = [[SKAnimatedBorderlessWindow alloc] initWithContentRect:frame]; + else + [animationWindow setFrame:frame display:NO]; + [animationWindow addImageViewWithImage:image]; + [animationWindow setHasShadow:[window hasShadow]]; + [animationWindow setLevel:[window level]]; + [animationWindow orderWindow:NSWindowAbove relativeTo:window]; + [window setAlphaValue:0.0]; +} + #pragma mark NSWindowDelegate Full Screen Methods static inline BOOL autoHideToolbarInFullScreen() { 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