Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions jdk/src/windows/classes/sun/awt/windows/WInputMethod.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2017, 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
Expand Down Expand Up @@ -62,6 +62,7 @@ final class WInputMethod extends InputMethodAdapter
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 final static byte ATTR_INPUT = 0x00;
Expand Down Expand Up @@ -241,6 +242,7 @@ else if (subset1 == InputSubset.FULLWIDTH_LATIN)
} 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
Expand All @@ -258,11 +260,14 @@ else if (subset1 == InputSubset.FULLWIDTH_LATIN)
} 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
Expand Down Expand Up @@ -313,6 +318,15 @@ public void activate() {
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
Expand Down Expand Up @@ -340,6 +354,7 @@ public void deactivate(boolean isTemporary)
isLastFocussedActiveClient = haveActiveClient();
}
isActive = false;
hasCompositionString = isCompositionStringAvailable(context);
}

/**
Expand Down Expand Up @@ -644,4 +659,5 @@ private WComponentPeer getNearestNativePeer(Component comp)
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);
}
5 changes: 5 additions & 0 deletions jdk/src/windows/native/sun/windows/awt_Component.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3832,6 +3832,11 @@ void AwtComponent::SetCompositionWindow(RECT& r)
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);
}
Expand Down
17 changes: 17 additions & 0 deletions jdk/src/windows/native/sun/windows/awt_InputMethod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,23 @@ JNIEXPORT jobjectArray JNICALL Java_sun_awt_windows_WInputMethodDescriptor_getNa
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
Expand Down