Skip to content

Commit 8bd093e

Browse files
authored
Bugfix/94/lost keypresses (#95)
* Switch to using virtual keycodes instead of scancodes, rework ordering of key presses / releases * Use similar scheme as for Windows key presses / releases
1 parent bc61583 commit 8bd093e

File tree

2 files changed

+66
-42
lines changed

2 files changed

+66
-42
lines changed

Diff for: src/linux/keypress.c

+32-15
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,48 @@
77
#include <X11/extensions/XTest.h>
88
#include "../xdisplay.h"
99

10-
#define X_KEY_EVENT(display, key, is_press) \
10+
#define X_KEY_EVENT(display, key, is_press) \
1111
(XTestFakeKeyEvent(display, \
12-
XKeysymToKeycode(display, key), \
13-
is_press, CurrentTime), \
12+
XKeysymToKeycode(display, key), \
13+
is_press, CurrentTime), \
1414
XSync(display, false))
1515
#define X_KEY_EVENT_WAIT(display, key, is_press) \
16-
(X_KEY_EVENT(display, key, is_press), \
16+
(X_KEY_EVENT(display, key, is_press), \
1717
microsleep(DEADBEEF_UNIFORM(0.0, 62.5)))
1818

1919
void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags)
2020
{
2121
Display *display = XGetMainDisplay();
2222
const Bool is_press = down ? True : False; /* Just to be safe. */
2323

24-
/* Parse modifier keys. */
25-
if (flags & MOD_META)
26-
X_KEY_EVENT_WAIT(display, K_META, is_press);
27-
if (flags & MOD_ALT)
28-
X_KEY_EVENT_WAIT(display, K_ALT, is_press);
29-
if (flags & MOD_CONTROL)
30-
X_KEY_EVENT_WAIT(display, K_CONTROL, is_press);
31-
if (flags & MOD_SHIFT)
32-
X_KEY_EVENT_WAIT(display, K_SHIFT, is_press);
33-
34-
X_KEY_EVENT(display, code, is_press);
24+
if (down)
25+
{
26+
/* Parse modifier keys. */
27+
if (flags & MOD_META)
28+
X_KEY_EVENT_WAIT(display, K_META, is_press);
29+
if (flags & MOD_ALT)
30+
X_KEY_EVENT_WAIT(display, K_ALT, is_press);
31+
if (flags & MOD_CONTROL)
32+
X_KEY_EVENT_WAIT(display, K_CONTROL, is_press);
33+
if (flags & MOD_SHIFT)
34+
X_KEY_EVENT_WAIT(display, K_SHIFT, is_press);
35+
36+
X_KEY_EVENT_WAIT(display, code, is_press);
37+
}
38+
else
39+
{
40+
X_KEY_EVENT_WAIT(display, code, is_press);
41+
42+
/* Parse modifier keys. */
43+
if (flags & MOD_META)
44+
X_KEY_EVENT(display, K_META, is_press);
45+
if (flags & MOD_ALT)
46+
X_KEY_EVENT(display, K_ALT, is_press);
47+
if (flags & MOD_CONTROL)
48+
X_KEY_EVENT(display, K_CONTROL, is_press);
49+
if (flags & MOD_SHIFT)
50+
X_KEY_EVENT(display, K_SHIFT, is_press);
51+
}
3552
}
3653

3754
void tapKeyCode(MMKeyCode code, MMKeyFlags flags)

Diff for: src/win32/keypress.c

+34-27
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
void win32KeyEvent(int key, MMKeyFlags flags)
1212
{
13-
int scan = MapVirtualKey(key & 0xff, MAPVK_VK_TO_VSC);
14-
1513
/* Set the scan code for extended keys */
1614
switch (key)
1715
{
@@ -55,27 +53,44 @@ void win32KeyEvent(int key, MMKeyFlags flags)
5553

5654
INPUT keyboardInput;
5755
keyboardInput.type = INPUT_KEYBOARD;
58-
keyboardInput.ki.wScan = (WORD)scan;
59-
keyboardInput.ki.dwFlags = KEYEVENTF_SCANCODE | flags;
60-
keyboardInput.ki.time = 0;
61-
SendInput(1, &keyboardInput, sizeof(keyboardInput));
56+
keyboardInput.ki.wVk = (WORD)key;
57+
keyboardInput.ki.dwFlags = flags;
58+
SendInput(1, &keyboardInput, sizeof(INPUT));
6259
}
6360

6461
void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags)
6562
{
6663
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
6764

68-
/* Parse modifier keys. */
69-
if (flags & MOD_META)
70-
WIN32_KEY_EVENT_WAIT(K_META, dwFlags);
71-
if (flags & MOD_ALT)
72-
WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags);
73-
if (flags & MOD_CONTROL)
74-
WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags);
75-
if (flags & MOD_SHIFT)
76-
WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags);
77-
78-
win32KeyEvent(code, dwFlags);
65+
if (down)
66+
{
67+
/* Parse modifier keys. */
68+
if (flags & MOD_META)
69+
WIN32_KEY_EVENT_WAIT(K_META, dwFlags);
70+
if (flags & MOD_ALT)
71+
WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags);
72+
if (flags & MOD_CONTROL)
73+
WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags);
74+
if (flags & MOD_SHIFT)
75+
WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags);
76+
77+
WIN32_KEY_EVENT_WAIT(code, dwFlags);
78+
}
79+
else
80+
{
81+
WIN32_KEY_EVENT_WAIT(code, dwFlags);
82+
83+
/* Parse modifier keys. */
84+
if (flags & MOD_META)
85+
win32KeyEvent(K_META, dwFlags);
86+
if (flags & MOD_ALT)
87+
win32KeyEvent(K_ALT, dwFlags);
88+
if (flags & MOD_CONTROL)
89+
win32KeyEvent(K_CONTROL, dwFlags);
90+
if (flags & MOD_SHIFT)
91+
win32KeyEvent(K_SHIFT, dwFlags);
92+
93+
}
7994
}
8095

8196
void tapKeyCode(MMKeyCode code, MMKeyFlags flags)
@@ -88,17 +103,9 @@ void toggleKey(char c, const bool down, MMKeyFlags flags)
88103
{
89104
MMKeyCode keyCode = keyCodeForChar(c);
90105

91-
//Prevent unused variable warning for Mac and Linux.
92-
int modifiers;
93-
94-
if (isupper(c) && !(flags & MOD_SHIFT))
95-
{
96-
flags |= MOD_SHIFT; /* Not sure if this is safe for all layouts. */
97-
}
98-
99-
modifiers = keyCode >> 8; // Pull out modifers.
106+
int modifiers = keyCode >> 8; // Pull out modifers.
100107
if ((modifiers & 1) != 0)
101-
flags |= MOD_SHIFT; // Uptdate flags from keycode modifiers.
108+
flags |= MOD_SHIFT; // Update flags from keycode modifiers.
102109
if ((modifiers & 2) != 0)
103110
flags |= MOD_CONTROL;
104111
if ((modifiers & 4) != 0)

0 commit comments

Comments
 (0)