13
13
14
14
/* Convenience wrappers around ugly APIs. */
15
15
#if defined(IS_WINDOWS )
16
- #define WIN32_KEY_EVENT (key , flags ) keybd_event(key, 0, flags, 0)
17
16
#define WIN32_KEY_EVENT_WAIT (key , flags ) \
18
- (WIN32_KEY_EVENT (key, flags), Sleep(DEADBEEF_RANDRANGE(0, 63)))
17
+ (win32KeyEvent (key, flags), Sleep(DEADBEEF_RANDRANGE(0, 63)))
19
18
#elif defined(USE_X11 )
20
19
#define X_KEY_EVENT (display , key , is_press ) \
21
20
(XTestFakeKeyEvent(display, \
27
26
microsleep(DEADBEEF_UNIFORM(0.0, 62.5)))
28
27
#endif
29
28
29
+ #if defined(IS_WINDOWS )
30
+ void win32KeyEvent (int key , MMKeyFlags flags )
31
+ {
32
+ int scan = MapVirtualKey (key & 0xff , 0 );
33
+
34
+ /* Set the scancode for keyup */
35
+ if ( flags & KEYEVENTF_KEYUP ) {
36
+ scan = scan | 0x80 ;
37
+ }
38
+
39
+ keybd_event (key , scan , flags , 0 );
40
+ }
41
+ #endif
42
+
30
43
void toggleKeyCode (MMKeyCode code , const bool down , MMKeyFlags flags )
31
44
{
32
45
#if defined(IS_MACOSX )
@@ -47,7 +60,7 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags)
47
60
if (flags & MOD_CONTROL ) WIN32_KEY_EVENT_WAIT (K_CONTROL , dwFlags );
48
61
if (flags & MOD_SHIFT ) WIN32_KEY_EVENT_WAIT (K_SHIFT , dwFlags );
49
62
50
- WIN32_KEY_EVENT (code , dwFlags );
63
+ win32KeyEvent (code , dwFlags );
51
64
#elif defined(USE_X11 )
52
65
Display * display = XGetMainDisplay ();
53
66
const Bool is_press = down ? True : False ; /* Just to be safe. */
0 commit comments