changeset 57785:abd50a05d1d1

8230926: [macosx] Two apostrophes are entered instead of one with "U.S. International - PC" layout Reviewed-by: serb, dmarkov
author alitvinov
date Mon, 13 Jan 2020 18:11:28 +0000
parents 0d6c682b5648
children b681239b7258
files src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java	Mon Jan 13 18:27:31 2020 +0530
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java	Mon Jan 13 18:11:28 2020 +0000
@@ -184,8 +184,11 @@
             // It is necessary to use testCharIgnoringModifiers instead of testChar for event
             // generation in such case to avoid uppercase letters in text components.
             LWCToolkit lwcToolkit = (LWCToolkit)Toolkit.getDefaultToolkit();
-            if (lwcToolkit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK) &&
-                    Locale.SIMPLIFIED_CHINESE.equals(lwcToolkit.getDefaultKeyboardLocale())) {
+            if ((lwcToolkit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK) &&
+                    Locale.SIMPLIFIED_CHINESE.equals(lwcToolkit.getDefaultKeyboardLocale())) ||
+                (LWCToolkit.isLocaleUSInternationalPC(lwcToolkit.getDefaultKeyboardLocale()) &&
+                    LWCToolkit.isCharModifierKeyInUSInternationalPC(testChar) &&
+                    (testChar != testCharIgnoringModifiers))) {
                 testChar = testCharIgnoringModifiers;
             }
 
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java	Mon Jan 13 18:27:31 2020 +0530
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java	Mon Jan 13 18:11:28 2020 +0000
@@ -802,6 +802,23 @@
         return locale;
     }
 
+    public static boolean isLocaleUSInternationalPC(Locale locale) {
+        return (locale != null ?
+            locale.toString().equals("_US_UserDefined_15000") : false);
+    }
+
+    public static boolean isCharModifierKeyInUSInternationalPC(char ch) {
+        // 5 characters: APOSTROPHE, QUOTATION MARK, ACCENT GRAVE, SMALL TILDE,
+        // CIRCUMFLEX ACCENT
+        final char[] modifierKeys = {'\'', '"', '`', '\u02DC', '\u02C6'};
+        for (char modKey : modifierKeys) {
+            if (modKey == ch) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @Override
     public InputMethodDescriptor getInputMethodAdapterDescriptor() {
         if (sInputMethodDescriptor == null)