Revision: 16670
          http://sourceforge.net/p/skim-app/code/16670
Author:   hofman
Date:     2026-10-18 15:46:46 +0000 (Sun, 18 Oct 2026)
Log Message:
-----------
implement search for screen for presentation window in fullscreen category

Modified Paths:
--------------
    trunk/NSScreen_SKExtensions.h
    trunk/NSScreen_SKExtensions.m
    trunk/SKMainWindowController_FullScreen.m

Modified: trunk/NSScreen_SKExtensions.h
===================================================================
--- trunk/NSScreen_SKExtensions.h       2026-10-17 21:31:49 UTC (rev 16669)
+++ trunk/NSScreen_SKExtensions.h       2026-10-18 15:46:46 UTC (rev 16670)
@@ -48,11 +48,6 @@
 
 @property (nonatomic, readonly) NSScreen *primaryScreen;
 
-@property (nonatomic, readonly) NSArray<NSScreen *> *alternateScreens;
-
-// gives the alternate screens for the builtin screen, i.e. external screens
-@property (nonatomic, class, readonly) NSArray<NSScreen *> *alternateScreens;
-
 @property (class, readonly) CGFloat maxBackingScaleFactor;
 
 @end

Modified: trunk/NSScreen_SKExtensions.m
===================================================================
--- trunk/NSScreen_SKExtensions.m       2026-10-17 21:31:49 UTC (rev 16669)
+++ trunk/NSScreen_SKExtensions.m       2026-10-18 15:46:46 UTC (rev 16670)
@@ -102,59 +102,6 @@
     return self;
 }
 
