mirror of
https://github.com/MonitorControl/MonitorControl.git
synced 2026-06-01 22:00:47 -06:00
🎉 v1.5.0
Cleanup for v1.5.0
This commit is contained in:
parent
b32d2d5785
commit
99bc6711a0
25 changed files with 114 additions and 76 deletions
15
MonitorControl/Extensions/CGDirectDisplayID+Extension.swift
Normal file
15
MonitorControl/Extensions/CGDirectDisplayID+Extension.swift
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
import Cocoa
|
||||
|
||||
extension CGDirectDisplayID {
|
||||
public var vendorNumber: UInt32? {
|
||||
return CGDisplayVendorNumber(self)
|
||||
}
|
||||
|
||||
public var modelNumber: UInt32? {
|
||||
return CGDisplayModelNumber(self)
|
||||
}
|
||||
|
||||
public var serialNumber: UInt32? {
|
||||
return CGDisplaySerialNumber(self)
|
||||
}
|
||||
}
|
||||
26
MonitorControl/Extensions/Display+Whitelist.swift
Normal file
26
MonitorControl/Extensions/Display+Whitelist.swift
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
extension Display {
|
||||
enum WhitelistReason {
|
||||
case longerDelay
|
||||
case hideOsd
|
||||
}
|
||||
|
||||
static let whitelist: [UInt32: [UInt32: [WhitelistReason]]] = [
|
||||
7789: [30460: [.hideOsd, .longerDelay]], // LG 38UC99-W
|
||||
]
|
||||
|
||||
var hideOsd: Bool {
|
||||
guard let vendor = self.identifier.vendorNumber, let model = self.identifier.modelNumber else {
|
||||
return false
|
||||
}
|
||||
|
||||
return Display.whitelist[vendor]?[model]?.contains(.hideOsd) ?? false
|
||||
}
|
||||
|
||||
var needsLongerDelay: Bool {
|
||||
guard let vendor = self.identifier.vendorNumber, let model = self.identifier.modelNumber else {
|
||||
return false
|
||||
}
|
||||
|
||||
return Display.whitelist[vendor]?[model]?.contains(.longerDelay) ?? false
|
||||
}
|
||||
}
|
||||
33
MonitorControl/Extensions/EDID+Extension.swift
Normal file
33
MonitorControl/Extensions/EDID+Extension.swift
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import DDC
|
||||
|
||||
extension EDID {
|
||||
public func displayName() -> String? {
|
||||
let descriptors = [self.descriptors.0, self.descriptors.1, self.descriptors.2, self.descriptors.3]
|
||||
|
||||
for descriptor in descriptors {
|
||||
switch descriptor {
|
||||
case let .displayName(name):
|
||||
return name
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
public func serialNumber() -> String? {
|
||||
let descriptors = [self.descriptors.0, self.descriptors.1, self.descriptors.2, self.descriptors.3]
|
||||
|
||||
for descriptor in descriptors {
|
||||
switch descriptor {
|
||||
case let .serialNumber(number):
|
||||
return number
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return String(self.serialNumber)
|
||||
}
|
||||
}
|
||||
70
MonitorControl/Extensions/NSScreen+Extension.swift
Normal file
70
MonitorControl/Extensions/NSScreen+Extension.swift
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import Cocoa
|
||||
|
||||
extension NSScreen {
|
||||
public var displayID: CGDirectDisplayID {
|
||||
return (self.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID)!
|
||||
}
|
||||
|
||||
public var vendorNumber: UInt32? {
|
||||
switch self.displayID.vendorNumber {
|
||||
case 0xFFFF_FFFF:
|
||||
return nil
|
||||
case let vendorNumber:
|
||||
return vendorNumber
|
||||
}
|
||||
}
|
||||
|
||||
public var modelNumber: UInt32? {
|
||||
switch self.displayID.modelNumber {
|
||||
case 0xFFFF_FFFF:
|
||||
return nil
|
||||
case let modelNumber:
|
||||
return modelNumber
|
||||
}
|
||||
}
|
||||
|
||||
public var serialNumber: UInt32? {
|
||||
switch self.displayID.serialNumber {
|
||||
case 0x0000_0000:
|
||||
return nil
|
||||
case let serialNumber:
|
||||
return serialNumber
|
||||
}
|
||||
}
|
||||
|
||||
public var displayName: String? {
|
||||
var servicePortIterator = io_iterator_t()
|
||||
|
||||
let status = IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IODisplayConnect"), &servicePortIterator)
|
||||
guard status == KERN_SUCCESS else {
|
||||
return nil
|
||||
}
|
||||
|
||||
defer {
|
||||
assert(IOObjectRelease(servicePortIterator) == KERN_SUCCESS)
|
||||
}
|
||||
|
||||
while case let object = IOIteratorNext(servicePortIterator), object != 0 {
|
||||
let dict = (IODisplayCreateInfoDictionary(object, UInt32(kIODisplayOnlyPreferredName)).takeRetainedValue() as NSDictionary as? [String: AnyObject])!
|
||||
|
||||
if dict[kDisplayVendorID] as? UInt32 == self.vendorNumber,
|
||||
dict[kDisplayProductID] as? UInt32 == self.modelNumber,
|
||||
dict[kDisplaySerialNumber] as? UInt32 == self.serialNumber {
|
||||
if let productName = dict["DisplayProductName"] as? [String: String],
|
||||
let firstKey = Array(productName.keys).first {
|
||||
return productName[firstKey]!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
public var isBuiltin: Bool {
|
||||
return CGDisplayIsBuiltin(self.displayID) != 0
|
||||
}
|
||||
|
||||
public static func getByDisplayID(displayID: CGDirectDisplayID) -> NSScreen? {
|
||||
return NSScreen.screens.first { $0.displayID == displayID }
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue