From ec70bddf535eb108b32ec6379737c3986d646c63 Mon Sep 17 00:00:00 2001 From: waydabber <37590873+waydabber@users.noreply.github.com> Date: Fri, 13 Aug 2021 17:44:27 +0200 Subject: [PATCH] Partial fix for incompatibility with Custom ColorSync Profiles. --- MonitorControl/AppDelegate.swift | 18 ++++--- MonitorControl/Info.plist | 4 +- MonitorControl/Manager/DisplayManager.swift | 10 ++-- MonitorControl/Model/Display.swift | 7 ++- MonitorControl/UI/Base.lproj/Main.storyboard | 53 ++++++++++++------- .../AdvancedPrefsViewController.swift | 2 - .../MainPrefsViewController.swift | 3 +- MonitorControlHelper/Info.plist | 4 +- 8 files changed, 62 insertions(+), 39 deletions(-) diff --git a/MonitorControl/AppDelegate.swift b/MonitorControl/AppDelegate.swift index 5f4c0e6..ac70c6b 100644 --- a/MonitorControl/AppDelegate.swift +++ b/MonitorControl/AppDelegate.swift @@ -60,7 +60,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillTerminate(_: Notification) { os_log("Goodbye!", type: .info) - DisplayManager.shared.resetSwBrightness() + DisplayManager.shared.resetSwBrightnessForAllDisplays() self.statusItem.isVisible = true } @@ -114,7 +114,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // externalDisplay.arm64ddc = true // } if !serviceMatch.isDiscouraged { - externalDisplay.arm64ddc = true // MARK: (point of interest when testing) + externalDisplay.arm64ddc = false // MARK: (point of interest when testing) } } } @@ -182,7 +182,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } - if CGDisplayIsBuiltin(onlineDisplayID) != 0 { // MARK: (point of interest for testing) + if false, CGDisplayIsBuiltin(onlineDisplayID) != 0 { // MARK: (point of interest for testing) display = InternalDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) } else { display = ExternalDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) @@ -190,9 +190,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { DisplayManager.shared.addDisplay(display: display) } if firstrun { - DisplayManager.shared.resetSwBrightness() + DisplayManager.shared.resetSwBrightnessForAllDisplays(settingsOnly: true) } else { - DisplayManager.shared.restoreSwBrightness() + if prefs.bool(forKey: Utils.PrefKeys.fallbackSw.rawValue) || prefs.bool(forKey: Utils.PrefKeys.lowerSwAfterBrightness.rawValue) { + DisplayManager.shared.restoreSwBrightnessForAllDisplays() + } } self.updateArm64AVServices() NotificationCenter.default.post(name: Notification.Name(Utils.PrefKeys.displayListUpdate.rawValue), object: nil) @@ -422,7 +424,6 @@ extension AppDelegate: MediaKeyTapDelegate { } @objc func handleFallbackSwChanged() { - DisplayManager.shared.resetSwBrightness() self.updateDisplays() } @@ -432,10 +433,13 @@ extension AppDelegate: MediaKeyTapDelegate { @objc func handlePreferenceReset() { os_log("Resetting all preferences.") + if prefs.bool(forKey: Utils.PrefKeys.fallbackSw.rawValue) || prefs.bool(forKey: Utils.PrefKeys.lowerSwAfterBrightness.rawValue) { + DisplayManager.shared.resetSwBrightnessForAllDisplays() + } if let bundleID = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundleID) } - DisplayManager.shared.resetSwBrightness() + app.statusItem.isVisible = true self.setDefaultPrefs() self.checkPermissions() self.updateMediaKeyTap() diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index cfb2c99..4891b38 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 1980 + 2075 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion @@ -33,4 +33,4 @@ NSPrincipalClass NSApplication - \ No newline at end of file + diff --git a/MonitorControl/Manager/DisplayManager.swift b/MonitorControl/Manager/DisplayManager.swift index eae5403..2a819cd 100644 --- a/MonitorControl/Manager/DisplayManager.swift +++ b/MonitorControl/Manager/DisplayManager.swift @@ -71,10 +71,12 @@ class DisplayManager { self.displays = [] } - func resetSwBrightness() { + func resetSwBrightnessForAllDisplays(settingsOnly: Bool = false) { for externalDisplay in self.getNonVirtualExternalDisplays() { - guard externalDisplay.setSwBrightness(value: externalDisplay.getSwMaxBrightness()) else { - continue + if !settingsOnly { + _ = externalDisplay.setSwBrightness(value: externalDisplay.getSwMaxBrightness()) + } else { + externalDisplay.saveSwBirghtnessPrefValue(Int(externalDisplay.getSwMaxBrightness())) } if externalDisplay.isSw() { externalDisplay.saveValue(Int(externalDisplay.getSwMaxBrightness()), for: .brightness) @@ -82,7 +84,7 @@ class DisplayManager { } } - func restoreSwBrightness() { + func restoreSwBrightnessForAllDisplays() { for externalDisplay in self.getExternalDisplays() { if externalDisplay.getValue(for: .brightness) == 0 || externalDisplay.isSw() { // Out of caution we won't let it restore to complete darkness, not to interfere with login, etc. This is how Apple devices work as well. diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index b57ee03..705bacb 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -71,7 +71,8 @@ class Display { func setSwBrightness(value: UInt8) -> Bool { let brightnessValue: UInt8 = min(getSwMaxBrightness(), value) - let floatValue = Float(Float(brightnessValue) / Float(self.getSwMaxBrightness())) + var floatValue = Float(Float(brightnessValue) / Float(self.getSwMaxBrightness())) + floatValue = floatValue * 0.95 + 0.05 // We don't allow decrease lower than 5% for safety reasons and because some displays blank off after a while on full screen black if CGSetDisplayTransferByFormula(self.identifier, 0, floatValue, 1, 0, floatValue, 1, 0, floatValue, 1) == CGError.success { self.saveSwBirghtnessPrefValue(Int(brightnessValue)) return true @@ -96,6 +97,10 @@ class Display { return self.getSwMaxBrightness() } + func resetSwBrightness() -> Bool { + return self.setSwBrightness(value: self.getSwMaxBrightness()) + } + func saveSwBirghtnessPrefValue(_ value: Int) { self.prefs.set(value, forKey: "SwBrightness-\(self.identifier)") } diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index fbe7f0d..d868055 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -1,6 +1,7 @@ + @@ -301,17 +302,17 @@ - + - - + + - + @@ -324,6 +325,7 @@ + @@ -336,7 +338,7 @@ - + @@ -346,7 +348,7 @@