mirror of
https://github.com/MonitorControl/MonitorControl.git
synced 2026-05-15 22:01:08 -06:00
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:
parent
c984a8c343
commit
46d7cb6b91
6 changed files with 69 additions and 71 deletions
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue