< prev index next >
src/java.desktop/windows/native/libawt/windows/awt_Component.cpp
Print this page
@@ -1,7 +1,7 @@
/*
- * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -255,10 +255,12 @@
if (!sm_PrimaryDynamicTableBuilt) {
// do it once.
AwtComponent::BuildPrimaryDynamicTable();
sm_PrimaryDynamicTableBuilt = TRUE;
}
+
+ deadKeyActive = FALSE;
}
AwtComponent::~AwtComponent()
{
DASSERT(AwtToolkit::IsMainThread());
@@ -2950,10 +2952,11 @@
{0x00B8, java_awt_event_KeyEvent_VK_DEAD_CEDILLA},
{0x02DB, java_awt_event_KeyEvent_VK_DEAD_OGONEK},
{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}
};
// The full map of the current keyboard state including
// windows virtual key, scancode, java virtual key, and unicode
@@ -3442,12 +3445,13 @@
static const BYTE KEY_STATE_DOWN = 0x80;
BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
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;
// Windows treats AltGr as Ctrl+Alt
if (modifiers & java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK) {
@@ -3515,22 +3519,31 @@
}
} // ctrlIsDown && altIsDown
} // ctrlIsDown
} // modifiers
- // instead of creating our own conversion tables, I'll let Win32
- // convert the character for me.
WORD wChar[2];
+ 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);
- int converted = ::ToUnicodeEx(wkey, scancode, keyboardState,
+ 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.
if (converted == 0) {
if (wkey == VK_DELETE) {
@@ -3680,10 +3693,12 @@
}
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
// procedure. They've already been filtered through the Java key
// event queue. We will never get the trail byte since the edit
< prev index next >