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"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|