The problem: shift-dir and ctrl-dir keys (keypad) don't work with numlock on
The solution (main-win.c):
This works with Win7 and an AZERTY keyboard (my tests didn't show any regression when I tried different combinations of keys). More tests with different configurations will be needed, but I think this fixes the problem once and for all.
The solution (main-win.c):
Code:
static bool handle_keydown(WPARAM wParam, LPARAM lParam) { keycode_t ch = 0; bool kp = FALSE; int mods = 0; static bool has_shift = FALSE; static bool has_ctrl = FALSE; #define check_ctrl(K) \ if (has_ctrl) \ { \ ch = (K); \ mods |= KC_MOD_CONTROL; \ } #ifdef USE_SAVER if (screensaver_active) { stop_screensaver(); return TRUE; } #endif /* USE_SAVER */ /* for VK_ http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx */ switch (wParam) { case VK_F1: ch = KC_F1; break; case VK_F2: ch = KC_F2; break; case VK_F3: ch = KC_F3; break; case VK_F4: ch = KC_F4; break; case VK_F5: ch = KC_F5; break; case VK_F6: ch = KC_F6; break; case VK_F7: ch = KC_F7; break; case VK_F8: ch = KC_F8; break; case VK_F9: ch = KC_F9; break; case VK_F10: ch = KC_F10; break; case VK_F11: ch = KC_F11; break; case VK_F12: ch = KC_F12; break; case VK_F13: ch = KC_F13; break; case VK_F14: ch = KC_F14; break; case VK_F15: ch = KC_F15; break; case VK_INSERT: ch = KC_INSERT; break; case VK_DELETE: ch = KC_DELETE; break; /* Backspace is calling both backspace and delete Removed the backspace call, so it only calls delete */ case VK_BACK: break; /* Tab is registering as ^i; don't read it here*/ case VK_TAB: break; /* Ensure that shift-dir works with NUMLOCK on */ case VK_PRIOR: ch = KC_PGUP; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_NEXT: ch = KC_PGDOWN; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_END: ch = KC_END; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_HOME: ch = KC_HOME; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_LEFT: ch = ARROW_LEFT; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_RIGHT: ch = ARROW_RIGHT; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_UP: ch = ARROW_UP; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_DOWN: ch = ARROW_DOWN; if (has_shift) mods |= KC_MOD_SHIFT; break; case VK_CLEAR: ch = '5'; kp=TRUE; break; case VK_PAUSE: ch = KC_PAUSE; break; case VK_SHIFT: has_shift = TRUE; return TRUE; case VK_CONTROL: has_ctrl = TRUE; return TRUE; /* Ensure that ctrl-dir works with NUMLOCK on */ case VK_NUMPAD9: check_ctrl(KC_PGUP) break; case VK_NUMPAD3: check_ctrl(KC_PGDOWN) break; case VK_NUMPAD1: check_ctrl(KC_END) break; case VK_NUMPAD7: check_ctrl(KC_HOME) break; case VK_NUMPAD4: check_ctrl(ARROW_LEFT) break; case VK_NUMPAD6: check_ctrl(ARROW_RIGHT) break; case VK_NUMPAD8: check_ctrl(ARROW_UP) break; case VK_NUMPAD2: check_ctrl(ARROW_DOWN) break; } has_shift = FALSE; has_ctrl = FALSE; /* we could fall back on using the scancode */ /* obtained using LOBYTE(HIWORD(lParam)) */ /* see http://source.winehq.org/source/include/dinput.h#L468 */ if (ch) { mods |= extract_modifiers(ch, kp); /* printf("ch=%d mods=%d\n", ch, mods); */ /* fflush(stdout); */ Term_keypress(ch, mods); return FALSE; } return TRUE; }
Comment