8139189: Review request for 8139189: VK_OEM_102 dead key detected as VK_UNDEFINED
Reviewed-by: alexsch
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Wed Jun 22 12:26:30 2016 +0300
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Wed Jun 22 12:36:18 2016 +0300
@@ -257,6 +257,8 @@
AwtComponent::BuildPrimaryDynamicTable();
sm_PrimaryDynamicTableBuilt = TRUE;
}
+
+ deadKeyActive = FALSE;
}
AwtComponent::~AwtComponent()
@@ -2952,6 +2954,7 @@
{0x037A, java_awt_event_KeyEvent_VK_DEAD_IOTA}, // ASCII ???
{0x309B, java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND},
{0x309C, java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND},
+ {0x0004, java_awt_event_KeyEvent_VK_COMPOSE},
{0,0}
};
@@ -3444,8 +3447,9 @@
AwtToolkit::GetKeyboardState(keyboardState);
// apply modifiers to keyboard state if necessary
+ BOOL shiftIsDown = FALSE;
if (modifiers) {
- BOOL shiftIsDown = modifiers & java_awt_event_InputEvent_SHIFT_DOWN_MASK;
+ shiftIsDown = modifiers & java_awt_event_InputEvent_SHIFT_DOWN_MASK;
BOOL altIsDown = modifiers & java_awt_event_InputEvent_ALT_DOWN_MASK;
BOOL ctrlIsDown = modifiers & java_awt_event_InputEvent_CTRL_DOWN_MASK;
@@ -3517,18 +3521,27 @@
} // ctrlIsDown
} // modifiers
- // instead of creating our own conversion tables, I'll let Win32
- // convert the character for me.
WORD wChar[2];
- UINT scancode = ::MapVirtualKey(wkey, 0);
- int converted = ::ToUnicodeEx(wkey, scancode, keyboardState,
- wChar, 2, 0, GetKeyboardLayout());
+ int converted = 1;
+ UINT ch = ::MapVirtualKey(wkey, 2);
+ if (ch & 0x80000000) {
+ // Dead key which is handled as a normal key
+ isDeadKey = deadKeyActive = TRUE;
+ } else if (deadKeyActive) {
+ // We cannot use ::ToUnicodeEx if dead key is active because this will
+ // break dead key function
+ wChar[0] = shiftIsDown ? ch : tolower(ch);
+ } else {
+ UINT scancode = ::MapVirtualKey(wkey, 0);
+ converted = ::ToUnicodeEx(wkey, scancode, keyboardState,
+ wChar, 2, 0, GetKeyboardLayout());
+ }
UINT translation;
BOOL deadKeyFlag = (converted == 2);
// Dead Key
- if (converted < 0) {
+ if (converted < 0 || wChar[0] == 0 || isDeadKey) {
translation = java_awt_event_KeyEvent_CHAR_UNDEFINED;
} else
// No translation available -- try known conversions or else punt.
@@ -3682,6 +3695,8 @@
MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags,
BOOL system)
{
+ deadKeyActive = FALSE;
+
// Will only get WmChar messages with DBCS if we create them for
// an Edit class in the WmForwardChar method. These synthesized
// DBCS chars are ok to pass on directly to the default window
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.h Wed Jun 22 12:26:30 2016 +0300
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.h Wed Jun 22 12:36:18 2016 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -826,6 +826,8 @@
// 6524352: support finer-resolution
int m_wheelRotationAmount;
+ BOOL deadKeyActive;
+
/*
* The association list of children's IDs and corresponding components.
* Some components like Choice or List are required their sizes while
--- a/jdk/test/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html Wed Jun 22 12:26:30 2016 +0300
+++ b/jdk/test/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html Wed Jun 22 12:36:18 2016 +0300
@@ -1,5 +1,5 @@
<!--
-Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@
Test run requires the following keyboard layouts to be installed:
Linux OS: English (US, alternative international)
Windows OS: Hungarian
+A keyboard layout having compose function or compose-like key. Programmer
+Dvorak (http://www.kaufmann.no/roland/dvorak/) is suggested to use.
To test JDK-8000423 fix (Linux only!):
please switch to US alternative international layout and try to type diacritics
@@ -40,6 +42,12 @@
please switch to Hungarian keyboard layout and try to type diacritics
(Ctrl+Alt+2 e; Ctrl+Alt+2 E)
+To test JDK-8139189 fix:
+please switch to Programmer Dvorak keyboard layout try to type diacritics
+using compose combinations (Compose+z+d, Compose+z+Shift+d). The Compose key
+in Programmer Dvorak layout is OEM102 the key which is located between
+Left Shift and Z keys on the standard 102-key keyboard.
+
If you can do that then the test is passed; otherwise failed.
</body>
</html>