--- old/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m 2016-06-14 23:33:00.000000000 +0530 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m 2016-06-14 23:33:00.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. @@ -258,26 +259,30 @@ Java_sun_lwawt_macosx_CRobot_keyEvent (JNIEnv *env, jobject peer, jint javaKeyCode, jboolean keyPressed) { - /* - * Well, using CGEventCreateKeyboardEvent/CGEventPost would have been - * a better solution, however, it gives me all kinds of trouble and I have - * no idea how to solve them without inserting delays between simulated - * 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); + if ((javaKeyCode >= java_awt_event_KeyEvent_VK_0) && + (javaKeyCode <= java_awt_event_KeyEvent_VK_9)) + { + AXUIElementRef elem = AXUIElementCreateSystemWide(); + AXUIElementPostKeyboardEvent(elem, (CGCharCode)0, keyCode, keyPressed); + CFRelease(elem); + } else { + /* + * JDK-8155740: AXUIElementPostKeyboardEvent posts correct key codes for + * number keys whereas CGEventPost posts Numpad keys for corresponding + * number key. Hence AXUIElementPostKeyboardEvent is used for posting + * numbers and CGEventCreateKeyboardEvent/CGEventPost is used for other + * keys. + * Key code for modifier key is required to distinguish between ALT and + * ALT-GR key for fixing issue 8155740. + */ + CGEventRef event = CGEventCreateKeyboardEvent(NULL, keyCode, keyPressed); + if (event != NULL) { + CGEventPost(kCGSessionEventTap, event); + CFRelease(event); + } } -#endif } /*