diff --git a/MonitorControl/AppDelegate.swift b/MonitorControl/AppDelegate.swift index 68d282f..4eec74c 100644 --- a/MonitorControl/AppDelegate.swift +++ b/MonitorControl/AppDelegate.swift @@ -83,81 +83,68 @@ class AppDelegate: NSObject, NSApplicationDelegate { func updateDisplays() { self.clearDisplays() - let filteredScreens = NSScreen.screens.filter { screen -> Bool in - // Skip built-in displays. - if screen.isBuiltin { - return false - } - return DDC(for: screen.displayID)?.edid() != nil + let screens = NSScreen.screens + + let validScreens = screens.filter { (screen) -> Bool in + !screen.isBuiltin && DDC(for: screen.displayID) != nil } - switch filteredScreens.count { - case 0: - // If no DDC capable display was detected - let item = NSMenuItem() - 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) - default: - os_log("The following supported displays were found:", type: .info) + for screen in screens { + let name = screen.displayName ?? "unknown" + let id = screen.displayID + let isEnabled = (prefs.object(forKey: "\(id)-state") as? Bool) ?? true + let display = Display(screen.displayID, name: name, isBuiltin: screen.isBuiltin, isEnabled: isEnabled) + self.displayManager?.addDisplay(display: display) - for screen in filteredScreens { - os_log(" - %{public}@", type: .info, "\(screen.displayName ?? NSLocalizedString("Unknown", comment: "Unknown display name")) (Vendor: \(screen.vendorNumber ?? 0), Model: \(screen.modelNumber ?? 0))") - self.addScreenToMenu(screen: screen, asSubMenu: filteredScreens.count > 1) + if validScreens.count == 0 { + let item = NSMenuItem() + 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 - /// - /// - 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) + private func addDisplayToMenu(display: Display, asSubMenu: Bool) { + let monitorSubMenu: NSMenu = asSubMenu ? NSMenu() : self.statusMenu - if let edid = ddc?.edid() { - let name = Utils.getDisplayName(forEdid: edid) - let isEnabled = (prefs.object(forKey: "\(id)-state") as? Bool) ?? true + self.statusMenu.insertItem(NSMenuItem.separator(), at: 0) - let display = Display(id, name: name, isBuiltin: screen.isBuiltin, isEnabled: isEnabled) - - let monitorSubMenu: NSMenu = asSubMenu ? NSMenu() : self.statusMenu - - self.statusMenu.insertItem(NSMenuItem.separator(), at: 0) - - let volumeSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, - forDisplay: display, - command: .audioSpeakerVolume, - title: NSLocalizedString("Volume", comment: "Shown in menu")) - let brightnessSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, - forDisplay: display, - command: .brightness, - title: NSLocalizedString("Brightness", comment: "Shown in menu")) - 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) + let volumeSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, + forDisplay: display, + command: .audioSpeakerVolume, + title: NSLocalizedString("Volume", comment: "Shown in menu")) + let brightnessSliderHandler = Utils.addSliderMenuItem(toMenu: monitorSubMenu, + forDisplay: display, + command: .brightness, + title: NSLocalizedString("Brightness", comment: "Shown in menu")) + 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 + + 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() { @@ -233,7 +220,7 @@ extension AppDelegate: MediaKeyTapDelegate { mediaKeyTimer.invalidate() } - let displays = self.displayManager?.getDisplays() ?? [Display]() + let displays = self.displayManager?.getAllDisplays() ?? [Display]() guard let currentDisplay = Utils.getCurrentDisplay(from: displays) else { return } let allDisplays = prefs.bool(forKey: Utils.PrefKeys.allScreens.rawValue) ? displays : [currentDisplay] diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 702f29f..e2ee16a 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 574 + 583 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Manager/DisplayManager.swift b/MonitorControl/Manager/DisplayManager.swift index 383dd97..076dce0 100644 --- a/MonitorControl/Manager/DisplayManager.swift +++ b/MonitorControl/Manager/DisplayManager.swift @@ -15,10 +15,21 @@ class DisplayManager { self.displays = displays } - func getDisplays() -> [Display] { + func getAllDisplays() -> [Display] { 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) { self.displays.append(display) } diff --git a/MonitorControl/View Controllers/AdvancedPrefsViewController.swift b/MonitorControl/View Controllers/AdvancedPrefsViewController.swift index 70912ce..7862775 100644 --- a/MonitorControl/View Controllers/AdvancedPrefsViewController.swift +++ b/MonitorControl/View Controllers/AdvancedPrefsViewController.swift @@ -61,7 +61,7 @@ class AdvancedPrefsViewController: NSViewController, MASPreferencesViewControlle } @objc func loadDisplayList() { - if let displays = displayManager?.getDisplays() { + if let displays = displayManager?.getDdcCapableDisplays() { self.displays = displays self.displayList.reloadData() } diff --git a/MonitorControl/View Controllers/DisplayPrefsViewController.swift b/MonitorControl/View Controllers/DisplayPrefsViewController.swift index 7ae03c8..2833470 100644 --- a/MonitorControl/View Controllers/DisplayPrefsViewController.swift +++ b/MonitorControl/View Controllers/DisplayPrefsViewController.swift @@ -57,7 +57,7 @@ class DisplayPrefsViewController: NSViewController, MASPreferencesViewController // MARK: - Table datasource @objc func loadDisplayList() { - if let displays = self.displayManager?.getDisplays() { + if let displays = self.displayManager?.getAllDisplays() { self.displays = displays } self.displayList.reloadData() diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 0d1eb77..9c44158 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 574 + 583 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly