#define MAX_PENDING_EVENTS 20
static int inputcode_pending[MAX_PENDING_EVENTS], inputcode_pending_state[MAX_PENDING_EVENTS];
-static void inputdevice_release_all_keys (void)
-{
- int i;
-
- for (i = 0; i < 0x80; i++) {
- if (keybuf[i] != 0) {
- keybuf[i] = 0;
- record_key (i << 1|1);
- }
- }
-}
-
static bool inputdevice_handle_inputcode_immediate(int code, int state)
{
switch(code)
if (na->extra[j] == capstable[i]) {
if (oldcaps != capstable[i + 1]) {
oldcaps = capstable[i + 1];
- inputdevice_translatekeycode (0, capstable[i], oldcaps ? -1 : 0);
+ inputdevice_translatekeycode (0, capstable[i], oldcaps ? -1 : 0, false);
}
return i;
}
}
}
-static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int keystate, bool qualifiercheckonly)
+static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int keystate, bool qualifiercheckonly, bool ignorecanrelease)
{
struct uae_input_device *na = &keyboards[keyboard];
int j, k;
if (!invert)
*flagsp |= ID_FLAG_CANRELEASE;
} else {
+ if (ignorecanrelease)
+ flags |= ID_FLAG_CANRELEASE;
if (!(flags & ID_FLAG_CANRELEASE) && !invert)
continue;
*flagsp &= ~ID_FLAG_CANRELEASE;
}
// main keyboard press/release entry point
-int inputdevice_translatekeycode (int keyboard, int scancode, int state)
+int inputdevice_translatekeycode (int keyboard, int scancode, int state, bool alwaysrelease)
{
// if not default keyboard and all events are empty: use default keyboard
if (!input_get_default_keyboard(keyboard) && isemptykey(keyboard, scancode)) {
keyboard = input_get_default_keyboard(-1);
}
- if (inputdevice_translatekeycode_2 (keyboard, scancode, state, false))
+ if (inputdevice_translatekeycode_2 (keyboard, scancode, state, false, alwaysrelease))
return 1;
if (currprefs.mmkeyboard && scancode > 0) {
sendmmcodes (scancode, state);
}
void inputdevice_checkqualifierkeycode (int keyboard, int scancode, int state)
{
- inputdevice_translatekeycode_2 (keyboard, scancode, state, true);
+ inputdevice_translatekeycode_2 (keyboard, scancode, state, true, false);
}
static const TCHAR *internaleventlabels[] = {
#define RAWINPUT_DEBUG 0
#define DI_DEBUG 1
#define IGNOREEVERYTHING 0
+#define DEBUG_SCANCODE 0
#define NEGATIVEMINHACK 0
static byte backslashstate, apostrophstate;
//check ALT-F4
- if (pressed && !di_keycodes[num][DIK_F4] && scancode == DIK_F4) {
- if (di_keycodes[num][DIK_LALT] && !currprefs.win32_ctrl_F11_is_quit) {
+ if (pressed && !(di_keycodes[num][DIK_F4] & 1) && scancode == DIK_F4) {
+ if ((di_keycodes[num][DIK_LALT] & 1) && !currprefs.win32_ctrl_F11_is_quit) {
#ifdef RETROPLATFORM
if (rp_close ())
return -1;
#endif
// release mouse if TAB and ALT is pressed
- if (pressed && di_keycodes[num][DIK_LALT] && scancode == DIK_TAB) {
+ if (pressed && (di_keycodes[num][DIK_LALT] & 1) && scancode == DIK_TAB) {
disablecapture ();
return -1;
}
//is release
if (scancode == DIK_BACKSLASH) // The # key
{
- if (di_keycodes[num][DIK_LSHIFT] || di_keycodes[num][DIK_RSHIFT] || apostrophstate)
+ if ((di_keycodes[num][DIK_LSHIFT] & 1) || (di_keycodes[num][DIK_RSHIFT] & 1) || apostrophstate)
{
if (pressed)
- { apostrophstate=1;
- inputdevice_translatekeycode (num, DIK_RSHIFT, 0);
- inputdevice_translatekeycode (num, DIK_LSHIFT, 0);
- return 13; // the german ' key
+ {
+ apostrophstate=1;
+ inputdevice_translatekeycode (num, DIK_RSHIFT, 0, false);
+ inputdevice_translatekeycode (num, DIK_LSHIFT, 0, false);
+ return 13; // the german ' key
}
else
{
//best is add a real keystatecheck here but it still work so
apostrophstate = 0;
- inputdevice_translatekeycode (num, DIK_LALT,0);
- inputdevice_translatekeycode (num, DIK_LSHIFT,0);
- inputdevice_translatekeycode (num, 4, 0); // release also the # key
+ inputdevice_translatekeycode (num, DIK_LALT, 0, true);
+ inputdevice_translatekeycode (num, DIK_LSHIFT, 0, true);
+ inputdevice_translatekeycode (num, 4, 0, true); // release also the # key
return 13;
}
}
if (pressed)
{
- inputdevice_translatekeycode (num, DIK_LALT, 1);
- inputdevice_translatekeycode (num, DIK_LSHIFT,1);
+ inputdevice_translatekeycode (num, DIK_LALT, 1, false);
+ inputdevice_translatekeycode (num, DIK_LSHIFT, 1, false);
return 4; // the german # key
}
else
{
- inputdevice_translatekeycode (num, DIK_LALT, 0);
- inputdevice_translatekeycode (num, DIK_LSHIFT, 0);
+ inputdevice_translatekeycode (num, DIK_LALT, 0, true);
+ inputdevice_translatekeycode (num, DIK_LSHIFT, 0, true);
// Here is the same not nice but do the job
return 4; // the german # key
}
}
- if ((di_keycodes[num][DIK_RALT]) || (backslashstate)) {
+ if (((di_keycodes[num][DIK_RALT] & 1)) || (backslashstate)) {
switch (scancode)
{
case 12:
if (pressed)
{
backslashstate=1;
- inputdevice_translatekeycode (num, DIK_RALT, 0);
+ inputdevice_translatekeycode (num, DIK_RALT, 0, true);
return DIK_BACKSLASH;
}
else
}
} else {
scancode = keyhack (scancode, pressed, num);
- //write_log (_T("%02X %d %d\n"), scancode, pressed, isfocus ());
+#if DEBUG_SCANCODE
+ write_log (_T("%02X %d %d\n"), scancode, pressed, isfocus ());
+#endif
if (scancode < 0)
return;
if (!isfocus ())
return;
if (isfocus () < 2 && currprefs.input_tablet >= TABLET_MOUSEHACK && (currprefs.input_mouse_untrap & MOUSEUNTRAP_MAGIC))
return;
- di_keycodes[num][scancode] = pressed;
+ if (pressed) {
+ di_keycodes[num][scancode] = 1;
+ } else {
+ if ((di_keycodes[num][scancode] & 1) && pause_emulation) {
+ di_keycodes[num][scancode] = 2;
+ } else {
+ di_keycodes[num][scancode] = 0;
+ }
+ }
if (stopoutput == 0) {
- my_kbd_handler (num, scancode, pressed);
+ my_kbd_handler (num, scancode, pressed, false);
}
}
}
return 0;
int i;
for (i = 0; i < MAX_INPUT_DEVICES; i++) {
- if (di_keycodes[i][key])
+ if (di_keycodes[i][key] & 1)
return 1;
}
return 0;
for (j = 0; j < MAX_INPUT_DEVICES; j++) {
for (i = 0; i < MAX_KEYCODES; i++) {
if (di_keycodes[j][i]) {
- my_kbd_handler (j, i, 0);
- //write_log(_T("release %d:%02x\n"), j, i);
+#if DEBUG_SCANCODE
+ write_log(_T("release %d:%02x:%02x\n"), j, di_keycodes[j][i], i);
+#endif
di_keycodes[j][i] = 0;
+ my_kbd_handler(j, i, 0, true);
}
}
}
kc[i] = 1;
else
kc[i] = 0;
- if (kc[i] != di_keycodes[num][i]) {
+ if (kc[i] != (di_keycodes[num][i] & 1)) {
write_log (_T("%d: %02X -> %d\n"), num, i, kc[i]);
di_keycodes[num][i] = kc[i];
- my_kbd_handler (num, i, kc[i]);
+ my_kbd_handler (num, i, kc[i], true);
}
}
} else if (hr == DIERR_INPUTLOST) {
scancode = keyhack (scancode, pressed, i);
if (scancode < 0)
continue;
- di_keycodes[i][scancode] = pressed;
+ if (pressed) {
+ di_keycodes[i][scancode] = 1;
+ } else {
+ if ((di_keycodes[i][scancode] & 1) && pause_emulation) {
+ di_keycodes[i][scancode] = 2;
+ } else {
+ di_keycodes[i][scancode] = 0;
+ }
+ }
if (istest) {
if (pressed && (scancode == DIK_F12))
return;
}
} else {
if (stopoutput == 0)
- my_kbd_handler (i, scancode, pressed);
+ my_kbd_handler (i, scancode, pressed, false);
}
}
} else if (hr == DIERR_INPUTLOST) {