< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m

Print this page
rev 52276 : 8213292 Input freezes after MacOS key-selector (press&hold) usage on macOS Mojave

Call abandonInput to reset input methods after entering accented symbols

@@ -32,10 +32,11 @@
 #import "JavaAccessibilityUtilities.h"
 #import "GeomUtilities.h"
 #import "OSVersion.h"
 #import "ThreadUtilities.h"
 
+#import <Carbon/Carbon.h>
 #import <JavaNativeFoundation/JavaNativeFoundation.h>
 
 @interface AWTView()
 @property (retain) CDropTarget *_dropTarget;
 @property (retain) CDragSource *_dragSource;

@@ -56,10 +57,17 @@
     if (shouldUsePressAndHold != -1) return shouldUsePressAndHold;
     shouldUsePressAndHold = !isSnowLeopardOrLower();
     return shouldUsePressAndHold;
 }
 
+#ifndef kCFCoreFoundationVersionNumber10_13_Max
+#define kCFCoreFoundationVersionNumber10_13_Max 1499
+#endif
+
+#define IS_OSX_GT10_13 (floor(kCFCoreFoundationVersionNumber) > \
+    kCFCoreFoundationVersionNumber10_13_Max)
+
 @implementation AWTView
 
 @synthesize _dropTarget;
 @synthesize _dragSource;
 @synthesize cglLayer;

@@ -279,15 +287,35 @@
     fKeyEventsNeeded = YES;
 
     // Allow TSM to look at the event and potentially send back NSTextInputClient messages.
     [self interpretKeyEvents:[NSArray arrayWithObject:event]];
 
-    if (fEnablePressAndHold && [event willBeHandledByComplexInputMethod] && fInputMethodLOCKABLE) {
+    if (fEnablePressAndHold && [event willBeHandledByComplexInputMethod] && 
+        fInputMethodLOCKABLE)
+    {
         fProcessingKeystroke = NO;
         if (!fInPressAndHold) {
             fInPressAndHold = YES;
             fPAHNeedsToSelect = YES;
+        } else if (IS_OSX_GT10_13) {
+            // Abandon input to reset IM and unblock input after canceling 
+            // input accented symbols (macOS 10.14+ only)
+
+            switch([event keyCode]) {
+                case kVK_Escape:
+                case kVK_Delete:
+                case kVK_Return:
+                case kVK_ForwardDelete:
+                case kVK_PageUp:
+                case kVK_PageDown:
+                case kVK_DownArrow:
+                case kVK_UpArrow:
+                case kVK_Home:
+                case kVK_End:
+                   [self abandonInput];
+                   break;
+            }
         }
         return;
     }
 
     NSString *eventCharacters = [event characters];

@@ -976,10 +1004,17 @@
         if ([useString length] > 0) {
             fKeyEventsNeeded = YES;
         }
     }
     fPAHNeedsToSelect = NO;
+
+    // Abandon input to reset IM and unblock input after entering accented
+    // symbols (macOS 10.14+ only)
+
+    if (IS_OSX_GT10_13) {
+        [self abandonInput];
+    }
 }
 
 - (void) doCommandBySelector:(SEL)aSelector
 {
 #ifdef IM_DEBUG
< prev index next >