mirror of
https://github.com/MonitorControl/MonitorControl.git
synced 2026-05-15 14:15:55 -06:00
🔧 Fix function keys not working and retry more often when getting values. (#21)
* Update `ddcctl` submodule. * Update dependencies. * Enable displays by default. * Retry more often to get values from display. * Only print when debugging. Fix #13
This commit is contained in:
parent
7510c136cc
commit
a784f19667
9 changed files with 77 additions and 25 deletions
|
|
@ -207,26 +207,21 @@ class AppDelegate: NSObject, NSApplicationDelegate, MediaKeyTapDelegate {
|
|||
guard let currentDisplay = Utils.getCurrentDisplay(from: displays) else { return }
|
||||
let allDisplays = prefs.bool(forKey: Utils.PrefKeys.allScreens.rawValue) ? displays : [currentDisplay]
|
||||
for display in allDisplays {
|
||||
var rel = 0
|
||||
if prefs.bool(forKey: "\(display.identifier)-state") {
|
||||
if (prefs.object(forKey: "\(display.identifier)-state") as? Bool) ?? true {
|
||||
switch mediaKey {
|
||||
case .brightnessUp:
|
||||
rel = +self.step
|
||||
let value = display.calcNewValue(for: BRIGHTNESS, withRel: rel)
|
||||
let value = display.calcNewValue(for: BRIGHTNESS, withRel: +step)
|
||||
display.setBrightness(to: value)
|
||||
case .brightnessDown:
|
||||
rel = -self.step
|
||||
let value = currentDisplay.calcNewValue(for: BRIGHTNESS, withRel: rel)
|
||||
let value = currentDisplay.calcNewValue(for: BRIGHTNESS, withRel: -step)
|
||||
display.setBrightness(to: value)
|
||||
case .mute:
|
||||
display.mute()
|
||||
case .volumeUp:
|
||||
rel = +self.step
|
||||
let value = display.calcNewValue(for: AUDIO_SPEAKER_VOLUME, withRel: rel)
|
||||
let value = display.calcNewValue(for: AUDIO_SPEAKER_VOLUME, withRel: +step)
|
||||
display.setVolume(to: value)
|
||||
case .volumeDown:
|
||||
rel = -self.step
|
||||
let value = display.calcNewValue(for: AUDIO_SPEAKER_VOLUME, withRel: rel)
|
||||
let value = display.calcNewValue(for: AUDIO_SPEAKER_VOLUME, withRel: -step)
|
||||
display.setVolume(to: value)
|
||||
default:
|
||||
return
|
||||
|
|
|
|||
|
|
@ -28,7 +28,10 @@ class ButtonCellView: NSTableCellView {
|
|||
default:
|
||||
break
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle enabled display state -> \(sender.state == .on ? "on" : "off")")
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,10 @@ class DisplayPrefsViewController: NSViewController, MASPreferencesViewController
|
|||
prefs.set(false, forKey: Utils.PrefKeys.allScreens.rawValue)
|
||||
default: break
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle allScreens state -> \(sender.state == .on ? "on" : "off")")
|
||||
#endif
|
||||
}
|
||||
|
||||
// MARK: - Table datasource
|
||||
|
|
@ -65,10 +68,7 @@ class DisplayPrefsViewController: NSViewController, MASPreferencesViewController
|
|||
|
||||
let name = Utils.getDisplayName(forEdid: edid)
|
||||
let serial = Utils.getDisplaySerial(forEdid: edid)
|
||||
var isEnabled = true
|
||||
if let enabled = prefs.object(forKey: "\(id)-state") as? Bool {
|
||||
isEnabled = enabled
|
||||
}
|
||||
let isEnabled = (prefs.object(forKey: "\(id)-state") as? Bool) ?? true
|
||||
|
||||
let display = Display(id, name: name, serial: serial, isEnabled: isEnabled)
|
||||
displays.append(display)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,11 @@ class KeysPrefsViewController: NSViewController, MASPreferencesViewController {
|
|||
|
||||
@IBAction func listenForChanged(_ sender: NSPopUpButton) {
|
||||
prefs.set(sender.selectedTag(), forKey: Utils.PrefKeys.listenFor.rawValue)
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle keys listened for state state -> \(sender.selectedItem?.title ?? "")")
|
||||
#endif
|
||||
|
||||
NotificationCenter.default.post(name: Notification.Name.init(Utils.PrefKeys.listenFor.rawValue), object: nil)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,10 @@ class MainPrefsViewController: NSViewController, MASPreferencesViewController {
|
|||
SMLoginItemSetEnabled(identifier, false)
|
||||
default: break
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle start at login state -> \(sender.state == .on ? "on" : "off")")
|
||||
#endif
|
||||
}
|
||||
|
||||
@IBAction func showContrastSliderClicked(_ sender: NSButton) {
|
||||
|
|
@ -51,7 +54,11 @@ class MainPrefsViewController: NSViewController, MASPreferencesViewController {
|
|||
prefs.set(false, forKey: Utils.PrefKeys.showContrast.rawValue)
|
||||
default: break
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle show contrast slider state -> \(sender.state == .on ? "on" : "off")")
|
||||
#endif
|
||||
|
||||
NotificationCenter.default.post(name: Notification.Name.init(Utils.PrefKeys.showContrast.rawValue), object: nil)
|
||||
}
|
||||
|
||||
|
|
@ -63,6 +70,9 @@ class MainPrefsViewController: NSViewController, MASPreferencesViewController {
|
|||
prefs.set(false, forKey: Utils.PrefKeys.lowerContrast.rawValue)
|
||||
default: break
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
print("Toggle lower contrast after brightness state -> \(sender.state == .on ? "on" : "off")")
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,22 @@
|
|||
import Cocoa
|
||||
|
||||
class Utils: NSObject {
|
||||
private static func printCommandValue(_ command: Int32, _ value: Int) {
|
||||
let cmdString: (Int32) -> String? = {
|
||||
switch $0 {
|
||||
case BRIGHTNESS:
|
||||
return "Brightness"
|
||||
case CONTRAST:
|
||||
return "Contrast"
|
||||
case AUDIO_SPEAKER_VOLUME:
|
||||
return "Volume"
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
print("\(cmdString(command) ?? "N/A") value: \(value)")
|
||||
}
|
||||
|
||||
// MARK: - DDCCTL
|
||||
|
||||
|
|
@ -21,7 +37,10 @@ class Utils: NSObject {
|
|||
static func sendCommand(_ command: Int32, toMonitor monitor: CGDirectDisplayID, withValue value: Int) {
|
||||
var wrcmd = DDCWriteCommand(control_id: UInt8(command), new_value: UInt8(value))
|
||||
DDCWrite(monitor, &wrcmd)
|
||||
print("\(command == BRIGHTNESS ? "Brightness" : "Volume") value : \(value)")
|
||||
|
||||
#if DEBUG
|
||||
printCommandValue(command, value)
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Get current value of ddcctl command
|
||||
|
|
@ -30,14 +49,18 @@ class Utils: NSObject {
|
|||
/// - command: The command to send
|
||||
/// - monitor: The id of the monitor to send the command to
|
||||
/// - Returns: the value of the command
|
||||
static func getCommand(_ command: Int32, fromMonitor monitor: CGDirectDisplayID) -> Int {
|
||||
static func getCommand(_ command: Int32, fromMonitor monitor: CGDirectDisplayID) -> Int? {
|
||||
var readCmd = DDCReadCommand()
|
||||
readCmd.control_id = UInt8(command)
|
||||
readCmd.max_value = 0
|
||||
readCmd.current_value = 0
|
||||
DDCRead(monitor, &readCmd)
|
||||
print("\(command == BRIGHTNESS ? "Brightness" : "Volume") value : \(readCmd.current_value)")
|
||||
return Int(readCmd.current_value)
|
||||
|
||||
#if DEBUG
|
||||
printCommandValue(command, Int(readCmd.current_value))
|
||||
#endif
|
||||
|
||||
return readCmd.success ? Int(readCmd.current_value) : nil
|
||||
}
|
||||
|
||||
// MARK: - Menu
|
||||
|
|
@ -75,10 +98,8 @@ class Utils: NSObject {
|
|||
slider.target = handler
|
||||
slider.minValue = 0
|
||||
slider.maxValue = 100
|
||||
slider.integerValue = getCommand(command, fromMonitor: display.identifier)
|
||||
slider.action = #selector(SliderHandler.valueChanged)
|
||||
handler.slider = slider
|
||||
display.saveValue(slider.integerValue, for: command)
|
||||
|
||||
view.addSubview(label)
|
||||
view.addSubview(slider)
|
||||
|
|
@ -88,6 +109,26 @@ class Utils: NSObject {
|
|||
menu.insertItem(item, at: 0)
|
||||
menu.insertItem(NSMenuItem.separator(), at: 1)
|
||||
|
||||
DispatchQueue.global(qos: .background).async {
|
||||
var val: Int?
|
||||
|
||||
for _ in 0...100 {
|
||||
if let res = getCommand(command, fromMonitor: display.identifier) {
|
||||
val = res
|
||||
break
|
||||
}
|
||||
usleep(40000)
|
||||
}
|
||||
|
||||
if let val = val {
|
||||
display.saveValue(val, for: command)
|
||||
|
||||
DispatchQueue.main.async {
|
||||
slider.integerValue = val
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return handler
|
||||
}
|
||||
|
||||
|
|
|
|||
1
Podfile
1
Podfile
|
|
@ -7,5 +7,4 @@ target 'MonitorControl' do
|
|||
|
||||
pod 'MediaKeyTap', :git => 'https://github.com/the0neyouseek/MediaKeyTap.git'
|
||||
pod 'MASPreferences'
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -12,13 +12,13 @@ EXTERNAL SOURCES:
|
|||
|
||||
CHECKOUT OPTIONS:
|
||||
MediaKeyTap:
|
||||
:commit: f369a24f6c9931f2a1485a6cd1cef94a432bb36e
|
||||
:commit: 61a64c17d598de7126f24befde6bdbd5dc7fa121
|
||||
:git: https://github.com/the0neyouseek/MediaKeyTap.git
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
MASPreferences: c08b8622dd17b47da87669e741efd7c92e970e8c
|
||||
MediaKeyTap: b652877e9ae2d52ca4f5310fa5152945ad3f0798
|
||||
|
||||
PODFILE CHECKSUM: 3404918793c88a6c1f56a30e54cf0d9afb0cfffb
|
||||
PODFILE CHECKSUM: efa14c79ecdfeaf061bbc8ed950ee540d77f987a
|
||||
|
||||
COCOAPODS: 1.3.1
|
||||
COCOAPODS: 1.4.0
|
||||
|
|
|
|||
2
ddcctl
2
ddcctl
|
|
@ -1 +1 @@
|
|||
Subproject commit d11c3f4a63a090923b55ec93f363b381f2729d0c
|
||||
Subproject commit 3d38860d5b1de15199a42d9c5a34756738ca9b2a
|
||||
Loading…
Add table
Add a link
Reference in a new issue