[jdk8u-dev] RFR: 8330561: [Windows][8u] IME candidate window wrong position

Kazuhisa Takakuri ktakakuri at openjdk.org
Thu Apr 18 08:52:34 UTC 2024


This fix includes a fix for JDK-8189687 in JDK9.
JDK-8189687 contains two fixes to AwtComponent:: OpenCandidateWindow

1. Fix to make OpenCandidateWindow reference the correct Window
Fix OpenCandidateWindow to reference the proxy window that has focus when getting "HWND."


--- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp
+++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp
@@ -3880,19 +3880,21 @@ void AwtComponent::OpenCandidateWindow(int x, int y)
 {
     UINT bits = 1;
     POINT p = {0, 0}; // upper left corner of the client area
-    HWND hWnd = GetHWnd();
+    HWND hWnd = ImmGetHWnd();
     if (!::IsWindowVisible(hWnd)) {
         return;
     }



2. Scaling fixes to enhance JDK-8073320
OpenJDK9 has supported HiDPI Graphics since JEP 263 (JDK-8055212). This fix is one of its enhancements: when OpenCandidateWindow opens an IME conversion candidate, it corrects the coordinates for the device.


--- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp
+++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp
@@ -3880,19 +3880,21 @@ void AwtComponent::OpenCandidateWindow(int x, int y)
     HWND hTop = GetTopLevelParentForWindow(hWnd);
     ::ClientToScreen(hTop, &p);
+    int sx = ScaleUpX(x) - p.x;
+    int sy = ScaleUpY(y) - p.y;
     if (!m_bitsCandType) {
-        SetCandidateWindow(m_bitsCandType, x - p.x, y - p.y);
+        SetCandidateWindow(m_bitsCandType, sx, sy);
         return;
     }
     for (int iCandType=0; iCandType<32; iCandType++, bits<<=1) {
         if ( m_bitsCandType & bits )
-            SetCandidateWindow(iCandType, x - p.x, y - p.y);
+            SetCandidateWindow(iCandType, sx, sy);
     }
 }


In attatchmented test which reproduces the issue problem, the Panel containing the TextField is a child component, so it refers to the wrong window to get the position coordinate of the candidate window.
Therefore, the candidate window will appear in the correct position with the "1" fix.
Note that OpenJDK8 does not implement JEP 263, so the "2" fix is not included in this pull request.

-------------

Commit messages:
 - Fix 8330561

Changes: https://git.openjdk.org/jdk8u-dev/pull/483/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk8u-dev&pr=483&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8330561
  Stats: 2 lines in 1 file changed: 0 ins; 0 del; 2 mod
  Patch: https://git.openjdk.org/jdk8u-dev/pull/483.diff
  Fetch: git fetch https://git.openjdk.org/jdk8u-dev.git pull/483/head:pull/483

PR: https://git.openjdk.org/jdk8u-dev/pull/483


More information about the jdk8u-dev mailing list