Skip to content

Commit 2c8692c

Browse files
committed
Add special key support
1 parent 83d31af commit 2c8692c

File tree

4 files changed

+107
-8
lines changed

4 files changed

+107
-8
lines changed

JoyKeyMapper/DataModels/GameController.swift

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//
88

99
import JoyConSwift
10+
import InputMethodKit
1011

1112
extension JoyCon.BatteryStatus {
1213
static let stringMap: [JoyCon.BatteryStatus: String] = [
@@ -199,9 +200,27 @@ class GameController {
199200
if config.keyCode >= 0 {
200201
metaKeyEvent(config: config, keyDown: true)
201202

202-
let event = CGEvent(keyboardEventSource: source, virtualKey: CGKeyCode(config.keyCode), keyDown: true)
203-
event?.flags = CGEventFlags(rawValue: CGEventFlags.RawValue(config.modifiers))
204-
event?.post(tap: .cghidEventTap)
203+
if let systemKey = systemDefinedKey[Int(config.keyCode)] {
204+
let mousePos = NSEvent.mouseLocation
205+
let flags = NSEvent.ModifierFlags(rawValue: 0x0a00)
206+
let data1 = Int((systemKey << 16) | 0x0a00)
207+
208+
let ev = NSEvent.otherEvent(
209+
with: .systemDefined,
210+
location: mousePos,
211+
modifierFlags: flags,
212+
timestamp: ProcessInfo().systemUptime,
213+
windowNumber: 0,
214+
context: nil,
215+
subtype: Int16(NX_SUBTYPE_AUX_CONTROL_BUTTONS),
216+
data1: data1,
217+
data2: -1)
218+
ev?.cgEvent?.post(tap: .cghidEventTap)
219+
} else {
220+
let event = CGEvent(keyboardEventSource: source, virtualKey: CGKeyCode(config.keyCode), keyDown: true)
221+
event?.flags = CGEventFlags(rawValue: CGEventFlags.RawValue(config.modifiers))
222+
event?.post(tap: .cghidEventTap)
223+
}
205224
}
206225

207226
if config.mouseButton >= 0 {
@@ -237,11 +256,29 @@ class GameController {
237256
let source = CGEventSource(stateID: .hidSystemState)
238257

239258
if config.keyCode >= 0 {
259+
if let systemKey = systemDefinedKey[Int(config.keyCode)] {
260+
let mousePos = NSEvent.mouseLocation
261+
let flags = NSEvent.ModifierFlags(rawValue: 0x0b00)
262+
let data1 = Int((systemKey << 16) | 0x0b00)
263+
264+
let ev = NSEvent.otherEvent(
265+
with: .systemDefined,
266+
location: mousePos,
267+
modifierFlags: flags,
268+
timestamp: ProcessInfo().systemUptime,
269+
windowNumber: 0,
270+
context: nil,
271+
subtype: Int16(NX_SUBTYPE_AUX_CONTROL_BUTTONS),
272+
data1: data1,
273+
data2: -1)
274+
ev?.cgEvent?.post(tap: .cghidEventTap)
275+
} else {
240276
let event = CGEvent(keyboardEventSource: source, virtualKey: CGKeyCode(config.keyCode), keyDown: false)
241277
event?.flags = CGEventFlags(rawValue: CGEventFlags.RawValue(config.modifiers))
242278
event?.post(tap: .cghidEventTap)
279+
}
243280

244-
metaKeyEvent(config: config, keyDown: false)
281+
metaKeyEvent(config: config, keyDown: false)
245282
}
246283

247284
if config.mouseButton >= 0 {

JoyKeyMapper/Misc/Utils.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,14 @@ func getKeyName(keyCode: UInt16) -> String {
8181

8282
return name.uppercased()
8383
}
84+
85+
/** Get the frontmost winodow ID. Currently not used. */
86+
func getFrontmostWinodowNumber() -> Int? {
87+
let app = NSWorkspace.shared.frontmostApplication
88+
guard let pidInt32 = app?.processIdentifier else { return nil }
89+
let pid = Int64(pidInt32)
90+
guard let windowList = CGWindowListCopyWindowInfo(.optionAll, kCGNullWindowID) as? [NSDictionary] else { return nil }
91+
let window = windowList.first { ($0[kCGWindowOwnerPID] as? Int64 ?? -1) == pid }
92+
93+
return window?[kCGWindowNumber] as? Int
94+
}

JoyKeyMapper/Views/KeyConfigView/KeyConfigComboBox.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ let keyCodeList: [Int] = [
2020
kVK_Space,
2121
kVK_Delete,
2222
kVK_Escape,
23-
kVK_CapsLock,
23+
// kVK_CapsLock,
2424
kVK_RightShift,
2525
kVK_RightOption,
2626
kVK_RightControl,
@@ -70,7 +70,7 @@ let keyCodeList: [Int] = [
7070
kVK_JIS_Underscore,
7171
kVK_JIS_Eisu,
7272
kVK_JIS_Kana,
73-
kVK_Help,
73+
// kVK_Help,
7474
kVK_Home,
7575
kVK_PageUp,
7676
kVK_PageDown,
@@ -79,7 +79,15 @@ let keyCodeList: [Int] = [
7979
kVK_LeftArrow,
8080
kVK_RightArrow,
8181
kVK_DownArrow,
82-
kVK_UpArrow
82+
kVK_UpArrow,
83+
SpecialKey_BrightnessUp,
84+
SpecialKey_BrightnessDown,
85+
// SpecialKey_NumLock,
86+
SpecialKey_Play,
87+
SpecialKey_Next,
88+
SpecialKey_Previous,
89+
SpecialKey_Fast,
90+
SpecialKey_Rewind
8391
]
8492

8593
let keyCells: [NSComboBoxCell] = {

JoyKeyMapper/Views/KeyMapList/SpecialKeyName.swift

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@
99
import Foundation
1010
import InputMethodKit
1111

12+
let SpecialKey_BaseValue = 0x7000
13+
let SpecialKey_BrightnessUp = SpecialKey_BaseValue + Int(NX_KEYTYPE_BRIGHTNESS_UP)
14+
let SpecialKey_BrightnessDown = SpecialKey_BaseValue + Int(NX_KEYTYPE_BRIGHTNESS_DOWN)
15+
let SpecialKey_Power = SpecialKey_BaseValue + Int(NX_POWER_KEY)
16+
let SpecialKey_NumLock = SpecialKey_BaseValue + Int(NX_KEYTYPE_NUM_LOCK)
17+
let SpecialKey_Play = SpecialKey_BaseValue + Int(NX_KEYTYPE_PLAY)
18+
let SpecialKey_Next = SpecialKey_BaseValue + Int(NX_KEYTYPE_NEXT)
19+
let SpecialKey_Previous = SpecialKey_BaseValue + Int(NX_KEYTYPE_PREVIOUS)
20+
let SpecialKey_Fast = SpecialKey_BaseValue + Int(NX_KEYTYPE_FAST)
21+
let SpecialKey_Rewind = SpecialKey_BaseValue + Int(NX_KEYTYPE_REWIND)
22+
1223
let SpecialKeyName: [Int:String] = [
1324
kVK_ISO_Section: "Section",
1425
kVK_Return: "Return",
@@ -80,9 +91,41 @@ let SpecialKeyName: [Int:String] = [
8091
kVK_LeftArrow: "",
8192
kVK_RightArrow: "",
8293
kVK_DownArrow: "",
83-
kVK_UpArrow: ""
94+
kVK_UpArrow: "",
95+
SpecialKey_BrightnessUp: "BrightnessUp",
96+
SpecialKey_BrightnessDown: "BrightnessDown",
97+
SpecialKey_NumLock: "NumLock",
98+
SpecialKey_Play: "Play",
99+
SpecialKey_Next: "Next",
100+
SpecialKey_Previous: "Previous",
101+
SpecialKey_Fast: "Fast",
102+
SpecialKey_Rewind: "Rewind"
84103
]
85104

86105
let LocalizedSpecialKeyName = SpecialKeyName.mapValues {
87106
NSLocalizedString($0, comment: $0)
88107
}
108+
109+
let systemDefinedKey: [Int: Int32] = [
110+
kVK_VolumeUp: NX_KEYTYPE_SOUND_UP,
111+
kVK_VolumeDown: NX_KEYTYPE_SOUND_DOWN,
112+
SpecialKey_BrightnessUp: NX_KEYTYPE_BRIGHTNESS_UP,
113+
SpecialKey_BrightnessDown: NX_KEYTYPE_BRIGHTNESS_DOWN,
114+
// kVK_CapsLock: NX_KEYTYPE_CAPS_LOCK,
115+
// kVK_Help: NX_KEYTYPE_HELP,
116+
// NX_POWER_KEY
117+
kVK_Mute: NX_KEYTYPE_MUTE,
118+
// NX_UP_ARROW_KEY
119+
// NX_DOWN_ARROW_KEY
120+
// NX_KEYTYPE_NUM_LOCK,
121+
// NX_KEYTYPE_CONTRAST_UP
122+
// NX_KEYTYPE_CONTRAST_DOWN
123+
// NX_KEYTYPE_LAUNCH_PANEL
124+
// NX_KEYTYPE_EJECT
125+
// NX_KEYTYPE_VIDMIRROR
126+
SpecialKey_Play: NX_KEYTYPE_PLAY,
127+
SpecialKey_Next: NX_KEYTYPE_NEXT,
128+
SpecialKey_Previous: NX_KEYTYPE_PREVIOUS,
129+
SpecialKey_Fast: NX_KEYTYPE_FAST,
130+
SpecialKey_Rewind: NX_KEYTYPE_REWIND
131+
]

0 commit comments

Comments
 (0)