diff --git a/MTMR/HapticFeedback.swift b/MTMR/HapticFeedback.swift index e9d8752..8fc3ae1 100644 --- a/MTMR/HapticFeedback.swift +++ b/MTMR/HapticFeedback.swift @@ -9,14 +9,14 @@ import IOKit class HapticFeedback { - private var actuatorRef: CFTypeRef? + private var correctDeviceId: UInt64? // Here we have list of possible IDs for Haptic Generator Device. They are not constant // To find deviceID, you will need IORegistryExplorer app from Additional Tools for Xcode dmg // which you can download from https://developer.apple.com/download/more/?=Additional%20Tools // Open IORegistryExplorer app, search for AppleMultitouchDevice and get "Multitouch ID" // There should be programmatic way to get it but I can't find, no docs for macOS :( - private var possibleDeviceIDs: [UInt64] = [ + private let possibleDeviceIDs: [UInt64] = [ 0x200_0000_0100_0000, // MacBook Pro 2016/2017 0x300000080500000 // MacBook Pro 2019 (possibly 2018 as well) ] @@ -24,8 +24,11 @@ class HapticFeedback { init() { // Let's find and init Haptic device possibleDeviceIDs.forEach {(deviceID) in - guard actuatorRef == nil else {return} - actuatorRef = MTActuatorCreateFromDeviceID(deviceID).takeRetainedValue() + guard correctDeviceId == nil else {return} + let actuatorRef: CFTypeRef? = MTActuatorCreateFromDeviceID(deviceID).takeRetainedValue() + if actuatorRef != nil { + correctDeviceId = deviceID + } } } @@ -41,8 +44,15 @@ class HapticFeedback { // you can get a plist `otool -s __TEXT __tpad_act_plist /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/Current/MultitouchSupport|tail -n +3|awk -F'\t' '{print $2}'|xxd -r -p` func tap(strong: Int32) { + guard correctDeviceId != nil else { + print("guard correctDeviceId == nil (no haptic device found?)") + return + } + + let actuatorRef: CFTypeRef? = MTActuatorCreateFromDeviceID(correctDeviceId!).takeRetainedValue() + guard actuatorRef != nil else { - print("guard actuatorRef == nil (can't find proper haptic device?)") + print("guard actuatorRef == nil") return }