diff --git a/MonitorControl/Enums/PrefKey.swift b/MonitorControl/Enums/PrefKey.swift index 3d81e74..b2c9617 100644 --- a/MonitorControl/Enums/PrefKey.swift +++ b/MonitorControl/Enums/PrefKey.swift @@ -61,10 +61,7 @@ enum PrefKey: String { case showTickMarks // Instead of assuming default values, enable read or write upon startup (according to readDDCInsteadOfRestoreValues) - case enableDDCDuringStartup - - // Restore last saved values upon startup or wake - case readDDCInsteadOfRestoreValues + case startupAction // Show advanced options under Displays tab in Preferences case showAdvancedSettings @@ -96,11 +93,8 @@ enum PrefKey: String { // Synchronize brightness from sync source displays among all other displays case enableBrightnessSync - // Show only relevant slider for menu (depending on which display shows the menu) - case slidersRelevant - - // Combine sliders for all displays - case slidersCombine + // Sliders for multiple displays + case multiSliders /* -- Display specific settings */ @@ -170,6 +164,18 @@ enum PrefKey: String { case remapDDC } +enum StartupAction: Int { + case doNothing = 0 + case write = 1 + case read = 2 +} + +enum MultiSliders: Int { + case separate = 0 + case relevant = 1 + case combine = 2 +} + enum PollingMode: Int { case none = -2 case minimal = -1 diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 770e35d..0ac9e9b 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6444 + 6517 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 5120e21..7aef81d 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -85,7 +85,7 @@ class OtherDisplay: Display { } os_log("Setting up display %{public}@ for %{public}@", type: .info, String(self.identifier), String(reflecting: command)) if !self.isSw() { - if prefs.bool(forKey: PrefKey.enableDDCDuringStartup.rawValue), prefs.bool(forKey: PrefKey.readDDCInsteadOfRestoreValues.rawValue), self.pollingCount != 0, !app.safeMode { + if prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.read.rawValue, self.pollingCount != 0, !app.safeMode { os_log("- Reading DDC from display %{public}@ times", type: .info, String(self.pollingCount)) let delay = self.readPrefAsBool(key: .longerDelay) ? UInt64(40 * kMillisecondScale) : nil ddcValues = self.readDDCValues(for: command, tries: UInt(self.pollingCount), minReplyDelay: delay) @@ -113,7 +113,7 @@ class OtherDisplay: Display { os_log("- Maximum DDC value: %{public}@ (overrides %{public}@)", type: .info, String(self.readPrefAsInt(key: .maxDDC, for: command)), String(maxDDCValue)) os_log("- Current internal value: %{public}@", type: .info, String(self.readPrefAsFloat(for: command))) os_log("- Command status: %{public}@", type: .info, self.readPrefAsBool(key: .isTouched, for: command) ? "Touched" : "Untouched") - if self.readPrefAsBool(key: .isTouched, for: command), prefs.bool(forKey: PrefKey.enableDDCDuringStartup.rawValue), !prefs.bool(forKey: PrefKey.readDDCInsteadOfRestoreValues.rawValue), !app.safeMode { + if self.readPrefAsBool(key: .isTouched, for: command), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { os_log("- Writing last saved DDC values.", type: .info, self.name, String(reflecting: command)) _ = self.writeDDCValues(command: command, value: currentDDCValue) } @@ -137,7 +137,7 @@ class OtherDisplay: Display { currentMuteValue = currentMuteValue == 0 ? 2 : currentMuteValue var muteValues: (current: UInt16, max: UInt16)? if self.readPrefAsBool(key: .enableMuteUnmute) { - if self.pollingCount != 0, !app.safeMode, prefs.bool(forKey: PrefKey.enableDDCDuringStartup.rawValue), prefs.bool(forKey: PrefKey.readDDCInsteadOfRestoreValues.rawValue) { + if self.pollingCount != 0, !app.safeMode, prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.read.rawValue { os_log("Reading DDC from display %{public}@ times for Mute", type: .info, String(self.pollingCount)) let delay = self.readPrefAsBool(key: .longerDelay) ? UInt64(40 * kMillisecondScale) : nil muteValues = self.readDDCValues(for: .audioMuteScreenBlank, tries: UInt(self.pollingCount), minReplyDelay: delay) @@ -148,7 +148,7 @@ class OtherDisplay: Display { os_log("Mute read failed", type: .info) } } - if prefs.bool(forKey: PrefKey.enableDDCDuringStartup.rawValue), !prefs.bool(forKey: PrefKey.readDDCInsteadOfRestoreValues.rawValue), !app.safeMode { + if self.readPrefAsBool(key: .isTouched, for: .audioSpeakerVolume), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { os_log("Writing last saved DDC value for Mute: %{public}@", type: .info, String(currentMuteValue)) _ = self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(currentMuteValue)) } diff --git a/MonitorControl/Support/MenuHandler.swift b/MonitorControl/Support/MenuHandler.swift index 7a53f09..835973c 100644 --- a/MonitorControl/Support/MenuHandler.swift +++ b/MonitorControl/Support/MenuHandler.swift @@ -41,8 +41,8 @@ class MenuHandler: NSMenu, NSMenuDelegate { } else { displays.append(contentsOf: DisplayManager.shared.getDdcCapableDisplays()) } - let relevant = prefs.bool(forKey: PrefKey.slidersRelevant.rawValue) - let combine = prefs.bool(forKey: PrefKey.slidersCombine.rawValue) + let relevant = prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.relevant.rawValue + let combine = prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.combine.rawValue let numOfDisplays = displays.count if numOfDisplays != 0 { let asSubMenu: Bool = (displays.count > 3 && !relevant && !combine && app.macOS10()) ? true : false @@ -74,13 +74,13 @@ class MenuHandler: NSMenu, NSMenuDelegate { } func setupMenuSliderHandler(command: Command, display: Display, title: String) -> SliderHandler { - if prefs.bool(forKey: PrefKey.slidersCombine.rawValue), let combinedHandler = self.combinedSliderHandler[command] { + if prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.combine.rawValue, let combinedHandler = self.combinedSliderHandler[command] { combinedHandler.addDisplay(display) display.sliderHandler[command] = combinedHandler return combinedHandler } else { let sliderHandler = SliderHandler(display: display, command: command, title: title) - if prefs.bool(forKey: PrefKey.slidersCombine.rawValue) { + if prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.combine.rawValue { self.combinedSliderHandler[command] = sliderHandler } display.sliderHandler[command] = sliderHandler @@ -89,7 +89,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { } func addDisplayMenuBlock(addedSliderHandlers: [SliderHandler], blockName: String, monitorSubMenu: NSMenu, numOfDisplays: Int, asSubMenu: Bool) { - if numOfDisplays > 1, !prefs.bool(forKey: PrefKey.slidersRelevant.rawValue), !DEBUG_MACOS10, #available(macOS 11.0, *) { + if numOfDisplays > 1, prefs.integer(forKey: PrefKey.multiSliders.rawValue) != MultiSliders.relevant.rawValue, !DEBUG_MACOS10, #available(macOS 11.0, *) { class BlockView: NSView { override func draw(_: NSRect) { let radius = prefs.bool(forKey: PrefKey.showTickMarks.rawValue) ? CGFloat(4) : CGFloat(11) @@ -178,7 +178,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { let title = NSLocalizedString("Brightness", comment: "Shown in menu") addedSliderHandlers.append(self.setupMenuSliderHandler(command: .brightness, display: display, title: title)) } - if !prefs.bool(forKey: PrefKey.slidersCombine.rawValue) { + if prefs.integer(forKey: PrefKey.multiSliders.rawValue) != MultiSliders.combine.rawValue { self.addDisplayMenuBlock(addedSliderHandlers: addedSliderHandlers, blockName: display.readPrefAsString(key: .friendlyName) != "" ? display.readPrefAsString(key: .friendlyName) : display.name, monitorSubMenu: monitorSubMenu, numOfDisplays: numOfDisplays, asSubMenu: asSubMenu) } if addedSliderHandlers.count > 0, prefs.integer(forKey: PrefKey.menuIcon.rawValue) == MenuIcon.sliderOnly.rawValue { @@ -200,7 +200,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { } func updateMenuRelevantDisplay() { - if prefs.bool(forKey: PrefKey.slidersRelevant.rawValue) { + if prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.relevant.rawValue { if let display = DisplayManager.shared.getCurrentDisplay(), display.identifier != self.lastMenuRelevantDisplayId { os_log("Menu must be refreshed as relevant display changed since last time.") self.lastMenuRelevantDisplayId = display.identifier diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 5e408df..325be4a 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -1,6 +1,7 @@ + @@ -10,10 +11,10 @@ - + - + @@ -29,11 +30,9 @@ - - - - - + + + @@ -48,7 +47,7 @@ - + @@ -58,7 +57,7 @@ + - + Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user. @@ -259,23 +265,10 @@ - - - - - + @@ -283,19 +276,6 @@ - - - - @@ -389,39 +369,35 @@ - - - - + - - + - + - + - + @@ -436,10 +412,7 @@ - - - @@ -454,9 +427,9 @@ - + - + @@ -466,7 +439,7 @@ - + @@ -483,9 +456,9 @@ - + - + @@ -495,7 +468,7 @@ - + @@ -515,7 +488,7 @@ - - - - - - - - + @@ -825,21 +773,19 @@ + + - - - - @@ -847,30 +793,27 @@ - - - - + - + - + + - @@ -880,7 +823,7 @@ - + @@ -893,9 +836,9 @@ - + - + @@ -905,7 +848,7 @@ - + @@ -928,7 +871,7 @@ - + Use the brightness keys of your Apple keyboard to control brightness. You can hold Control to adjust the built-in display, Control+Command to adjust external displays. Hold Shift+Option for fine control. Control+Option+Command adjusts contrast on DDC compatible displays. @@ -937,10 +880,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +