MonitorControl/MonitorControl/Manager/DisplayManager.swift
waydabber d46c429c07
Add Apple Silicon support & major revamp (3.0.0) (#520)
Co-authored-by: Joni Van Roost <joni.VR@hotmail.com>
Co-authored-by: Rayan Khan <rayankhan04@iCloud.com>
Co-authored-by: Guillaume B <the0neyouseek@users.noreply.github.com>
2021-08-21 13:18:54 +02:00

154 lines
6.2 KiB
Swift

import Cocoa
import DDC
class DisplayManager {
public static let shared = DisplayManager()
private var displays: [Display]
init() {
self.displays = []
}
func updateDisplays(displays: [Display]) {
self.displays = displays
}
func getExternalDisplays() -> [ExternalDisplay] {
return self.displays.compactMap { $0 as? ExternalDisplay }
}
func getAllDisplays() -> [Display] {
return self.displays
}
func getAllNonVirtualDisplays() -> [Display] {
return self.displays.compactMap { display -> Display? in
if !display.isVirtual {
return display
} else { return nil }
}
}
func getDdcCapableDisplays() -> [ExternalDisplay] {
return self.displays.compactMap { display -> ExternalDisplay? in
if let externalDisplay = display as? ExternalDisplay, !externalDisplay.isSw(), !externalDisplay.isVirtual {
return externalDisplay
} else { return nil }
}
}
func getNonVirtualExternalDisplays() -> [ExternalDisplay] {
return self.displays.compactMap { display -> ExternalDisplay? in
if let externalDisplay = display as? ExternalDisplay, !externalDisplay.isVirtual {
return externalDisplay
} else { return nil }
}
}
func getBuiltInDisplay() -> Display? {
return self.displays.first { $0 is InternalDisplay }
}
func getCurrentDisplay() -> Display? {
let mouseLocation = NSEvent.mouseLocation
let screens = NSScreen.screens
if let screenWithMouse = (screens.first { NSMouseInRect(mouseLocation, $0.frame, false) }) {
return self.displays.first { $0.identifier == screenWithMouse.displayID }
}
return nil
}
func addDisplay(display: Display) {
self.displays.append(display)
}
func updateDisplay(display updatedDisplay: Display) {
if let indexToUpdate = self.displays.firstIndex(of: updatedDisplay) {
self.displays[indexToUpdate] = updatedDisplay
}
}
func clearDisplays() {
self.displays = []
}
func resetSwBrightnessForAllDisplays(settingsOnly: Bool = false, async: Bool = false) {
for externalDisplay in self.getNonVirtualExternalDisplays() {
if !settingsOnly {
_ = externalDisplay.setSwBrightness(value: externalDisplay.getSwMaxBrightness(), smooth: async)
} else {
externalDisplay.saveSwBirghtnessPrefValue(Int(externalDisplay.getSwMaxBrightness()))
}
if externalDisplay.isSw() {
externalDisplay.saveValue(Int(externalDisplay.getSwMaxBrightness()), for: .brightness)
}
}
}
func setBrightnessSliderValue(externalDisplay: ExternalDisplay, value: Int32) {
if let slider = externalDisplay.brightnessSliderHandler?.slider {
slider.intValue = value
}
}
func getBrightnessSliderMaxValue(externalDisplay: ExternalDisplay) -> Double {
if let slider = externalDisplay.brightnessSliderHandler?.slider {
return slider.maxValue
}
return 0
}
func restoreSwBrightnessForAllDisplays(async: Bool = false) {
for externalDisplay in self.getExternalDisplays() {
let sliderMax = self.getBrightnessSliderMaxValue(externalDisplay: externalDisplay)
if externalDisplay.getValue(for: .brightness) == 0 || externalDisplay.isSw() {
let savedPrefValue = externalDisplay.getSwBrightnessPrefValue()
if externalDisplay.getSwBrightness() != savedPrefValue {
if let manager = OSDManager.sharedManager() as? OSDManager { // This will give the user a hint why is the brightness suddenly changes and also give screen activity to counter the 'no gamma change when there is no screen activity' issue on some macs
manager.showImage(OSDImage.brightness.rawValue, onDisplayID: externalDisplay.identifier, priority: 0x1F4, msecUntilFade: 0)
}
}
externalDisplay.saveSwBirghtnessPrefValue(Int(externalDisplay.getSwBrightness()))
_ = externalDisplay.setSwBrightness(value: UInt8(savedPrefValue), smooth: async)
if !externalDisplay.isSw(), prefs.bool(forKey: Utils.PrefKeys.lowerSwAfterBrightness.rawValue) {
if savedPrefValue < externalDisplay.getSwMaxBrightness() {
self.setBrightnessSliderValue(externalDisplay: externalDisplay, value: Int32(Float(sliderMax / 2) * (Float(savedPrefValue) / Float(externalDisplay.getSwMaxBrightness()))))
} else {
self.setBrightnessSliderValue(externalDisplay: externalDisplay, value: Int32(sliderMax / 2) + Int32(externalDisplay.getValue(for: DDC.Command.brightness)))
}
} else if externalDisplay.isSw() {
self.setBrightnessSliderValue(externalDisplay: externalDisplay, value: Int32(Float(sliderMax) * (Float(savedPrefValue) / Float(externalDisplay.getSwMaxBrightness()))))
}
} else {
_ = externalDisplay.setSwBrightness(value: externalDisplay.getSwMaxBrightness())
if externalDisplay.isSw() {
self.setBrightnessSliderValue(externalDisplay: externalDisplay, value: Int32(sliderMax))
}
}
}
}
func getDisplayNameByID(displayID: CGDirectDisplayID) -> String {
let defaultName: String = NSLocalizedString("Unknown", comment: "Unknown display name")
if #available(macOS 11.0, *) {
if let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(displayID))?.takeRetainedValue() as NSDictionary?), let nameList = dictionary["DisplayProductName"] as? [String: String], var name = nameList[Locale.current.identifier] ?? nameList["en_US"] ?? nameList.first?.value {
if CGDisplayIsInHWMirrorSet(displayID) != 0 || CGDisplayIsInMirrorSet(displayID) != 0 {
let mirroredDisplayID = CGDisplayMirrorsDisplay(displayID)
if mirroredDisplayID != 0, let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(mirroredDisplayID))?.takeRetainedValue() as NSDictionary?), let nameList = dictionary["DisplayProductName"] as? [String: String], let mirroredName = nameList[Locale.current.identifier] ?? nameList["en_US"] ?? nameList.first?.value {
name.append("~" + mirroredName)
}
}
return name
}
}
if let screen = NSScreen.getByDisplayID(displayID: displayID) {
if #available(OSX 10.15, *) {
return screen.localizedName
} else {
return screen.displayName ?? defaultName
}
}
return defaultName
}
}