From 2639e963f833aa0e65c4d26f33638972edf2f7a6 Mon Sep 17 00:00:00 2001
From: Ruize Tang <1466040111@qq.com>
Date: Fri, 28 Oct 2022 21:43:55 +0800
Subject: [PATCH] fix fcitx wrong position of hidpi scaling problem
fix RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64#24
---
idea.patch | 60 +++++++++++++++++++++++++++++++++++-------------------
1 file changed, 39 insertions(+), 21 deletions(-)
diff --git a/idea.patch b/idea.patch
index 4ef913b..2b125b4 100644
--- a/idea.patch
+++ b/idea.patch
@@ -1,5 +1,5 @@
diff --git a/src/java.desktop/share/classes/java/awt/Container.java b/src/java.desktop/share/classes/java/awt/Container.java
-index ec6913057d8..c9ca9cbf11e 100644
+index 1327b2fded9..c2ebc03fcc1 100644
--- a/src/java.desktop/share/classes/java/awt/Container.java
+++ b/src/java.desktop/share/classes/java/awt/Container.java
@@ -25,6 +25,7 @@
@@ -26,7 +26,7 @@ index ec6913057d8..c9ca9cbf11e 100644
* Detects whether or not remove from current parent and adding to new parent requires call of
* removeNotify on the component. Since removeNotify destroys native window this might (not)
diff --git a/src/java.desktop/share/classes/javax/swing/JTextArea.java b/src/java.desktop/share/classes/javax/swing/JTextArea.java
-index 03b3bc7e9bd..7bd43f5829b 100644
+index ecc9342f05a..eea39c9e03a 100644
--- a/src/java.desktop/share/classes/javax/swing/JTextArea.java
+++ b/src/java.desktop/share/classes/javax/swing/JTextArea.java
@@ -562,6 +562,14 @@ public class JTextArea extends JTextComponent {
@@ -45,7 +45,7 @@ index 03b3bc7e9bd..7bd43f5829b 100644
* Returns the number of columns in the TextArea.
*
diff --git a/src/java.desktop/share/classes/javax/swing/JTextField.java b/src/java.desktop/share/classes/javax/swing/JTextField.java
-index 0d66209d8af..363ac03514b 100644
+index 3abe09d0565..50dc549bdba 100644
--- a/src/java.desktop/share/classes/javax/swing/JTextField.java
+++ b/src/java.desktop/share/classes/javax/swing/JTextField.java
@@ -427,6 +427,14 @@ public class JTextField extends JTextComponent implements SwingConstants {
@@ -64,7 +64,7 @@ index 0d66209d8af..363ac03514b 100644
* Returns the preferred size Dimensions
needed for this
* TextField
. If a non-zero number of columns has been
diff --git a/src/java.desktop/share/classes/sun/awt/im/InputContext.java b/src/java.desktop/share/classes/sun/awt/im/InputContext.java
-index 237164a9d42..9a16e75ff46 100644
+index bb955dc5089..7c42e2aa685 100644
--- a/src/java.desktop/share/classes/sun/awt/im/InputContext.java
+++ b/src/java.desktop/share/classes/sun/awt/im/InputContext.java
@@ -28,6 +28,7 @@ package sun.awt.im;
@@ -164,10 +164,10 @@ index 237164a9d42..9a16e75ff46 100644
* Activates the current input method of this input context, and grabs
* the composition area for use by this input context.
diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java b/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java
-index 2afd7bbefdb..2be981523ed 100644
+index 4244812ceb0..f2fa4a0684c 100644
--- a/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java
+++ b/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java
-@@ -28,10 +28,21 @@ package sun.awt.X11;
+@@ -28,12 +28,25 @@ package sun.awt.X11;
import java.awt.AWTException;
import java.awt.Component;
import java.awt.Container;
@@ -177,7 +177,8 @@ index 2afd7bbefdb..2be981523ed 100644
import java.awt.Rectangle;
import java.awt.im.spi.InputMethodContext;
import java.awt.peer.ComponentPeer;
-
++import java.awt.GraphicsEnvironment;
++
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
@@ -185,13 +186,25 @@ index 2afd7bbefdb..2be981523ed 100644
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.text.JTextComponent;
-+
+
import sun.awt.AWTAccessor;
import sun.awt.X11InputMethod;
++import sun.awt.X11GraphicsDevice;
-@@ -86,15 +97,29 @@ public class XInputMethod extends X11InputMethod {
+ import sun.util.logging.PlatformLogger;
- private static volatile long xicFocus;
+@@ -45,6 +58,8 @@ import sun.util.logging.PlatformLogger;
+ public class XInputMethod extends X11InputMethod {
+ private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XInputMethod");
+
++ private int scale = ((X11GraphicsDevice)GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()).getScaleFactor();
++
+ public XInputMethod() throws AWTException {
+ super();
+ }
+@@ -86,15 +101,29 @@ public class XInputMethod extends X11InputMethod {
+
+ private static volatile long xicFocus = 0;
+ /**
+ * fix fcitx position
@@ -220,8 +233,8 @@ index 2afd7bbefdb..2be981523ed 100644
}
public static long getXICFocus() {
-@@ -156,6 +181,69 @@ public class XInputMethod extends X11InputMethod {
- return peer.getContentWindow();
+@@ -133,6 +162,74 @@ public class XInputMethod extends X11InputMethod {
+ return null;
}
+ protected int[] getOffXYRelateToFrame(ComponentPeer peer, boolean value) {
@@ -276,8 +289,13 @@ index 2afd7bbefdb..2be981523ed 100644
+ Method method_getNativeContainer = Component.class.getDeclaredMethod("getNativeContainer");
+ method_getNativeContainer.setAccessible(true);
+ Container c = (Container)method_getNativeContainer.invoke(awtFocussedComponent);
-+ if(c != null)
++ if(c != null) {
+ result = new int[]{point.x - c.getPeerLocationOnScreen().x + caret_x, point.y - c.getPeerLocationOnScreen().y + font_height + caret_y};
++ if (scale > 1) {
++ result[0] *= scale;
++ result[1] *= scale;
++ }
++ }
+
+ return result;
+ } catch (Exception e) {
@@ -288,9 +306,9 @@ index 2afd7bbefdb..2be981523ed 100644
+ }
+
/*
- * Native methods
- */
-@@ -164,6 +252,6 @@ public class XInputMethod extends X11InputMethod {
+ * Subclasses should override disposeImpl() instead of dispose(). Client
+ * code should always invoke dispose(), never disposeImpl().
+@@ -253,6 +350,6 @@ public class XInputMethod extends X11InputMethod {
private native boolean recreateXICNative(long window, long px11data, int ctxid);
private native int releaseXICNative(long px11data);
private native void setXICFocusNative(long window,
@@ -299,7 +317,7 @@ index 2afd7bbefdb..2be981523ed 100644
private native void adjustStatusWindow(long window);
}
diff --git a/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java b/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java
-index 18e0ba1e7e4..34112b11db5 100644
+index d9bed439688..623af69478e 100644
--- a/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java
+++ b/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java
@@ -33,6 +33,7 @@ import java.awt.AWTException;
@@ -351,10 +369,10 @@ index 18e0ba1e7e4..34112b11db5 100644
protected abstract int releaseXIC();
private static native boolean recreateX11InputMethod();
diff --git a/src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c b/src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c
-index aafb1af3d81..ff3978dd043 100644
+index e63741f583e..55d847b98ac 100644
--- a/src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c
+++ b/src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c
-@@ -427,13 +427,17 @@ setXICFocus(XIC ic, unsigned short req)
+@@ -434,13 +434,17 @@ setXICFocus(XIC ic, unsigned short req)
* Sets the focus window to the given XIC.
*/
static void
@@ -374,7 +392,7 @@ index aafb1af3d81..ff3978dd043 100644
}
/*
-@@ -1469,7 +1473,8 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
+@@ -1519,7 +1523,8 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
jobject this,
jlong w,
jboolean req,
@@ -384,7 +402,7 @@ index aafb1af3d81..ff3978dd043 100644
{
X11InputMethodData *pX11IMData;
AWT_LOCK();
-@@ -1490,7 +1495,17 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
+@@ -1540,7 +1545,17 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
* On Solaris2.6, setXICWindowFocus() has to be invoked
* before setting focus.
*/