Cygwin/X: Handle fake keypresses generated by speech recognizers

Apparently, fake keypresses generated by speech recognizers may not bother
with a scan code, so look up what scan code corresponds to the virtual key
code if this occurs.

Patch by Paul Loewenstein <paul.loewenstein@gmail.com>

Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
Paul Loewenstein 2009-11-01 18:18:45 +00:00 committed by Jon TURNEY
parent 0866322b57
commit 35901ece6a
2 changed files with 32 additions and 8 deletions

View File

@ -73,10 +73,31 @@ winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode)
{
int iKeyFixup = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 1];
int iKeyFixupEx = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 2];
int iParamScanCode = LOBYTE (HIWORD (lParam));
int iParam = HIWORD (lParam);
int iParamScanCode = LOBYTE (iParam);
/* WM_ key messages faked by Vista speech recognition (WSR) don't have a
* scan code.
*
* Vocola 3 (Rick Mohr's supplement to WSR) uses
* System.Windows.Forms.SendKeys.SendWait(), which appears always to give a
* scan code of 1
*/
if (iParamScanCode <= 1)
{
if (VK_PRIOR <= wParam && wParam <= VK_DOWN)
/* Trigger special case table to translate to extended
* keycode, otherwise if num_lock is on, we can get keypad
* numbers instead of navigation keys. */
iParam |= KF_EXTENDED;
else
iParamScanCode = MapVirtualKeyEx(wParam,
/*MAPVK_VK_TO_VSC*/0,
GetKeyboardLayout(0));
}
/* Branch on special extended, special non-extended, or normal key */
if ((HIWORD (lParam) & KF_EXTENDED) && iKeyFixupEx)
if ((iParam & KF_EXTENDED) && iKeyFixupEx)
*piScanCode = iKeyFixupEx;
else if (iKeyFixup)
*piScanCode = iKeyFixup;

View File

@ -45,6 +45,9 @@
#define WIN_KEYMAP_COLS 3
/* Rows 160 through 165 correspond to software-generated codes, which
* may not be associated with the appropriate scan code.
*/
const int
g_iKeyMap [] = {
/* count Windows VK, ASCII, ASCII when extended VK */
@ -208,12 +211,12 @@ g_iKeyMap [] = {
/* 157 */ 0, 0, 0,
/* 158 */ 0, 0, 0,
/* 159 */ 0, 0, 0,
/* 160 */ 0, 0, 0,
/* 161 */ 0, 0, 0,
/* 162 */ 0, 0, 0,
/* 163 */ 0, 0, 0,
/* 164 */ 0, 0, 0,
/* 165 */ 0, 0, 0,
/* 160 */ VK_LSHIFT, KEY_ShiftL, 0,
/* 161 */ VK_RSHIFT, KEY_ShiftR, 0,
/* 162 */ VK_LCONTROL, KEY_LCtrl, 0,
/* 163 */ VK_RCONTROL, KEY_RCtrl, 0,
/* 164 */ VK_LMENU, KEY_Alt, 0,
/* 165 */ VK_RMENU, KEY_AltLang, 0,
/* 166 */ 0, 0, 0,
/* 167 */ 0, 0, 0,
/* 168 */ 0, 0, 0,