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

Reply via email to