8 #include <CoreFoundation/CoreFoundation.h>
12 using namespace swift::misc::input;
14 namespace swift::input
19 { kHIDUsage_Keyboard0, Key_0 },
20 { kHIDUsage_Keyboard1, Key_1 },
21 { kHIDUsage_Keyboard2, Key_2 },
22 { kHIDUsage_Keyboard3, Key_3 },
23 { kHIDUsage_Keyboard4, Key_4 },
24 { kHIDUsage_Keyboard5, Key_5 },
25 { kHIDUsage_Keyboard6, Key_6 },
26 { kHIDUsage_Keyboard7, Key_7 },
27 { kHIDUsage_Keyboard8, Key_8 },
28 { kHIDUsage_Keyboard9, Key_9 },
29 { kHIDUsage_KeyboardA, Key_A },
30 { kHIDUsage_KeyboardB, Key_B },
31 { kHIDUsage_KeyboardC, Key_C },
32 { kHIDUsage_KeyboardD, Key_D },
33 { kHIDUsage_KeyboardE, Key_E },
34 { kHIDUsage_KeyboardF, Key_F },
35 { kHIDUsage_KeyboardG, Key_G },
36 { kHIDUsage_KeyboardH, Key_H },
37 { kHIDUsage_KeyboardI, Key_I },
38 { kHIDUsage_KeyboardJ, Key_J },
39 { kHIDUsage_KeyboardK, Key_K },
40 { kHIDUsage_KeyboardL, Key_L },
41 { kHIDUsage_KeyboardM, Key_M },
42 { kHIDUsage_KeyboardN, Key_N },
43 { kHIDUsage_KeyboardO, Key_O },
44 { kHIDUsage_KeyboardP, Key_P },
45 { kHIDUsage_KeyboardQ, Key_Q },
46 { kHIDUsage_KeyboardR, Key_R },
47 { kHIDUsage_KeyboardS, Key_S },
48 { kHIDUsage_KeyboardT, Key_T },
49 { kHIDUsage_KeyboardU, Key_U },
50 { kHIDUsage_KeyboardV, Key_V },
51 { kHIDUsage_KeyboardW, Key_W },
52 { kHIDUsage_KeyboardX, Key_X },
53 { kHIDUsage_KeyboardY, Key_Y },
54 { kHIDUsage_KeyboardZ, Key_Z },
55 { kHIDUsage_KeypadPlus, Key_NumpadPlus },
56 { kHIDUsage_KeypadHyphen, Key_NumpadMinus },
57 { kHIDUsage_KeyboardHyphen, Key_Minus },
58 { kHIDUsage_KeyboardPeriod, Key_Period },
59 { kHIDUsage_KeypadAsterisk, Key_Multiply },
60 { kHIDUsage_KeypadSlash, Key_Divide },
61 { kHIDUsage_KeypadHyphen, Key_NumpadMinus },
62 { kHIDUsage_KeypadPlus, Key_NumpadPlus },
63 { kHIDUsage_KeypadPeriod, Key_NumpadDelete },
64 { kHIDUsage_KeyboardDeleteOrBackspace, Key_Back },
65 { kHIDUsage_KeyboardTab, Key_Tab },
66 { kHIDUsage_KeyboardEscape, Key_Esc },
67 { kHIDUsage_KeyboardSpacebar, Key_Space },
68 { kHIDUsage_KeyboardGraveAccentAndTilde, Key_DeadGrave },
69 { kHIDUsage_KeyboardComma, Key_Comma },
70 { kHIDUsage_Keypad0, Key_Numpad0 },
71 { kHIDUsage_Keypad1, Key_Numpad1 },
72 { kHIDUsage_Keypad2, Key_Numpad2 },
73 { kHIDUsage_Keypad3, Key_Numpad3 },
74 { kHIDUsage_Keypad4, Key_Numpad4 },
75 { kHIDUsage_Keypad5, Key_Numpad5 },
76 { kHIDUsage_Keypad6, Key_Numpad6 },
77 { kHIDUsage_Keypad7, Key_Numpad7 },
78 { kHIDUsage_Keypad8, Key_Numpad8 },
79 { kHIDUsage_Keypad9, Key_Numpad9 },
80 { kHIDUsage_KeyboardRightControl, Key_ControlRight },
81 { kHIDUsage_KeyboardLeftControl, Key_ControlLeft },
82 { kHIDUsage_KeyboardRightAlt, Key_AltRight },
83 { kHIDUsage_KeyboardLeftAlt, Key_AltLeft },
84 { kHIDUsage_KeyboardInsert, Key_Insert },
85 { kHIDUsage_KeyboardDeleteForward, Key_Delete },
86 { kHIDUsage_KeyboardHome, Key_Home },
87 { kHIDUsage_KeyboardEnd, Key_End },
88 { kHIDUsage_KeyboardPageUp, Key_PageUp },
89 { kHIDUsage_KeyboardPageDown, Key_PageDown },
90 { kHIDUsage_KeyboardCapsLock, Key_CapsLock },
91 { kHIDUsage_KeyboardReturn, Key_Enter },
92 { kHIDUsage_KeyboardF1, Key_Function1 },
93 { kHIDUsage_KeyboardF2, Key_Function2 },
94 { kHIDUsage_KeyboardF3, Key_Function3 },
95 { kHIDUsage_KeyboardF4, Key_Function4 },
96 { kHIDUsage_KeyboardF5, Key_Function5 },
97 { kHIDUsage_KeyboardF6, Key_Function6 },
98 { kHIDUsage_KeyboardF7, Key_Function7 },
99 { kHIDUsage_KeyboardF8, Key_Function8 },
100 { kHIDUsage_KeyboardF9, Key_Function9 },
101 { kHIDUsage_KeyboardF10, Key_Function10 },
102 { kHIDUsage_KeyboardF11, Key_Function11 },
103 { kHIDUsage_KeyboardF12, Key_Function12 },
104 { kHIDUsage_KeyboardF13, Key_Function13 },
105 { kHIDUsage_KeyboardF14, Key_Function14 },
106 { kHIDUsage_KeyboardF15, Key_Function15 },
107 { kHIDUsage_KeyboardF16, Key_Function16 },
108 { kHIDUsage_KeyboardF17, Key_Function17 },
109 { kHIDUsage_KeyboardF18, Key_Function18 },
110 { kHIDUsage_KeyboardF19, Key_Function19 },
111 { kHIDUsage_KeyboardF20, Key_Function20 },
112 { kHIDUsage_KeyboardF21, Key_Function21 },
113 { kHIDUsage_KeyboardF22, Key_Function22 },
114 { kHIDUsage_KeyboardF23, Key_Function23 },
115 { kHIDUsage_KeyboardF24, Key_Function24 },
131 CKeyboardMacOS::CKeyboardMacOS(QObject *parent) : IKeyboard(parent)
134 void CKeyboardMacOS::processKeyEvent(IOHIDValueRef value)
136 IOHIDElementRef element = IOHIDValueGetElement(value);
137 UInt32 usagePage = IOHIDElementGetUsagePage(element);
138 if (usagePage != kHIDPage_KeyboardOrKeypad) {
return; }
140 quint32 scancode = IOHIDElementGetUsage(element);
142 KeyCode code = convertToKey(scancode);
143 if (code != Key_Unknown)
146 bool pressed = IOHIDValueGetIntegerValue(value) == 1;
149 m_keyCombination.addKeyboardKey(code);
153 m_keyCombination.removeKeyboardKey(code);
156 if (oldCombination != m_keyCombination)
158 emit keyCombinationChanged(m_keyCombination);
163 CKeyboardMacOS::~CKeyboardMacOS()
167 IOHIDManagerClose(m_hidManager, kIOHIDOptionsTypeNone);
168 CFRelease(m_hidManager);
172 bool CKeyboardMacOS::init()
174 if (!CMacOSInputUtils::requestAccess())
178 m_hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
180 CFMutableArrayRef matchingArray = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
187 CFDictionaryRef matchingDict = CMacOSInputUtils::createDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
190 CFArrayAppendValue(matchingArray, matchingDict);
191 CFRelease(matchingDict);
194 matchingDict = CMacOSInputUtils::createDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keypad);
197 CFArrayAppendValue(matchingArray, matchingDict);
198 CFRelease(matchingDict);
201 IOHIDManagerSetDeviceMatchingMultiple(m_hidManager, matchingArray);
202 CFRelease(matchingArray);
204 IOHIDManagerRegisterInputValueCallback(m_hidManager, valueCallback,
this);
205 IOHIDManagerScheduleWithRunLoop(m_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
206 const auto result = IOHIDManagerOpen(m_hidManager, kIOHIDOptionsTypeNone);
208 if (result == kIOReturnSuccess)
214 CLogMessage(
this).
error(u
"Failed to open HID manager for keyboard monitoring");
219 void CKeyboardMacOS::valueCallback(
void *context, IOReturn result,
void *sender, IOHIDValueRef value)
224 obj->processKeyEvent(value);
227 KeyCode CKeyboardMacOS::convertToKey(quint32 keyCode)
229 return keyMapping.value(keyCode, Key_Unknown);
Class for emitting a log message.
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & debug()
Set the severity to debug.
KeyCode
Key code http://www.kbdlayout.info/.
Free functions in swift::misc.