JRE-365 Wrong position of IME candidate window
Yet another attempt to fix.
This reapplies a previous fix (which caused JRE-412),
and backports JDK-8184016 from JDK 10, which is supposed to fix JRE-412
(http://hg.openjdk.java.net/jdk10/client/rev/9292a24eb113)
diff --git a/src/windows/native/sun/windows/awt_Component.cpp b/src/windows/native/sun/windows/awt_Component.cpp
index 09ddca6..1ba73f6 100644
--- a/src/windows/native/sun/windows/awt_Component.cpp
+++ b/src/windows/native/sun/windows/awt_Component.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, 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
@@ -3854,7 +3854,10 @@
HWND hWnd = GetHWnd();
HWND hTop = GetTopLevelParentForWindow(hWnd);
::ClientToScreen(hTop, &p);
-
+ if (!m_bitsCandType) {
+ SetCandidateWindow(m_bitsCandType, x - p.x, y - p.y);
+ return;
+ }
for (int iCandType=0; iCandType<32; iCandType++, bits<<=1) {
if ( m_bitsCandType & bits )
SetCandidateWindow(iCandType, x - p.x, y - p.y);
@@ -3872,7 +3875,7 @@
HIMC hIMC = ImmGetContext(hwnd);
CANDIDATEFORM cf;
cf.dwIndex = iCandType;
- cf.dwStyle = CFS_CANDIDATEPOS;
+ cf.dwStyle = CFS_POINT;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
@@ -3904,9 +3907,17 @@
MsgRouting AwtComponent::WmImeNotify(WPARAM subMsg, LPARAM bitsCandType)
{
- if (!m_useNativeCompWindow && subMsg == IMN_OPENCANDIDATE) {
- m_bitsCandType = bitsCandType;
- InquireCandidatePosition();
+ if (!m_useNativeCompWindow) {
+ if (subMsg == IMN_OPENCANDIDATE) {
+ m_bitsCandType = bitsCandType;
+ InquireCandidatePosition();
+ } else if (subMsg == IMN_OPENSTATUSWINDOW ||
+ subMsg == WM_IME_STARTCOMPOSITION) {
+ m_bitsCandType = 0;
+ InquireCandidatePosition();
+ } else if (subMsg == IMN_SETCANDIDATEPOS) {
+ InquireCandidatePosition();
+ }
return mrConsume;
}
return mrDoDefault;
@@ -4166,14 +4177,14 @@
return (HWND)NULL;
}
-/* Call DefWindowProc for the focus proxy, if any */
+/* Redirects message to the focus proxy, if any */
void AwtComponent::CallProxyDefWindowProc(UINT message, WPARAM wParam,
LPARAM lParam, LRESULT &retVal, MsgRouting &mr)
{
if (mr != mrConsume) {
HWND proxy = GetProxyFocusOwner();
if (proxy != NULL && ::IsWindowEnabled(proxy)) {
- retVal = ComCtl32Util::GetInstance().DefWindowProc(NULL, proxy, message, wParam, lParam);
+ retVal = ::DefWindowProc(proxy, message, wParam, lParam);
mr = mrConsume;
}
}