-- (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)
-            continue;
-        NSNumber *aScreenNumber = [deviceDescription 
objectForKey:@"NSScreenNumber"];
-        CGDirectDisplayID displayID = (CGDirectDisplayID)[aScreenNumber 
unsignedIntValue];
-        displayID = CGDisplayMirrorsDisplay(displayID);
-        if (displayID == kCGNullDirectDisplay) {
-            [screenNumbers addObject:aScreenNumber];
-            [screens setObject:aScreen forKey: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;
-}
-
-+ (NSArray *)alternateScreens {
-    NSMutableDictionary *screens = [NSMutableDictionary dictionary];
-    NSMutableArray *screenNumbers = [NSMutableArray array];
-    NSNumber *builtinScreenNumber = nil;
-    for (NSScreen *aScreen in [self screens]) {
-        NSDictionary *deviceDescription = [aScreen deviceDescription];
-        if ([deviceDescription objectForKey:NSDeviceIsScreen] == nil)
-            continue;
-        NSNumber *aScreenNumber = [deviceDescription 
objectForKey:@"NSScreenNumber"];
-        CGDirectDisplayID displayID = (CGDirectDisplayID)[aScreenNumber 
unsignedIntValue];
-        BOOL isBuiltin = builtinScreenNumber == nil && 
CGDisplayIsBuiltin(displayID);
-        displayID = CGDisplayMirrorsDisplay(displayID);
-        if (displayID == kCGNullDirectDisplay) {
-            [screenNumbers addObject:aScreenNumber];
-            [screens setObject:aScreen forKey:aScreenNumber];
-        }
-        if (isBuiltin)
-            builtinScreenNumber = displayID == kCGNullDirectDisplay ? 
aScreenNumber : [NSNumber numberWithUnsignedInt:displayID];
-    }
-    NSMutableArray *alternateScreens = [NSMutableArray array];
-    for (NSNumber *aScreenNumber in screenNumbers) {
-        if ([aScreenNumber isEqual:builtinScreenNumber] == NO)
-            [alternateScreens addObject:[screens objectForKey:aScreenNumber]];
-    }
-    return alternateScreens;
-}
-
 + (CGFloat)maxBackingScaleFactor {
     CGFloat scale = 1.0;
     for (NSScreen *screen in [self screens]) {

Modified: trunk/SKMainWindowController_FullScreen.m
===================================================================
--- trunk/SKMainWindowController_FullScreen.m   2026-10-17 21:31:49 UTC (rev 
16669)
+++ trunk/SKMainWindowController_FullScreen.m   2026-10-18 15:46:46 UTC (rev 
16670)
@@ -139,6 +139,39 @@
 
 #pragma mark Presentation Support Methods
 
+- (NSScreen *)screenForPresentationWindowAvoidingScreen:(NSScreen 
*)screenToAvoid {
+    NSScreen *mainScreen = [savedNormalWindow screen];
+    NSArray *allScreens = [NSScreen screens];
+    if ([allScreens count] > 1) {
+        NSMutableDictionary *screens = [NSMutableDictionary dictionary];
+        NSMutableArray *screenNumbers = [NSMutableArray array];
+        NSNumber *avoidScreenNumber = nil;
+        NSNumber *mainScreenNumber = nil;
+        for (NSScreen *aScreen in allScreens) {
+            NSDictionary *deviceDescription = [aScreen deviceDescription];
+            if ([deviceDescription objectForKey:NSDeviceIsScreen] == nil)
+                continue;
+            NSNumber *aScreenNumber = [deviceDescription 
objectForKey:@"NSScreenNumber"];
+            CGDirectDisplayID displayID = (CGDirectDisplayID)[aScreenNumber 
unsignedIntValue];
+            BOOL isBuiltin = screenToAvoid == nil && avoidScreenNumber == nil 
&& CGDisplayIsBuiltin(displayID);
+            displayID = CGDisplayMirrorsDisplay(displayID);
+            if (displayID == kCGNullDirectDisplay) {
+                [screenNumbers addObject:aScreenNumber];
+                [screens setObject:aScreen forKey:aScreenNumber];
+            }
+            if (avoidScreenNumber == nil && (isBuiltin || [aScreen 
isEqual:screenToAvoid]))
+                avoidScreenNumber = displayID == kCGNullDirectDisplay ? 
aScreenNumber : [NSNumber numberWithUnsignedInt:displayID];
+            if ([aScreen isEqual:mainScreen])
+                mainScreenNumber = displayID == kCGNullDirectDisplay ? 
aScreenNumber : [NSNumber numberWithUnsignedInt:displayID];
+        }
+        if (avoidScreenNumber)
+            [screenNumbers removeObject:avoidScreenNumber];
+        if ([screenNumbers count] > 0 && [screenNumbers 
containsObject:mainScreenNumber] == NO)
+            return [screens objectForKey:[screenNumbers firstObject]];
+    }
+    return mainScreen;
+}
+
 - (void)showNotesForPresentationWindow:(NSWindow *)window {
     NSDocument *notesDocument = [self presentationNotesDocument];
     if (notesDocument == nil)
@@ -158,11 +191,7 @@
         
         [preview setDelegate:self];
         
-        NSScreen *screen = [savedNormalWindow screen];
-        NSArray *screens = [[window screen] alternateScreens];
-        if ([screens count] > 0 && [screens containsObject:[screen 
primaryScreen]] == NO)
-            screen = [[screen alternateScreens] firstObject];
-        
+        NSScreen *screen = [self 
screenForPresentationWindowAvoidingScreen:[window screen]];
         [preview setPdfDocument:[pdfView document] previewPageNumber:pageIndex 
displayOnScreen:screen];
     
         [[self document] addWindowController:preview];
@@ -246,15 +275,13 @@
     
     interactionMode = SKPresentationMode;
     
-    NSScreen *screen = [normalWindow screen];
+    NSScreen *screen = nil;
     if ([self presentationNotesDocument]) {
-        NSArray *screens = nil;
-        if ([self presentationNotesDocument] == [self document])
-            screens = [NSScreen alternateScreens];
-        else
-            screens = [[[[self presentationNotesDocument] primaryWindow] 
screen] alternateScreens];
-        if ([screens count] > 0 && [screens containsObject:[screen 
primaryScreen]] == NO)
-            screen = [screens firstObject];
+        if ([self presentationNotesDocument] != [self document])
+            screen = [[[self presentationNotesDocument] primaryWindow] screen];
+        screen = [self screenForPresentationWindowAvoidingScreen:screen];
+    } else {
+        screen = [normalWindow screen];
     }
     
     NSWindow *presentationWindow = [[SKFullScreenWindow alloc] 
initWithContentRect:[screen frame]];

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

Reply via email to