--- old/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m 2019-03-11 19:59:36.000000000 +0300 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m 2019-03-11 19:59:36.000000000 +0300 @@ -243,16 +243,20 @@ //NSUInteger cgsRightMask; unsigned short leftKeyCode; unsigned short rightKeyCode; + BOOL leftKeyPressed; + BOOL rightKeyPressed; jint javaExtMask; jint javaMask; jint javaKey; } -const nsKeyToJavaModifierTable[] = +nsKeyToJavaModifierTable[] = { { NSAlphaShiftKeyMask, 0, 0, + NO, + NO, 0, // no Java equivalent 0, // no Java equivalent java_awt_event_KeyEvent_VK_CAPS_LOCK @@ -263,6 +267,8 @@ //kCGSFlagsMaskAppleRightShiftKey, 56, 60, + NO, + NO, java_awt_event_InputEvent_SHIFT_DOWN_MASK, java_awt_event_InputEvent_SHIFT_MASK, java_awt_event_KeyEvent_VK_SHIFT @@ -273,6 +279,8 @@ //kCGSFlagsMaskAppleRightControlKey, 59, 62, + NO, + NO, java_awt_event_InputEvent_CTRL_DOWN_MASK, java_awt_event_InputEvent_CTRL_MASK, java_awt_event_KeyEvent_VK_CONTROL @@ -283,6 +291,8 @@ //kCGSFlagsMaskAppleRightCommandKey, 55, 54, + NO, + NO, java_awt_event_InputEvent_META_DOWN_MASK, java_awt_event_InputEvent_META_MASK, java_awt_event_KeyEvent_VK_META @@ -292,35 +302,28 @@ //kCGSFlagsMaskAppleLeftAlternateKey, //kCGSFlagsMaskAppleRightAlternateKey, 58, - 0, + 61, + NO, + NO, java_awt_event_InputEvent_ALT_DOWN_MASK, java_awt_event_InputEvent_ALT_MASK, java_awt_event_KeyEvent_VK_ALT }, - { - NSAlternateKeyMask, - 0, - 61, - java_awt_event_InputEvent_ALT_DOWN_MASK | java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK, - java_awt_event_InputEvent_ALT_MASK | java_awt_event_InputEvent_ALT_GRAPH_MASK, - java_awt_event_KeyEvent_VK_ALT | java_awt_event_KeyEvent_VK_ALT_GRAPH - }, // NSNumericPadKeyMask { NSHelpKeyMask, 0, 0, + NO, + NO, 0, // no Java equivalent 0, // no Java equivalent java_awt_event_KeyEvent_VK_HELP }, // NSFunctionKeyMask - {0, 0, 0, 0, 0, 0} + {0, 0, 0, NO, NO, 0, 0, 0} }; -static BOOL leftAltKeyPressed; -static BOOL altGRPressed = NO; - /* * Almost all unicode characters just go from NS to Java with no translation. * For the few exceptions, we handle it here with this small table. @@ -521,7 +524,7 @@ { static NSUInteger sPreviousNSFlags = 0; - const struct _nsKeyToJavaModifier* cur; + struct _nsKeyToJavaModifier* cur; NSUInteger oldNSFlags = sPreviousNSFlags; NSUInteger changedNSFlags = oldNSFlags ^ nsFlags; sPreviousNSFlags = nsFlags; @@ -531,27 +534,37 @@ *javaKeyType = java_awt_event_KeyEvent_KEY_PRESSED; for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) { - if (changedNSFlags & cur->nsMask) { - *javaKeyCode = cur->javaKey; - *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_STANDARD; - // TODO: uses SPI... - //if (changedNSFlags & cur->cgsLeftMask) { - // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - //} else if (changedNSFlags & cur->cgsRightMask) { - // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - //} - if (eventKeyCode == cur->leftKeyCode) { - leftAltKeyPressed = YES; + if (eventKeyCode != 0) { + // if key code is specified we are able to determine its location + // also it is possible to track the pressed state of the corresponding key + if (cur->leftKeyCode == eventKeyCode) { + // specified key code switches the pressed state only if the current mask is set + cur->leftKeyPressed = !cur->leftKeyPressed && (cur->nsMask & nsFlags); + *javaKeyCode = cur->javaKey; *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else if (eventKeyCode == cur->rightKeyCode) { + *javaKeyType = cur->leftKeyPressed + ? java_awt_event_KeyEvent_KEY_PRESSED + : java_awt_event_KeyEvent_KEY_RELEASED; + break; + } + if (cur->rightKeyCode == eventKeyCode) { + // specified key code switches the pressed state only if the current mask is set + cur->rightKeyPressed = !cur->rightKeyPressed && (cur->nsMask & nsFlags); + *javaKeyCode = cur->javaKey; *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } else if (cur->nsMask == NSAlternateKeyMask) { - leftAltKeyPressed = NO; - continue; + *javaKeyType = cur->rightKeyPressed + ? java_awt_event_KeyEvent_KEY_PRESSED + : java_awt_event_KeyEvent_KEY_RELEASED; + break; } - *javaKeyType = (cur->nsMask & nsFlags) ? - java_awt_event_KeyEvent_KEY_PRESSED : - java_awt_event_KeyEvent_KEY_RELEASED; + } + // skip current record in the table if current mask is not changed + if (changedNSFlags & cur->nsMask) { + *javaKeyCode = cur->javaKey; + *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_STANDARD; + *javaKeyType = (cur->nsMask & nsFlags) + ? java_awt_event_KeyEvent_KEY_PRESSED + : java_awt_event_KeyEvent_KEY_RELEASED; break; } } @@ -563,22 +576,10 @@ jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods) { jint javaModifiers = 0; - const struct _nsKeyToJavaModifier* cur; + struct _nsKeyToJavaModifier* cur; for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) { - if ((cur->nsMask & nsFlags) != 0) { - - if (cur->nsMask == NSAlternateKeyMask) { - if (leftAltKeyPressed == YES) { - javaModifiers |= isExtMods? cur->javaExtMask : cur->javaMask; - if (altGRPressed == NO) - break; - } else { - leftAltKeyPressed = YES; - altGRPressed = YES; - continue; - } - } + if (cur->nsMask & nsFlags) { javaModifiers |= isExtMods ? cur->javaExtMask : cur->javaMask; } } @@ -592,7 +593,7 @@ NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods) { NSUInteger nsFlags = 0; - const struct _nsKeyToJavaModifier* cur; + struct _nsKeyToJavaModifier* cur; for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) { jint mask = isExtMods? cur->javaExtMask : cur->javaMask; @@ -600,15 +601,6 @@ nsFlags |= cur->nsMask; } } - - // special case - jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK : - java_awt_event_InputEvent_ALT_GRAPH_MASK; - - if ((mask & javaModifiers) != 0) { - nsFlags |= NSAlternateKeyMask; - } - return nsFlags; }