🎉 v1.5.0

Cleanup for v1.5.0
This commit is contained in:
Guillaume Broder 2019-05-07 22:37:15 +02:00
parent b32d2d5785
commit 99bc6711a0
No known key found for this signature in database
GPG key ID: 66FB02D063D9E08F
25 changed files with 114 additions and 76 deletions

View 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)
}
}

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

View 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)
}
}

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