1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

Add AltGr support at last! Thanks to <andre@via.ecp.fr> for the technique

if not all of the details.

[originally from svn r92]
This commit is contained in:
Simon Tatham 1999-03-12 17:14:06 +00:00
parent 9a5b63aa03
commit ba5f955f3e

View File

@ -953,6 +953,33 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
back->send (buf, len); back->send (buf, len);
} }
return 0; return 0;
case WM_KEYUP:
case WM_SYSKEYUP:
/*
* We handle KEYUP ourselves in order to distinghish left
* and right Alt or Control keys, which Windows won't do
* right if left to itself. See also the special processing
* at the top of TranslateKey.
*/
{
BYTE keystate[256];
int ret = GetKeyboardState(keystate);
if (ret && wParam == VK_MENU) {
if (lParam & 0x1000000) keystate[VK_RMENU] = 0;
else keystate[VK_LMENU] = 0;
SetKeyboardState (keystate);
}
if (ret && wParam == VK_CONTROL) {
if (lParam & 0x1000000) keystate[VK_RCONTROL] = 0;
else keystate[VK_LCONTROL] = 0;
SetKeyboardState (keystate);
}
}
/*
* We don't return here, in order to allow Windows to do
* its own KEYUP processing as well.
*/
break;
case WM_CHAR: case WM_CHAR:
case WM_SYSCHAR: case WM_SYSCHAR:
/* /*
@ -1116,12 +1143,7 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) {
unsigned char *p = output; unsigned char *p = output;
BYTE keystate[256]; BYTE keystate[256];
int ret, code; int ret, code;
int cancel_alt = FALSE;
/*
* Prepend ESC if ALT was pressed at the time.
*/
if (lParam & 0x20000000)
*p++ = 0x1B;
/* /*
* Get hold of the keyboard state, because we'll need it a few * Get hold of the keyboard state, because we'll need it a few
@ -1129,6 +1151,33 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) {
*/ */
ret = GetKeyboardState(keystate); ret = GetKeyboardState(keystate);
/*
* Windows does not always want to distinguish left and right
* Alt or Control keys. Thus we keep track of them ourselves.
* See also the WM_KEYUP handler.
*/
if (wParam == VK_MENU) {
if (lParam & 0x1000000) keystate[VK_RMENU] = 0x80;
else keystate[VK_LMENU] = 0x80;
SetKeyboardState (keystate);
return 0;
}
if (wParam == VK_CONTROL) {
if (lParam & 0x1000000) keystate[VK_RCONTROL] = 0x80;
else keystate[VK_LCONTROL] = 0x80;
SetKeyboardState (keystate);
return 0;
}
/*
* Prepend ESC, and cancel ALT, if ALT was pressed at the time
* and it wasn't AltGr.
*/
if (lParam & 0x20000000 && (keystate[VK_LMENU] & 0x80)) {
*p++ = 0x1B;
cancel_alt = TRUE;
}
/* /*
* Shift-PgUp, Shift-PgDn, and Alt-F4 all produce window * Shift-PgUp, Shift-PgDn, and Alt-F4 all produce window
* events: we'll deal with those now. * events: we'll deal with those now.
@ -1212,13 +1261,16 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) {
} }
/* /*
* Before doing Windows charmap translation, remove ALT from * Before doing Windows charmap translation, remove LeftALT
* the keymap, since its sole effect should be to prepend ESC, * from the keymap, since its sole effect should be to prepend
* which we've already done. Note that removal of ALT has to * ESC, which we've already done. Note that removal of LeftALT
* happen _after_ the above call to SetKeyboardState, or dire * has to happen _after_ the above call to SetKeyboardState, or
* things will befall. * dire things will befall.
*/ */
keystate[VK_MENU] = keystate[VK_LMENU] = keystate[VK_RMENU] = 0; if (cancel_alt) {
keystate[VK_MENU] = keystate[VK_RMENU];
keystate[VK_LMENU] = 0;
}
/* /*
* Attempt the Windows char-map translation. * Attempt the Windows char-map translation.