6
6
7
7
#if defined(IS_MACOSX )
8
8
#include <ApplicationServices/ApplicationServices.h>
9
+ #import <IOKit/hidsystem/IOHIDLib.h>
10
+ #import <IOKit/hidsystem/ev_keymap.h>
9
11
#elif defined(USE_X11 )
10
12
#include <X11/extensions/XTest.h>
11
13
#include "xdisplay.h"
26
28
microsleep(DEADBEEF_UNIFORM(0.0, 62.5)))
27
29
#endif
28
30
31
+ #if defined(IS_MACOSX )
32
+ bool keyCodeRequiresSystemDefinedEvent (MMKeyCode code ) {
33
+ return code == NX_KEYTYPE_SOUND_UP ||
34
+ code == NX_KEYTYPE_SOUND_DOWN ||
35
+ code == NX_KEYTYPE_MUTE ||
36
+ code == NX_KEYTYPE_PLAY ||
37
+ code == NX_KEYTYPE_BRIGHTNESS_UP ||
38
+ code == NX_KEYTYPE_BRIGHTNESS_DOWN ||
39
+ code == NX_KEYTYPE_PLAY ||
40
+ code == NX_KEYTYPE_PREVIOUS ||
41
+ code == NX_KEYTYPE_NEXT ||
42
+ code == NX_KEYTYPE_ILLUMINATION_UP ||
43
+ code == NX_KEYTYPE_ILLUMINATION_DOWN ||
44
+ code == NX_KEYTYPE_ILLUMINATION_TOGGLE
45
+ ;
46
+ }
47
+ static io_connect_t _getAuxiliaryKeyDriver (void )
48
+ {
49
+ static mach_port_t sEventDrvrRef = 0 ;
50
+ mach_port_t masterPort , service , iter ;
51
+ kern_return_t kr ;
52
+
53
+ if (!sEventDrvrRef )
54
+ {
55
+ kr = IOMasterPort ( bootstrap_port , & masterPort );
56
+ assert (KERN_SUCCESS == kr );
57
+ kr = IOServiceGetMatchingServices (masterPort , IOServiceMatching ( kIOHIDSystemClass ), & iter );
58
+ assert (KERN_SUCCESS == kr );
59
+ service = IOIteratorNext ( iter );
60
+ assert (service );
61
+ kr = IOServiceOpen (service , mach_task_self (), kIOHIDParamConnectType , & sEventDrvrRef );
62
+ assert (KERN_SUCCESS == kr );
63
+ IOObjectRelease (service );
64
+ IOObjectRelease (iter );
65
+ }
66
+ return sEventDrvrRef ;
67
+ }
68
+ #endif
69
+
29
70
#if defined(IS_WINDOWS )
30
71
void win32KeyEvent (int key , MMKeyFlags flags )
31
72
{
@@ -43,14 +84,26 @@ void win32KeyEvent(int key, MMKeyFlags flags)
43
84
void toggleKeyCode (MMKeyCode code , const bool down , MMKeyFlags flags )
44
85
{
45
86
#if defined(IS_MACOSX )
46
- CGEventRef keyEvent = CGEventCreateKeyboardEvent (NULL ,
47
- (CGKeyCode )code , down );
48
- assert (keyEvent != NULL );
49
-
50
- CGEventSetType (keyEvent , down ? kCGEventKeyDown : kCGEventKeyUp );
51
- CGEventSetFlags (keyEvent , flags );
52
- CGEventPost (kCGSessionEventTap , keyEvent );
53
- CFRelease (keyEvent );
87
+ if (keyCodeRequiresSystemDefinedEvent (code )) {
88
+ NXEventData event ;
89
+ kern_return_t kr ;
90
+ IOGPoint loc = { 0 , 0 };
91
+ UInt32 evtInfo = code << 16 | (down ?NX_KEYDOWN :NX_KEYUP ) << 8 ;
92
+ bzero (& event , sizeof (NXEventData ));
93
+ event .compound .subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS ;
94
+ event .compound .misc .L [0 ] = evtInfo ;
95
+ kr = IOHIDPostEvent ( _getAuxiliaryKeyDriver (), NX_SYSDEFINED , loc , & event , kNXEventDataVersion , 0 , FALSE );
96
+ assert ( KERN_SUCCESS == kr );
97
+ } else {
98
+ CGEventRef keyEvent = CGEventCreateKeyboardEvent (NULL ,
99
+ (CGKeyCode )code , down );
100
+ assert (keyEvent != NULL );
101
+
102
+ CGEventSetType (keyEvent , down ? kCGEventKeyDown : kCGEventKeyUp );
103
+ CGEventSetFlags (keyEvent , flags );
104
+ CGEventPost (kCGSessionEventTap , keyEvent );
105
+ CFRelease (keyEvent );
106
+ }
54
107
#elif defined(IS_WINDOWS )
55
108
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP ;
56
109
0 commit comments