Skip to content

Commit bcd0958

Browse files
committed
8315701: [macos] Regression: KeyEvent has different keycode on different keyboard layouts
Backport-of: a3eb6640773620331692da40356522ff618c3c44
1 parent 4845d80 commit bcd0958

File tree

7 files changed

+170
-343
lines changed

7 files changed

+170
-343
lines changed

src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ public void notifyMouseWheelEvent(long when, int x, int y, int absX,
10441044
*/
10451045
@Override
10461046
public void notifyKeyEvent(int id, long when, int modifiers,
1047-
int keyCode, char keyChar, int keyLocation)
1047+
int keyCode, char keyChar, int keyLocation, int extendedKeyCode)
10481048
{
10491049
LWKeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance();
10501050
Component focusOwner = kfmPeer.getCurrentFocusOwner();
@@ -1058,9 +1058,13 @@ public void notifyKeyEvent(int id, long when, int modifiers,
10581058

10591059
KeyEvent keyEvent = new KeyEvent(focusOwner, id, when, modifiers,
10601060
keyCode, keyChar, keyLocation);
1061-
AWTAccessor.getKeyEventAccessor().setExtendedKeyCode(keyEvent,
1062-
(keyChar == KeyEvent.CHAR_UNDEFINED) ? keyCode
1063-
: ExtendedKeyCodes.getExtendedKeyCodeForChar(keyChar));
1061+
if (extendedKeyCode >= 0) {
1062+
AWTAccessor.getKeyEventAccessor().setExtendedKeyCode(keyEvent, extendedKeyCode);
1063+
} else {
1064+
AWTAccessor.getKeyEventAccessor().setExtendedKeyCode(keyEvent,
1065+
(keyChar == KeyEvent.CHAR_UNDEFINED) ? keyCode
1066+
: ExtendedKeyCodes.getExtendedKeyCodeForChar(keyChar));
1067+
}
10641068
postEvent(keyEvent);
10651069
}
10661070

src/java.desktop/macosx/classes/sun/lwawt/PlatformEventNotifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,5 @@ void notifyMouseWheelEvent(long when, int x, int y, final int absX,
6161
* Called by the delegate when a key is pressed.
6262
*/
6363
void notifyKeyEvent(int id, long when, int modifiers,
64-
int keyCode, char keyChar, int keyLocation);
64+
int keyCode, char keyChar, int keyLocation, int extendedKeyCode);
6565
}

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ void handleKeyEvent(int eventType, int modifierFlags, String chars, String chars
143143

144144
int jeventType = KeyEvent.KEY_PRESSED;
145145
int jkeyCode = KeyEvent.VK_UNDEFINED;
146+
int jextendedkeyCode = -1;
146147
int jkeyLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
147148
boolean postsTyped = false;
148149
boolean spaceKeyTyped = false;
@@ -173,7 +174,7 @@ void handleKeyEvent(int eventType, int modifierFlags, String chars, String chars
173174
charsIgnoringModifiers.charAt(0) : KeyEvent.CHAR_UNDEFINED;
174175

175176
int[] in = new int[] {testCharIgnoringModifiers, isDeadChar ? 1 : 0, modifierFlags, keyCode};
176-
int[] out = new int[3]; // [jkeyCode, jkeyLocation, deadChar]
177+
int[] out = new int[4]; // [jkeyCode, jkeyLocation, deadChar, extendedKeyCode]
177178

178179
postsTyped = NSEvent.nsToJavaKeyInfo(in, out);
179180
if (!postsTyped) {
@@ -201,6 +202,7 @@ void handleKeyEvent(int eventType, int modifierFlags, String chars, String chars
201202
}
202203

203204
jkeyCode = out[0];
205+
jextendedkeyCode = out[3];
204206
jkeyLocation = out[1];
205207
jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) :
206208
NSEvent.nsToJavaEventType(eventType);
@@ -221,7 +223,7 @@ void handleKeyEvent(int eventType, int modifierFlags, String chars, String chars
221223
lastKeyPressCode = jkeyCode;
222224
}
223225
eventNotifier.notifyKeyEvent(jeventType, when, jmodifiers,
224-
jkeyCode, javaChar, jkeyLocation);
226+
jkeyCode, javaChar, jkeyLocation, jextendedkeyCode);
225227

226228
// Current browser may be sending input events, so don't
227229
// post the KEY_TYPED here.
@@ -241,12 +243,12 @@ void handleKeyEvent(int eventType, int modifierFlags, String chars, String chars
241243
}
242244
eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED, when, jmodifiers,
243245
KeyEvent.VK_UNDEFINED, javaChar,
244-
KeyEvent.KEY_LOCATION_UNKNOWN);
246+
KeyEvent.KEY_LOCATION_UNKNOWN, jextendedkeyCode);
245247
//If events come from Firefox, released events should also be generated.
246248
if (needsKeyReleased) {
247249
eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED, when, jmodifiers,
248250
jkeyCode, javaChar,
249-
KeyEvent.KEY_LOCATION_UNKNOWN);
251+
KeyEvent.KEY_LOCATION_UNKNOWN, jextendedkeyCode);
250252
}
251253
}
252254
}
@@ -260,13 +262,13 @@ void handleInputEvent(String text) {
260262
eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED,
261263
System.currentTimeMillis(),
262264
0, KeyEvent.VK_UNDEFINED, c,
263-
KeyEvent.KEY_LOCATION_UNKNOWN);
265+
KeyEvent.KEY_LOCATION_UNKNOWN, -1);
264266
index++;
265267
}
266268
eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED,
267269
System.currentTimeMillis(),
268270
0, lastKeyPressCode, c,
269-
KeyEvent.KEY_LOCATION_UNKNOWN);
271+
KeyEvent.KEY_LOCATION_UNKNOWN, -1);
270272
}
271273
}
272274

