aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Fokin <Denis.Fokin@jetbrains.com>2017-01-09 20:28:36 +0300
committerDenis Fokin <Denis.Fokin@jetbrains.com>2017-01-09 20:28:53 +0300
commit7f4b9869f8e3e846aedc938c2a9eb644175bd9aa (patch)
treec9ac0c675dc52550bb5096573049ff86c360be09
parenteafe84a8519b42dea5518cc91a27652befd91473 (diff)
downloadjdk8u_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.java7
-rw-r--r--src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java67
-rw-r--r--src/macosx/classes/sun/lwawt/macosx/CPlatformView.java5
-rw-r--r--src/macosx/classes/sun/lwawt/macosx/NSEvent.java15
-rw-r--r--src/macosx/native/sun/awt/AWTEvent.m29
-rw-r--r--src/macosx/native/sun/awt/AWTView.m117
-rw-r--r--test/java/awt/event/KeyEvent/DeadKey/deadKeyMacOSX.java8
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");
}