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
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit