Refactor display loading logic

This would allow us to more easily control the built-in display. Allowing for easier implementation of certain feature requests (for example #148).
This commit is contained in:
JoniVR 2020-01-15 23:24:59 +01:00
parent c984a8c343
commit 46d7cb6b91
6 changed files with 69 additions and 71 deletions

View file

@ -83,81 +83,68 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func updateDisplays() { func updateDisplays() {
self.clearDisplays() self.clearDisplays()
let filteredScreens = NSScreen.screens.filter { screen -> Bool in let screens = NSScreen.screens
// Skip built-in displays.
if screen.isBuiltin { let validScreens = screens.filter { (screen) -> Bool in
return false !screen.isBuiltin && DDC(for: screen.displayID) != nil
}
return DDC(for: screen.displayID)?.edid() != nil
} }
switch filteredScreens.count { for screen in screens {
case 0: let name = screen.displayName ?? "unknown"
// If no DDC capable display was detected let id = screen.displayID
let item = NSMenuItem() let isEnabled = (prefs.object(forKey: "\(id)-state") as? Bool) ?? true
item.title = NSLocalizedString("No supported display found", comment: "Shown in menu") let display = Display(screen.displayID, name: name, isBuiltin: screen.isBuiltin, isEnabled: isEnabled)
item.isEnabled = false self.displayManager?.addDisplay(display: display)
self.monitorItems.append(item)
self.statusMenu.insertItem(item, at: 0)
self.statusMenu.insertItem(NSMenuItem.separator(), at: 1)
default:
os_log("The following supported displays were found:", type: .info)
for screen in filteredScreens { if validScreens.count == 0 {
os_log(" - %{public}@", type: .info, "\(screen.displayName ?? NSLocalizedString("Unknown", comment: "Unknown display name")) (Vendor: \(screen.vendorNumber ?? 0), Model: \(screen.modelNumber ?? 0))") let item = NSMenuItem()
self.addScreenToMenu(screen: screen, asSubMenu: filteredScreens.count > 1) item.title = NSLocalizedString("No supported display found", comment: "Shown in menu")
item.isEnabled = false
self.monitorItems.append(item)
self.statusMenu.insertItem(item, at: 0)
self.statusMenu.insertItem(NSMenuItem.separator(), at: 1)
} else {
os_log("The following supported displays were found:", type: .info)
if validScreens.contains(screen) {
os_log(" - %{public}@", type: .info, "\(screen.displayName ?? NSLocalizedString("Unknown", comment: "Unknown display name")) (Vendor: \(screen.vendorNumber ?? 0), Model: \(screen.modelNumber ?? 0))")
self.addDisplayToMenu(display: display, asSubMenu: validScreens.count > 1)
}
} }
} }
} }
/// Add a screen to the menu private func addDisplayToMenu(display: Display, asSubMenu: Bool) {
/// let monitorSubMenu: NSMenu = asSubMenu ? NSMenu() : self.statusMenu
/// - Parameters:
/// - screen: The screen to add
/// - asSubMenu: Display in a sub menu or directly in menu
private func addScreenToMenu(screen: NSScreen, asSubMenu: Bool) {
let id = screen.displayID
let ddc = DDC(for: id)
if let edid = ddc?.edid() { self.statusMenu.insertItem(NSMenuItem.separator(), at: 0)
let name = Utils.getDisplayName(forEdid: edid)
let isEnabled = (prefs.object(forKey: "\(id)-state") as? Bool) ?? true
let display = Display(id, name: name, isBuiltin: screen.isBuiltin, isEnabled: isEnabled) let volumeSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu,
forDisplay: display,
let monitorSubMenu: NSMenu = asSubMenu ? NSMenu() : self.statusMenu command: .audioSpeakerVolume,
title: NSLocalizedString("Volume", comment: "Shown in menu"))
self.statusMenu.insertItem(NSMenuItem.separator(), at: 0) let brightnessSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu,
forDisplay: display,
let volumeSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, command: .brightness,
forDisplay: display, title: NSLocalizedString("Brightness", comment: "Shown in menu"))
command: .audioSpeakerVolume, if prefs.bool(forKey: Utils.PrefKeys.showContrast.rawValue) {
title: NSLocalizedString("Volume", comment: "Shown in menu")) let contrastSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu,
let brightnessSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, forDisplay: display,
forDisplay: display, command: .contrast,
command: .brightness, title: NSLocalizedString("Contrast", comment: "Shown in menu"))
title: NSLocalizedString("Brightness", comment: "Shown in menu")) display.contrastSliderHandler = contrastSliderHandler
if prefs.bool(forKey: Utils.PrefKeys.showContrast.rawValue) {
let contrastSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu,
forDisplay: display,
command: .contrast,
title: NSLocalizedString("Contrast", comment: "Shown in menu"))
display.contrastSliderHandler = contrastSliderHandler
}
display.volumeSliderHandler = volumeSliderHandler
display.brightnessSliderHandler = brightnessSliderHandler
self.displayManager?.addDisplay(display: display)
let monitorMenuItem = NSMenuItem()
monitorMenuItem.title = "\(display.getFriendlyName())"
if asSubMenu {
monitorMenuItem.submenu = monitorSubMenu
}
self.monitorItems.append(monitorMenuItem)
self.statusMenu.insertItem(monitorMenuItem, at: 0)
} }
display.volumeSliderHandler = volumeSliderHandler
display.brightnessSliderHandler = brightnessSliderHandler
let monitorMenuItem = NSMenuItem()
monitorMenuItem.title = "\(display.getFriendlyName())"
if asSubMenu {
monitorMenuItem.submenu = monitorSubMenu
}
self.monitorItems.append(monitorMenuItem)
self.statusMenu.insertItem(monitorMenuItem, at: 0)
} }
private func setupViewControllers() { private func setupViewControllers() {
@ -233,7 +220,7 @@ extension AppDelegate: MediaKeyTapDelegate {
mediaKeyTimer.invalidate() mediaKeyTimer.invalidate()
} }
let displays = self.displayManager?.getDisplays() ?? [Display]() let displays = self.displayManager?.getAllDisplays() ?? [Display]()
guard let currentDisplay = Utils.getCurrentDisplay(from: displays) else { return } guard let currentDisplay = Utils.getCurrentDisplay(from: displays) else { return }
let allDisplays = prefs.bool(forKey: Utils.PrefKeys.allScreens.rawValue) ? displays : [currentDisplay] let allDisplays = prefs.bool(forKey: Utils.PrefKeys.allScreens.rawValue) ? displays : [currentDisplay]

View file

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string> <string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>574</string> <string>583</string>
<key>LSApplicationCategoryType</key> <key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string> <string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>

View file

@ -15,10 +15,21 @@ class DisplayManager {
self.displays = displays self.displays = displays
} }
func getDisplays() -> [Display] { func getAllDisplays() -> [Display] {
return self.displays return self.displays
} }
func getDdcCapableDisplays() -> [Display] {
let filteredDisplays = self.displays.filter { (display) -> Bool in
!display.isBuiltin && display.ddc != nil
}
return filteredDisplays
}
func getBuiltInDisplay() -> Display? {
return self.displays.first { $0.isBuiltin }
}
func addDisplay(display: Display) { func addDisplay(display: Display) {
self.displays.append(display) self.displays.append(display)
} }

View file

@ -61,7 +61,7 @@ class AdvancedPrefsViewController: NSViewController, MASPreferencesViewControlle
} }
@objc func loadDisplayList() { @objc func loadDisplayList() {
if let displays = displayManager?.getDisplays() { if let displays = displayManager?.getDdcCapableDisplays() {
self.displays = displays self.displays = displays
self.displayList.reloadData() self.displayList.reloadData()
} }

View file

@ -57,7 +57,7 @@ class DisplayPrefsViewController: NSViewController, MASPreferencesViewController
// MARK: - Table datasource // MARK: - Table datasource
@objc func loadDisplayList() { @objc func loadDisplayList() {
if let displays = self.displayManager?.getDisplays() { if let displays = self.displayManager?.getAllDisplays() {
self.displays = displays self.displays = displays
} }
self.displayList.reloadData() self.displayList.reloadData()

View file

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string> <string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>574</string> <string>583</string>
<key>LSApplicationCategoryType</key> <key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string> <string>public.app-category.utilities</string>
<key>LSBackgroundOnly</key> <key>LSBackgroundOnly</key>