[jdk8u-dev] RFR: 8189687: Swing: Invalid position of candidate pop-up of InputMethod in Hi-DPI on Windows
Kazuhisa Takakuri
ktakakuri at openjdk.org
Tue Aug 20 11:41:21 UTC 2024
This is a backport of JDK-8189687: Swing: Invalid position of candidate pop-up of InputMethod in Hi-DPI on Windows.
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 the attached test that 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 the Copyright year
- Backport 489e5ae3349370825b7faa1d7514796a2b1ac1c7
Changes: https://git.openjdk.org/jdk8u-dev/pull/564/files
Webrev: https://webrevs.openjdk.org/?repo=jdk8u-dev&pr=564&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8189687
Stats: 2 lines in 1 file changed: 0 ins; 0 del; 2 mod
Patch: https://git.openjdk.org/jdk8u-dev/pull/564.diff
Fetch: git fetch https://git.openjdk.org/jdk8u-dev.git pull/564/head:pull/564
PR: https://git.openjdk.org/jdk8u-dev/pull/564
More information about the jdk8u-dev
mailing list