How to arrange the coordinates of multiple screens correctly in macOS?

Viewed 67

How to arrange the coordinates of multiple screens correctly in macOS? I tried to arrange according to the frame output by NSScreen.screens, but the coordinate position is always incorrect. Does anyone know? Or is there a reference for related open source code? Thanks!

enter image description here

This is the relevant code:

struct ScreenInfo {
    
    let frame: CGRect
    let localizedName: String
    let displayID: CGDirectDisplayID
    
}

extension ScreenInfo {
    
    static func allScreens() -> [ScreenInfo] {
        
        var offsetX: CGFloat = 0.0
        var offsetY: CGFloat = 0.0
        
        for screen in NSScreen.screens {
            let quartzFrame = CGDisplayBounds(screen.displayID)
            if -quartzFrame.origin.x > offsetX {
                offsetX = 0 - quartzFrame.origin.x
            }
            if -quartzFrame.origin.y > offsetY {
                offsetY = 0 - quartzFrame.origin.y
            }
        }
        
        let margin: CGFloat = 25.0
        let scale: CGFloat = 0.1
        var allScreens = [ScreenInfo]()
        for screen in NSScreen.screens {
            let width = screen.frame.width * scale
            let height = screen.frame.height * scale
            let quartzFrame = CGDisplayBounds(screen.displayID)
            let x = (quartzFrame.origin.x + offsetX) * scale + margin
            let y = (quartzFrame.origin.y + offsetY) * scale + margin
            
            let frame = CGRect(x: x, y: y, width: width, height: height)
            let info = ScreenInfo(frame: frame, localizedName: screen.localizedName, displayID: screen.displayID)
            allScreens.append(info)
            print(screen.localizedName,screen.frame,offsetX,offsetY)
        }
        return allScreens
    }
}

extension NSScreen {
    var displayID: CGDirectDisplayID {
        let key = NSDeviceDescriptionKey(rawValue: "NSScreenNumber")
        return deviceDescription[key] as! CGDirectDisplayID
    }
}

0 Answers
Related