--- old/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m 2016-05-12 12:48:58.000000000 +0530 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m 2016-05-12 12:48:58.000000000 +0530 @@ -33,6 +33,7 @@ #import "LWCToolkit.h" #import "sun_lwawt_macosx_CRobot.h" #import "java_awt_event_InputEvent.h" +#import "java_awt_event_KeyEvent.h" #import "sizecalc.h" // Starting number for event numbers generated by Robot. @@ -74,6 +75,8 @@ static int GetClickCount(BOOL isDown); +static BOOL IsModifierKey(jint javaKeyCode); + static void CreateJavaException(JNIEnv* env, CGError err) { @@ -265,19 +268,29 @@ * events. So, I've ended up disabling it and opted for another approach * that uses Accessibility API instead. */ + CGKeyCode keyCode = GetCGKeyCode(javaKeyCode); - AXUIElementRef elem = AXUIElementCreateSystemWide(); - AXUIElementPostKeyboardEvent(elem, (CGCharCode)0, keyCode, keyPressed); - CFRelease(elem); - - -#if 0 - CGEventRef event = CGEventCreateKeyboardEvent(NULL, keyCode, keyPressed); - if (event != NULL) { - CGEventPost(kCGSessionEventTap, event); - CFRelease(event); + + /* + * JDK-8155740: AXUIElementPostKeyboardEvent posts 0 key code for all + * the modifier keys with key codes (16, 17,18, 20, 157) and also for + * newly added modifier key VK_ALT_GRAPH. But it posts correct key code + * for all the other keys. On the other hand CGEventCreateKeyboardEvent + * posts correct key code for all the modifier keys and hence it is used + * to post modifier key events and AXUIElementPostKeyboardEvent is used to + * post all the remaining key events. + */ + if (IsModifierKey(javaKeyCode)) { + CGEventRef event = CGEventCreateKeyboardEvent(NULL, keyCode, keyPressed); + if (event != NULL) { + CGEventPost(kCGSessionEventTap, event); + CFRelease(event); + } + } else { + AXUIElementRef elem = AXUIElementCreateSystemWide(); + AXUIElementPostKeyboardEvent(elem, (CGCharCode)0, keyCode, keyPressed); + CFRelease(elem); } -#endif } /* @@ -384,3 +397,18 @@ return gsClickCount; } + +static BOOL IsModifierKey(jint javaKeyCode) { + + switch (javaKeyCode) { + case java_awt_event_KeyEvent_VK_SHIFT: + case java_awt_event_KeyEvent_VK_CONTROL: + case java_awt_event_KeyEvent_VK_ALT: + case java_awt_event_KeyEvent_VK_CAPS_LOCK: + case java_awt_event_KeyEvent_VK_META: + case java_awt_event_KeyEvent_VK_ALT_GRAPH: + return YES; + } + + return NO; +}