SUGGESTED FIX
Name: ssR10077 Date: 04/07/2004
*** /export1/ssi/tiger/webrev/src/windows/native/sun/windows/awt_Component.cpp- Tue Mar 23 14:52:34 2004
--- /export1/ssi/tiger/webrev/src/windows/native/sun/windows/awt_Component.cpp Tue Mar 23 14:52:33 2004
***************
*** 27,32 ****
--- 27,33 ----
#include "awt_Window.h"
#include "awt_Win32GraphicsDevice.h"
#include "ddrawUtils.h"
+ #include "Hashtable.h"
#include <jawt.h>
***************
*** 3280,3287 ****
return FALSE;
}
! UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, BOOL isUp)
{
// If the windows key is a return, wkey will equal 13 ('\r')
// In this case, we want to return 10 ('\n')
// Since ToAscii would convert VK_RETURN to '\r', we need
--- 3281,3298 ----
return FALSE;
}
! UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops)
{
+ static Hashtable transTable("VKEY translations");
+
+ // Try to translate using last saved translation
+ if (ops == LOAD) {
+ void* value = transTable.remove((void*)wkey);
+ if (value != NULL) {
+ return (UINT)value;
+ }
+ }
+
// If the windows key is a return, wkey will equal 13 ('\r')
// In this case, we want to return 10 ('\n')
// Since ToAscii would convert VK_RETURN to '\r', we need
***************
*** 3368,3401 ****
// instead of creating our own conversion tables, I'll let Win32
// convert the character for me.
WORD mbChar;
! UINT isUpFlag = isUp ? (1 << 15) : 0;
! UINT scancode = ::MapVirtualKey(wkey, 0) | isUpFlag;
int converted = ::ToAsciiEx(wkey, scancode, keyboardState,
&mbChar, 0, GetKeyboardLayout());
!
! switch (converted) {
// No translation available -- try known conversions or else punt.
! case 0:
if (wkey == VK_DELETE) {
! return '\177';
}
! else if (wkey >= VK_NUMPAD0 && wkey <= VK_NUMPAD9) {
! return '0' + wkey - VK_NUMPAD0;
! }
! else {
! return java_awt_event_KeyEvent_CHAR_UNDEFINED;
! }
! // Dead Key
! case -1:
! return java_awt_event_KeyEvent_CHAR_UNDEFINED;
! default:
! // the caller expects a Unicode character.
WCHAR unicodeChar[2];
VERIFY(::MultiByteToWideChar(GetCodePage(), MB_PRECOMPOSED,
(LPCSTR)&mbChar, 1, unicodeChar, 1));
! return unicodeChar[0];
}
}
MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt,
--- 3379,3417 ----
// instead of creating our own conversion tables, I'll let Win32
// convert the character for me.
WORD mbChar;
! UINT scancode = ::MapVirtualKey(wkey, 0);
int converted = ::ToAsciiEx(wkey, scancode, keyboardState,
&mbChar, 0, GetKeyboardLayout());
!
! UINT translation;
!
! // Dead Key
! if (converted < 0) {
! translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
! } else
// No translation available -- try known conversions or else punt.
! if (converted == 0) {
if (wkey == VK_DELETE) {
! translation = '\177';
! } else
! if (wkey >= VK_NUMPAD0 && wkey <= VK_NUMPAD9) {
! translation = '0' + wkey - VK_NUMPAD0;
! } else {
! translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
}
! } else
! // the caller expects a Unicode character.
! if (converted > 0) {
WCHAR unicodeChar[2];
VERIFY(::MultiByteToWideChar(GetCodePage(), MB_PRECOMPOSED,
(LPCSTR)&mbChar, 1, unicodeChar, 1));
! translation = unicodeChar[0];
}
+ if (ops == SAVE) {
+ transTable.put((void*)wkey, (void*)translation);
+ }
+ return translation;
}
MsgRouting AwtComponent::WmKeyDown(UINT wkey, UINT repCnt,
***************
*** 3415,3421 ****
UINT modifiers = GetJavaModifiers();
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
! UINT character = WindowsKeyToJavaChar(wkey, modifiers, FALSE);
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED,
nowMillisUTC(msg.time), jkey, character,
--- 3431,3437 ----
UINT modifiers = GetJavaModifiers();
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
! UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE);
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED,
nowMillisUTC(msg.time), jkey, character,
***************
*** 3455,3461 ****
UINT modifiers = GetJavaModifiers();
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
! UINT character = WindowsKeyToJavaChar(wkey, modifiers, TRUE);
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED,
nowMillisUTC(msg.time), jkey, character,
--- 3471,3477 ----
UINT modifiers = GetJavaModifiers();
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
! UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD);
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED,
nowMillisUTC(msg.time), jkey, character,
***************
*** 5922,5928 ****
}
}
! modifiedChar = p->WindowsKeyToJavaChar(winKey, modifiers, FALSE);
bCharChanged = (keyChar != modifiedChar);
break;
}
--- 5938,5944 ----
}
}
! modifiedChar = p->WindowsKeyToJavaChar(winKey, modifiers, AwtComponent::NONE);
bCharChanged = (keyChar != modifiedChar);
break;
}
======================================================================
|