diff options
author | Denis Fokin <Denis.Fokin@jetbrains.com> | 2017-01-09 20:28:36 +0300 |
---|---|---|
committer | Denis Fokin <Denis.Fokin@jetbrains.com> | 2017-01-09 20:28:53 +0300 |
commit | 7f4b9869f8e3e846aedc938c2a9eb644175bd9aa (patch) | |
tree | c9ac0c675dc52550bb5096573049ff86c360be09 | |
parent | eafe84a8519b42dea5518cc91a27652befd91473 (diff) | |
download | jdk8u_jdk-7f4b9869f8e3e846aedc938c2a9eb644175bd9aa.tar.gz |
JRE-149 java/awt/event/KeyEvent/DeadKey/DeadKeyMacOSXInputText.java: Pressed char is not dead acute
-rw-r--r-- | src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java | 7 | ||||
-rw-r--r-- | src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java | 67 | ||||
-rw-r--r-- | src/macosx/classes/sun/lwawt/macosx/CPlatformView.java | 5 | ||||
-rw-r--r-- | src/macosx/classes/sun/lwawt/macosx/NSEvent.java | 15 | ||||
-rw-r--r-- | src/macosx/native/sun/awt/AWTEvent.m | 29 | ||||
-rw-r--r-- | src/macosx/native/sun/awt/AWTView.m | 117 | ||||
-rw-r--r-- | test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java | 8 |
7 files changed, 167 insertions, 81 deletions
diff --git a/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java b/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java index 14033b55aa..4fcac1bc6b 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java +++ b/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java @@ -95,11 +95,8 @@ public class CEmbeddedFrame extends EmbeddedFrame { responder.handleScrollEvent(x, y, modifierFlags, deltaX, deltaY, NSEvent.SCROLL_PHASE_UNSUPPORTED); } - public void handleKeyEvent(int eventType, int modifierFlags, String characters, - String charsIgnoringMods, boolean isRepeat, short keyCode, - boolean needsKeyTyped) { - responder.handleKeyEvent(eventType, modifierFlags, characters, charsIgnoringMods, charsIgnoringMods, - keyCode, needsKeyTyped, isRepeat); + public void handleKeyEvent(NSEvent nsEvent) { + responder.handleKeyEvent(nsEvent); } public void handleInputEvent(String text) { diff --git a/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java b/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java index 9295b895dc..3b43a18cf1 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java @@ -202,12 +202,11 @@ final class CPlatformResponder { /** * Handles key events. */ - void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers, String charsIgnoringModifiersAndShift, - short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) + void handleKeyEvent(NSEvent nsEvent) { boolean isFlagsChangedEvent = - isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) : - (eventType == CocoaConstants.NSFlagsChanged); + isNpapiCallback ? (nsEvent.getType() == CocoaConstants.NPCocoaEventFlagsChanged) : + (nsEvent.getType() == CocoaConstants.NSFlagsChanged); int jeventType = KeyEvent.KEY_PRESSED; int jkeyCode = KeyEvent.VK_UNDEFINED; @@ -216,13 +215,11 @@ final class CPlatformResponder { if (isFlagsChangedEvent) { - handleFlagChangedEvent(modifierFlags, keyCode); + handleFlagChangedEvent(nsEvent.getModifierFlags(), nsEvent.getKeyCode()); return; } - int jmodifiers = NSEvent.nsToJavaKeyModifiers(modifierFlags); - - boolean isDeadChar = (chars!= null && chars.length() == 0); + int jmodifiers = NSEvent.nsToJavaKeyModifiers(nsEvent.getModifierFlags()); boolean metaAltCtrlAreNotPressed = (jmodifiers & (InputEvent.META_DOWN_MASK @@ -244,7 +241,8 @@ final class CPlatformResponder { boolean isISOControl = false; - char checkedChar = (chars == null || chars.isEmpty()) ? KeyEvent.CHAR_UNDEFINED : chars.charAt(0); + char checkedChar = (nsEvent.getCharacters() == null + || nsEvent.getCharacters().isEmpty()) ? KeyEvent.CHAR_UNDEFINED : nsEvent.getCharacters().charAt(0); if (shiftAltDownAreNotPressed && ctrlIsPressed) { if (Character.isISOControl(checkedChar)) { @@ -254,24 +252,18 @@ final class CPlatformResponder { char characterToGetKeyCode = KeyEvent.CHAR_UNDEFINED; - // if (useShiftedCharacters) { - // We use this char to find a character that is printed depending on pressing modifiers - /* characterToGetKeyCode = (charsIgnoringModifiersAndShift != null && charsIgnoringModifiersAndShift.length() > 0) - ? charsIgnoringModifiersAndShift.charAt(0) - : KeyEvent.CHAR_UNDEFINED; - } else { */ - // We use this char to find a character that is printed depending on pressing modifiers - characterToGetKeyCode = (charsIgnoringModifiers != null && charsIgnoringModifiers.length() > 0) - ? charsIgnoringModifiers.charAt(0) - : KeyEvent.CHAR_UNDEFINED; - // } + // We use this char to find a character that is printed depending on pressing modifiers + characterToGetKeyCode = (nsEvent.getCharactersIgnoringModifiers() != null && nsEvent.getCharactersIgnoringModifiers().length() > 0) + ? nsEvent.getCharactersIgnoringModifiers().charAt(0) + : KeyEvent.CHAR_UNDEFINED; // We use char candidate if modifiers are not used // otherwise, we use char ignoring modifiers int[] in = new int[] { - characterToGetKeyCode, isDeadChar ? 1 : 0, - modifierFlags, - keyCode + characterToGetKeyCode, + nsEvent.getModifierFlags(), + nsEvent.isHasDeadKey() ? 1 : 0, + nsEvent.getKeyCode() }; int[] out = new int[3]; // [jkeyCode, jkeyLocation, deadChar] @@ -280,8 +272,9 @@ final class CPlatformResponder { char characterToSendWithTheEvent = KeyEvent.CHAR_UNDEFINED; - if(isDeadChar){ + if(nsEvent.isHasDeadKey()){ characterToSendWithTheEvent = (char) out[2]; + jkeyCode = nsEvent.getDeadKeyCode(); if(characterToSendWithTheEvent == 0){ return; } @@ -317,25 +310,25 @@ final class CPlatformResponder { jkeyLocation = out[1]; - jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) : - NSEvent.nsToJavaEventType(eventType); + jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(nsEvent.getType()) : + NSEvent.nsToJavaEventType(nsEvent.getType()); if (isISOControl) { characterToSendWithTheEvent = checkedChar; - } else if (chars != null && !chars.isEmpty() && metaAltCtrlAreNotPressed && shiftIsPressed) { + } else if (nsEvent.getCharacters() != null && !nsEvent.getCharacters().isEmpty() && metaAltCtrlAreNotPressed && shiftIsPressed) { characterToSendWithTheEvent = checkedChar; - } else if (charsIgnoringModifiers != null && !charsIgnoringModifiers.isEmpty()) { - characterToSendWithTheEvent = charsIgnoringModifiers.charAt(0); + } else if (nsEvent.getCharactersIgnoringModifiers() != null && !nsEvent.getCharactersIgnoringModifiers().isEmpty()) { + characterToSendWithTheEvent = nsEvent.getCharactersIgnoringModifiers().charAt(0); } characterToSendWithTheEvent = mapNsCharsToCompatibleWithJava(characterToSendWithTheEvent); - if (jmodifiers != 0 && charsIgnoringModifiers != null && !charsIgnoringModifiers.isEmpty()) { - String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTheEvent, modifierFlags); + if (jmodifiers != 0 && nsEvent.getCharactersIgnoringModifiers() != null && !nsEvent.getCharactersIgnoringModifiers().isEmpty()) { + String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTheEvent, nsEvent.getModifierFlags()); characterToSendWithTheEvent = stringWithChar == null ? KeyEvent.CHAR_UNDEFINED : stringWithChar.charAt(0); } else { - String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTheEvent, modifierFlags); + String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTheEvent, nsEvent.getModifierFlags()); characterToSendWithTheEvent = stringWithChar == null ? KeyEvent.CHAR_UNDEFINED : stringWithChar.charAt(0); } @@ -351,7 +344,7 @@ final class CPlatformResponder { // Current browser may be sending input events, so don't // post the KEY_TYPED here. - postsTyped &= needsKeyTyped; + postsTyped &= true; // That's the reaction on the PRESSED (not RELEASED) event as it comes to // appear in MacOSX. @@ -362,15 +355,15 @@ final class CPlatformResponder { (jmodifiers & KeyEvent.META_DOWN_MASK) == 0) { // Enter and Space keys finish the input method processing, // KEY_TYPED and KEY_RELEASED events for them are synthesized in handleInputEvent. - if (needsKeyReleased && (jkeyCode == KeyEvent.VK_ENTER || jkeyCode == KeyEvent.VK_SPACE)) { + if (true && (jkeyCode == KeyEvent.VK_ENTER || jkeyCode == KeyEvent.VK_SPACE)) { return; } char characterToSendWithTypedEvent = KeyEvent.CHAR_UNDEFINED; - if (chars != null ) { + if (nsEvent.getCharacters()!= null ) { characterToSendWithTypedEvent = mapNsCharsToCompatibleWithJava(checkedChar); - String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTypedEvent, modifierFlags); + String stringWithChar = NSEvent.nsToJavaChar(characterToSendWithTypedEvent, nsEvent.getModifierFlags()); characterToSendWithTypedEvent = stringWithChar == null ? KeyEvent.CHAR_UNDEFINED : stringWithChar.charAt(0); } @@ -378,7 +371,7 @@ final class CPlatformResponder { jkeyCode, characterToSendWithTypedEvent, KeyEvent.KEY_LOCATION_UNKNOWN); //If events come from Firefox, released events should also be generated. - if (needsKeyReleased) { + if (true) { eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED, when, jmodifiers, jkeyCode, characterToSendWithTheEvent, KeyEvent.KEY_LOCATION_UNKNOWN); diff --git a/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java b/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java index 57b9ac671f..43f6495db7 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java @@ -201,9 +201,8 @@ public class CPlatformView extends CFRetainedResource { } } - private void deliverKeyEvent(NSEvent event) { - responder.handleKeyEvent(event.getType(), event.getModifierFlags(), event.getCharacters(), event.getCharactersIgnoringModifiersAndShift(), - event.getCharactersIgnoringModifiers(), event.getKeyCode(), true, false); + private void deliverKeyEvent(NSEvent nsEvent) { + responder.handleKeyEvent(nsEvent); } /** diff --git a/src/macosx/classes/sun/lwawt/macosx/NSEvent.java b/src/macosx/classes/sun/lwawt/macosx/NSEvent.java index d6c33c3b5e..bc91eac6d0 100644 --- a/src/macosx/classes/sun/lwawt/macosx/NSEvent.java +++ b/src/macosx/classes/sun/lwawt/macosx/NSEvent.java @@ -38,6 +38,8 @@ final class NSEvent { static final int SCROLL_PHASE_CONTINUED = 3; static final int SCROLL_PHASE_MOMENTUM_BEGAN = 4; static final int SCROLL_PHASE_ENDED = 5; + private boolean hasDeadKey; + private int deadKeyCode; private int type; private int modifierFlags; @@ -59,15 +61,26 @@ final class NSEvent { private String charactersIgnoringModifiers; private String charactersIgnoringModifiersAndShift; + public boolean isHasDeadKey() { + return hasDeadKey; + } + + public int getDeadKeyCode() { + return deadKeyCode; + } + // Called from native NSEvent(int type, int modifierFlags, short keyCode, String characters, String charactersIgnoringModifiers, - String charactersIgnoringModifiersAndShift) { + String charactersIgnoringModifiersAndShift, boolean hasDeadKey, int deadKeyCode) { this.type = type; this.modifierFlags = modifierFlags; + this.keyCode = keyCode; this.characters = characters; this.charactersIgnoringModifiers = charactersIgnoringModifiers; this.charactersIgnoringModifiersAndShift = charactersIgnoringModifiersAndShift; + this.hasDeadKey = hasDeadKey; + this.deadKeyCode = deadKeyCode; } // Called from native diff --git a/src/macosx/native/sun/awt/AWTEvent.m b/src/macosx/native/sun/awt/AWTEvent.m index 6e3c8c30de..f170083c23 100644 --- a/src/macosx/native/sun/awt/AWTEvent.m +++ b/src/macosx/native/sun/awt/AWTEvent.m @@ -36,35 +36,6 @@ #import "java_awt_event_KeyEvent.h" #import "java_awt_event_MouseEvent.h" -@implementation NSEvent (NSEventExtension) -- (NSString *)charactersIgnoringModifiersAndShift { - - TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); - CFDataRef layoutData = TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); - const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); - - UInt32 deadKeyState; - - UInt32 lengthOfBuffer = 4; - UniChar stringWithChars[lengthOfBuffer]; - UniCharCount actualLength; - - UCKeyTranslate(keyboardLayout, - [self keyCode], - kUCKeyActionDown, - 0, - LMGetKbdType(), - 0, - // ignore for now - &deadKeyState, - lengthOfBuffer, - &actualLength, - stringWithChars); - CFRelease(currentKeyboard); - return [NSString stringWithCharacters:stringWithChars length:actualLength]; -} -@end - /* * Table to map typed characters to their Java virtual key equivalent and back. * We use the incoming unichar (ignoring all modifiers) and try to figure out diff --git a/src/macosx/native/sun/awt/AWTView.m b/src/macosx/native/sun/awt/AWTView.m index a8418afecd..3d6b87fbc5 100644 --- a/src/macosx/native/sun/awt/AWTView.m +++ b/src/macosx/native/sun/awt/AWTView.m @@ -27,6 +27,7 @@ #import <JavaNativeFoundation/JavaNativeFoundation.h> #import <JavaRuntimeSupport/JavaRuntimeSupport.h> +#include <Carbon/Carbon.h> #import "ThreadUtilities.h" #import "AWTView.h" @@ -39,6 +40,7 @@ #import "GeomUtilities.h" #import "OSVersion.h" #import "CGLLayer.h" +#import "java_awt_event_KeyEvent.h" @interface AWTView() @property (retain) CDropTarget *_dropTarget; @@ -506,24 +508,133 @@ AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; JNIEnv *env = [ThreadUtilities getJNIEnv]; + TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); + CFDataRef layoutData = TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); + const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); + UInt32 isDeadKeyPressed; + UInt32 lengthOfBuffer = 4; + UniChar stringWithChars[lengthOfBuffer]; + UniCharCount actualLength; + + OSStatus status = UCKeyTranslate( + keyboardLayout, + [event keyCode], + kUCKeyActionDown, + 0, + LMGetKbdType(), + 0, + // ignore for now + &isDeadKeyPressed, + lengthOfBuffer, + &actualLength, + stringWithChars); + + CFRelease(currentKeyboard); + NSString* charactersIgnoringModifiersAndShiftAsNsString = [NSString stringWithCharacters:stringWithChars length:actualLength]; + jstring characters = NULL; jstring charactersIgnoringModifiers = NULL; jstring charactersIgnoringModifiersAndShift = NULL; + if ([event type] != NSFlagsChanged) { characters = JNFNSToJavaString(env, [event characters]); charactersIgnoringModifiers = JNFNSToJavaString(env, [event charactersIgnoringModifiers]); - charactersIgnoringModifiersAndShift = JNFNSToJavaString(env, [event charactersIgnoringModifiersAndShift]); + charactersIgnoringModifiersAndShift = JNFNSToJavaString(env, charactersIgnoringModifiersAndShiftAsNsString); + } + + jint javaDeadKeyCode = 0; + + if (status == noErr && isDeadKeyPressed != 0) { + + if (event.type != NSEventTypeKeyUp) { + // We send only key release for dead keys + return; + } + + status = UCKeyTranslate( + keyboardLayout, + kVK_Space, + kUCKeyActionDown, + 0, + LMGetKbdType(), + 0, + &isDeadKeyPressed, + lengthOfBuffer, + &actualLength, + stringWithChars); + + charactersIgnoringModifiersAndShift = JNFNSToJavaString(env, [NSString stringWithCharacters:stringWithChars length:actualLength]); + + switch ([event keyCode]) { + case 0x0060: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_GRAVE; + break; + case 0x00B4: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_ACUTE; + break; + case 0x0384: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_ACUTE; + break; + case 0x005E: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX; + break; + case 0x007E: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_TILDE; + break; + case 0x02DC: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_TILDE; + break; + case 0x00AF: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_MACRON; + break; + case 0x02D8: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_BREVE; + break; + case 0x02D9: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_ABOVEDOT; + break; + case 0x00A8: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_DIAERESIS; + break; + case 0x02DA: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_ABOVERING; + break; + case 0x02DD: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE; + break; + case 0x02C7: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_CARON; + break; + case 0x00B8: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_CEDILLA; + break; + case 0x02DB: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_OGONEK; + break; + case 0x037A: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_IOTA; + break; + case 0x309B: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND; + break; + case 0x309C: + javaDeadKeyCode = java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND; + break; + } } static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); - static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZI)V"); jobject jevent = JNFNewObject(env, jctor_NSEvent, [event type], [event modifierFlags], [event keyCode], characters, charactersIgnoringModifiers, - charactersIgnoringModifiersAndShift); + charactersIgnoringModifiersAndShift, + isDeadKeyPressed, + javaDeadKeyCode + ); static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView, diff --git a/test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java b/test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java index e521eca3ee..a47719c5b5 100644 --- a/test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java +++ b/test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java @@ -126,9 +126,11 @@ public class deadKeyMacOSX { char keyChar = e.getKeyChar(); if (state == 3) { - if (keyCode != 0) { - throw new RuntimeException("Key code should be undefined."); - } + // Now we send key codes +// if (keyCode != 0) { +// throw new RuntimeException("Key code should be undefined."); +// } + // This works for US keyboard only if (keyChar != 0xE1) { throw new RuntimeException("A char does not have ACCUTE accent"); } |