Hi Alexander,
here are my comments:
1. Why did you decide to make WindowsKeyToJavaChar void? Maybe it takes
sense to leave signature closer to its original look?
2. Seems like WindowsKeyToJavaChar method could be simplifed (ToAsciiEx
-> ToUnicodeEx, remove MultiByteToWideChar),
like this:
3504 WORD wChar[2];
3505 UINT scancode = ::MapVirtualKey(wkey, 0);
3506 int converted = ::ToUnicodeEx(wkey, scancode, keyboardState,
3507&wChar, 2, 0, GetKeyboardLayout());
3508
3509 UINT translation;
3510 BOOL deadKeyFlag = (converted == 2);
3511
3512 // Dead Key
3513 if (converted< 0) {
3514 translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
3515 } else
3516 // No translation available -- try known conversions or else punt.
3517 if (converted == 0) {
3518 if (wkey == VK_DELETE) {
3519 translation = '\177';
3520 } else
3521 if (wkey>= VK_NUMPAD0&& wkey<= VK_NUMPAD9) {
3522 translation = '0' + wkey - VK_NUMPAD0;
3523 } else {
3524 translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
3525 }
3526 } else
3527 // the caller expects a Unicode character.
3528 if (converted> 0) {
3533 translation = wChar[0];
3534 }
Thanks,
Oleg
9/11/2012 5:24 PM, Alexander Scherbatiy wrote:
bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7197619
webrev: http://cr.openjdk.java.net/~alexsch/7197619/webrev.00/
Only a virtual key code is used for the dead key detection on Windows
in the current implementation.
This does not take into account that dead keys can be pressed with
modifiers like ctrl+alt+2 (caron dead key) on Hungarian keyboard.
The fix gets isDeadKey flag and a character from the ToAsciiEx method
and uses them for the windows dead key to java key translation.
Thanks,
Alexandr.