# HG changeset patch # User itakiguchi # Date 1550445330 28800 # Node ID 33b96cbd16f354cbb2cfa103a760dd4023058219 # Parent e3451d08503aeb2c4bf2621c3c6b2354ee3f7c2f 8212678: Windows IME related patch Reviewed-by: serb, naoto diff -r e3451d08503a -r 33b96cbd16f3 src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java --- a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java Fri Feb 15 10:06:25 2019 -0800 +++ b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java Sun Feb 17 15:15:30 2019 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,7 @@ private Locale currentLocale; // indicate whether status window is hidden or not. private boolean statusWindowHidden = false; + private boolean hasCompositionString = false; // attribute definition in Win32 (in IMM.H) public static final byte ATTR_INPUT = 0x00; @@ -246,6 +247,7 @@ } else if (locale.getLanguage().equals(Locale.KOREAN.getLanguage())) { if (subset1 == UnicodeBlock.BASIC_LATIN || subset1 == InputSubset.LATIN_DIGITS) { setOpenStatus(context, false); + setConversionStatus(context, IME_CMODE_ALPHANUMERIC); } else { if (subset1 == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || subset1 == InputSubset.HANJA @@ -263,11 +265,14 @@ } else if (locale.getLanguage().equals(Locale.CHINESE.getLanguage())) { if (subset1 == UnicodeBlock.BASIC_LATIN || subset1 == InputSubset.LATIN_DIGITS) { setOpenStatus(context, false); + newmode = getConversionStatus(context); + newmode &= ~IME_CMODE_FULLSHAPE; + setConversionStatus(context, newmode); } else { if (subset1 == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || subset1 == InputSubset.TRADITIONAL_HANZI || subset1 == InputSubset.SIMPLIFIED_HANZI) - newmode = IME_CMODE_NATIVE; + newmode = IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE; else if (subset1 == InputSubset.FULLWIDTH_LATIN) newmode = IME_CMODE_FULLSHAPE; else @@ -318,6 +323,15 @@ setLocale(currentLocale, true); } + // Compare IM's composition string with Java's composition string + if (hasCompositionString && !isCompositionStringAvailable(context)) { + endCompositionNative(context, DISCARD_INPUT); + sendInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, + EventQueue.getMostRecentEventTime(), + null, null, null, null, null, 0, 0, 0); + hasCompositionString = false; + } + /* If the status window or Windows language bar is turned off due to native input method was switched to java input method, we have to turn it on otherwise it is gone for good until next time @@ -345,6 +359,7 @@ isLastFocussedActiveClient = haveActiveClient(); } isActive = false; + hasCompositionString = isCompositionStringAvailable(context); } /** @@ -649,4 +664,5 @@ static native Locale getNativeLocale(); static native boolean setNativeLocale(String localeName, boolean onActivate); private native void openCandidateWindow(WComponentPeer peer, int x, int y); + private native boolean isCompositionStringAvailable(int context); } diff -r e3451d08503a -r 33b96cbd16f3 src/java.desktop/windows/native/libawt/windows/awt_Component.cpp --- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Fri Feb 15 10:06:25 2019 -0800 +++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Sun Feb 17 15:15:30 2019 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3869,6 +3869,11 @@ return; } COMPOSITIONFORM cf = {CFS_DEFAULT, {0, 0}, {0, 0, 0, 0}}; + LOGFONT lf; + HFONT hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); + if (GetObject(hFont, sizeof(lf), (LPVOID)&lf) == sizeof(lf)) { + ImmSetCompositionFont(hIMC, &lf); + } ImmSetCompositionWindow(hIMC, &cf); ImmReleaseContext(hwnd, hIMC); } diff -r e3451d08503a -r 33b96cbd16f3 src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp --- a/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp Fri Feb 15 10:06:25 2019 -0800 +++ b/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp Sun Feb 17 15:15:30 2019 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -528,6 +528,23 @@ CATCH_BAD_ALLOC_RET(NULL); } +/* + * Class: sun_awt_windows_WInputMethod + * Method: isCompositionStringAvailable + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_isCompositionStringAvailable + (JNIEnv *env, jobject self, jint context) +{ + LONG length; + length = ImmGetCompositionString((HIMC)IntToPtr(context), GCS_COMPSTR, NULL, 0); + if (length > 0) { + return JNI_TRUE; + } else { + return JNI_FALSE; + } +} + /** * Class: sun_awt_windows_WInputMethod * Method: getNativeIMMDescription