diff --git a/razer-tilt.swift b/razer-tilt.swift index 213ede9..f822713 100644 --- a/razer-tilt.swift +++ b/razer-tilt.swift @@ -17,7 +17,7 @@ struct ReportSource: Hashable { final class State { var buffers: [IOHIDDevice: UnsafeMutablePointer] = [:] var lastBits: [ReportSource: UInt8] = [:] - var lastFired: [UInt8: TimeInterval] = [:] + var lastFired: [CGKeyCode: TimeInterval] = [:] var opened = false var lastStatus = "" } @@ -37,7 +37,11 @@ func sendCommandKey(_ keyCode: CGKeyCode) { up.post(tap: .cgSessionEventTap) } -let tiltMask: UInt8 = 0x60 +// The mouse reports tilt on either bit pair depending on its mode after (re)connecting: +// 0x20/0x40, or 0x08/0x10 (seen after a replug). +let leftTiltMask: UInt8 = 0x20 | 0x08 +let rightTiltMask: UInt8 = 0x40 | 0x10 +let tiltMask = leftTiltMask | rightTiltMask // Ignore a second press of the same tilt within this window (switch bounce). let debounceInterval: TimeInterval = 0.12 @@ -52,9 +56,9 @@ let reportCallback: IOHIDReportCallback = { let pressed = value & ~(state.lastBits[source] ?? 0) state.lastBits[source] = value let now = ProcessInfo.processInfo.systemUptime - for (mask, keyCode) in [(UInt8(0x20), CGKeyCode(33)), (UInt8(0x40), CGKeyCode(30))] where pressed & mask != 0 { - if let last = state.lastFired[mask], now - last < debounceInterval { continue } - state.lastFired[mask] = now + for (mask, keyCode) in [(leftTiltMask, CGKeyCode(33)), (rightTiltMask, CGKeyCode(30))] where pressed & mask != 0 { + if let last = state.lastFired[keyCode], now - last < debounceInterval { continue } + state.lastFired[keyCode] = now sendCommandKey(keyCode) } }