45 lines
1.3 KiB
Swift
45 lines
1.3 KiB
Swift
import AppKit
|
||
import ClawdisIPC
|
||
import CoreGraphics
|
||
|
||
enum UIScreenService {
|
||
static func listScreens() -> [UIScreenInfo] {
|
||
let screens = NSScreen.screens
|
||
let mainScreen = NSScreen.main
|
||
|
||
return screens.enumerated().map { index, screen in
|
||
UIScreenInfo(
|
||
index: index,
|
||
name: screen.peekabooName,
|
||
frame: screen.frame,
|
||
visibleFrame: screen.visibleFrame,
|
||
isPrimary: screen == mainScreen,
|
||
scaleFactor: screen.backingScaleFactor,
|
||
displayID: screen.displayID)
|
||
}
|
||
}
|
||
}
|
||
|
||
private extension NSScreen {
|
||
var displayID: UInt32 {
|
||
if let num = self.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber {
|
||
return num.uint32Value
|
||
}
|
||
return 0
|
||
}
|
||
|
||
/// Match Peekaboo's `ScreenService` naming (built-in vs. resolution fallback).
|
||
var peekabooName: String {
|
||
let id = self.displayID
|
||
guard id != 0 else { return "Display" }
|
||
if CGDisplayIsBuiltin(id) != 0 { return "Built-in Display" }
|
||
|
||
if let mode = CGDisplayCopyDisplayMode(id) {
|
||
return "\(mode.pixelWidth)×\(mode.pixelHeight) Display"
|
||
}
|
||
|
||
return "External Display"
|
||
}
|
||
}
|
||
|