src/java.desktop/macosx/classes/sun/lwawt/macosx/CWarningWindow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ public void notifyMouseWheelEvent(long when, int x, int y, int absX,
245245

246246
@Override
247247
public void notifyKeyEvent(int id, long when, int modifiers, int keyCode,
248-
char keyChar, int keyLocation) {
248+
char keyChar, int keyLocation, int jextendedkeyCode) {
249249
}
250250

251251
protected int getInitialStyleBits() {

src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ static unichar NsGetDeadKeyChar(unsigned short keyCode)
429429
NsCharToJavaVirtualKeyCode(unichar ch, BOOL isDeadChar,
430430
NSUInteger flags, unsigned short key,
431431
jint *keyCode, jint *keyLocation, BOOL *postsTyped,
432-
unichar *deadChar)
432+
unichar *deadChar, jint *extendedkeyCode)
433433
{
434434
static size_t size = sizeof(keyTable) / sizeof(struct _key);
435435
NSInteger offset;
@@ -469,10 +469,9 @@ static unichar NsGetDeadKeyChar(unsigned short keyCode)
469469
*postsTyped = YES;
470470
// do quick conversion
471471
// the keyCode is off by 32, so adding it here
472-
*keyCode = java_awt_event_KeyEvent_VK_A + offset + 32;
472+
*extendedkeyCode = java_awt_event_KeyEvent_VK_A + offset + 32;
473473
*keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_STANDARD;
474-
return;
475-
}
474+
}
476475
}
477476

478477
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:ch]) {
@@ -695,18 +694,20 @@ jlong UTC(NSEvent *event) {
695694
jshort keyCode = (jshort)data[3];
696695

697696
jint jkeyCode = java_awt_event_KeyEvent_VK_UNDEFINED;
697+
jint jextendedkeyCode = -1;
698698
jint jkeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
699699
jint testDeadChar = 0;
700700

701701
NsCharToJavaVirtualKeyCode((unichar)testChar, isDeadChar,
702702
(NSUInteger)modifierFlags, (unsigned short)keyCode,
703703
&jkeyCode, &jkeyLocation, &postsTyped,
704-
(unichar *) &testDeadChar);
704+
(unichar *) &testDeadChar, &jextendedkeyCode);
705705

706-
// out = [jkeyCode, jkeyLocation, deadChar];
706+
// out = [jkeyCode, jkeyLocation, deadChar, jextendedkeyCode];
707707
(*env)->SetIntArrayRegion(env, outData, 0, 1, &jkeyCode);
708708
(*env)->SetIntArrayRegion(env, outData, 1, 1, &jkeyLocation);
709709
(*env)->SetIntArrayRegion(env, outData, 2, 1, &testDeadChar);
710+
(*env)->SetIntArrayRegion(env, outData, 3, 1, &jextendedkeyCode);
710711

711712
(*env)->ReleaseIntArrayElements(env, inData, data, 0);
712713

test/jdk/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)