summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO36
-rw-r--r--PKGBUILD55
-rw-r--r--idea.patch425
3 files changed, 481 insertions, 35 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 3579cd46fd85..2f098281b84d 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,5 +1,5 @@
pkgbase = java11-jetbrains-imfix
- pkgver = 11.0.13.b1751.19
+ pkgver = 11.0.14.1.b2043.45
pkgrel = 1
url = https://confluence.jetbrains.com/display/JBR/JetBrains+Runtime
arch = x86_64
@@ -27,18 +27,19 @@ pkgbase = java11-jetbrains-imfix
makedepends = lcms2
makedepends = libnet
makedepends = bash
- makedepends = ant
+ makedepends = harfbuzz
+ makedepends = glibc
+ makedepends = gcc-libs
+ makedepends = jcef-jetbrains
makedepends = git
- makedepends = rsync
- source = git+https://github.com/JetBrains/JetBrainsRuntime.git#tag=jbr11_0_13b1751.19
- source = git+https://github.com/JetBrains/jcef.git#commit=e6e5235
- source = https://github.com/prehonor/myJetBrainsRuntime/raw/master/idea.patch
+ options = !lto
+ source = git+https://github.com/JetBrains/JetBrainsRuntime.git#tag=jb11_0_14_1-b2043.45
+ source = idea.patch
source = freedesktop-java.desktop
source = freedesktop-jconsole.desktop
source = freedesktop-jshell.desktop
sha256sums = SKIP
- sha256sums = SKIP
- sha256sums = ceb149421aeceb286143a9c9979f3b9ce9fc9b161dfda1e20d41352c5e4741c4
+ sha256sums = d895f224a2130a677e52e176dc740186d40a6b2b5fc100c1d09f0413d9115ae7
sha256sums = 915bd0722e897fd811bb0d77829528017ecdfd703880454bc690018ee54e44b6
sha256sums = 3f072ef4d1f59e1188d4b36ff83378c67b9f77db532b4f5cbaeb57cd37620f07
sha256sums = c0c01fcc02dc18ed96ef697b3bedce0e8336b212cb1fcee90b2129987f4ae8ec
@@ -50,17 +51,28 @@ pkgname = jre11-jetbrains-imfix
depends = ca-certificates-utils
depends = nss
depends = libjpeg-turbo
+ depends = libjpeg.so
depends = lcms2
+ depends = liblcms2.so
depends = libnet
depends = freetype2
+ depends = libfreetype.so
+ depends = harfbuzz
+ depends = libharfbuzz.so
+ depends = glibc
+ depends = gcc-libs
depends = giflib
+ depends = libgif.so
+ depends = libpng
+ depends = jcef-jetbrains
optdepends = java-rhino: for some JavaScript support
optdepends = alsa-lib: for basic sound support
optdepends = gtk2: for the Gtk+ 2 look and feel - desktop usage
optdepends = gtk3: for the Gtk+ 3 look and feel - desktop usage
provides = java-runtime=11
+ provides = java-runtime-headless=11
provides = java-runtime-jetbrains=11
- provides = jre11-jetbrains=11.0.13.b1751.19-1
+ provides = jre11-jetbrains=11.0.14.1.b2043.45-1
conflicts = jre11-jetbrains
backup = etc/java11-jetbrains/logging.propertopenjdkies
backup = etc/java11-jetbrains/management/jmxremote.access
@@ -80,11 +92,13 @@ pkgname = jre11-jetbrains-imfix
pkgname = jdk11-jetbrains-imfix
pkgdesc = JetBrains Java 11 development kit (With patch that allows allow the IME window follow the cursor)
install = install_jdk-jetbrains.sh
- depends = jre11-jetbrains=11.0.13.b1751.19-1
+ depends = jre11-jetbrains=11.0.14.1.b2043.45-1
depends = java-environment-common=3
depends = hicolor-icon-theme
depends = libelf
+ depends = glibc
+ depends = gcc-libs
provides = java-environment=11
provides = java-environment-jetbrains=11
- provides = jdk11-jetbrains=11.0.13.b1751.19-1
+ provides = jdk11-jetbrains=11.0.14.1.b2043.45-1
conflicts = jdk11-jetbrains
diff --git a/PKGBUILD b/PKGBUILD
index 46b475268489..455fe2a6e023 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,8 +1,10 @@
# Contributer: Levente Polyak <anthraxx[at]archlinux[dot]org>
# Contributer: Guillaume ALAUX <guillaume@archlinux.org>
+# Contributer: Github user prehonor
# Contributer: Github user RikudouPatrickstar
# This PKGBUILD is directly modified from community/java11-openjdk
+# imfix patch is from https://github.com/prehonor/myJetBrainsRuntime
# Methods to build JBR with JCEF support is from https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/blob/master/.github/workflows/jbr-linux-x64.yml
# TODO add test, see about packaging jtreg and using it here
@@ -19,31 +21,32 @@ pkgbase=java11-jetbrains-imfix
_pkgbase=java11-jetbrains
pkgname=('jre11-jetbrains-imfix' 'jdk11-jetbrains-imfix')
_majorver=11
-_ver=11.0.13
-_hgver=11_0_13
-_updatever=8
-_jbver1=1751
-_jbver2=19
+_ver=11.0.14.1
+_hgver=11_0_14_1
+_updatever=1
+_jbver1=2043
+_jbver2=45
pkgrel=1
pkgver=${_ver}.b${_jbver1}.${_jbver2}
-_hg_tag=jbr${_hgver}b${_jbver1}.${_jbver2}
-_jcef_commit=e6e5235
+_hg_tag=jb${_hgver}-b${_jbver1}.${_jbver2}
+#_jcef_commit=316db138ea00b1a814f92e3d2f853320e8ce73b5
arch=('x86_64')
url='https://confluence.jetbrains.com/display/JBR/JetBrains+Runtime'
license=('custom')
makedepends=('java-environment>=11' 'java-environment<12' 'cpio' 'unzip' 'zip' 'libelf' 'libcups' 'libx11'
'libxrender' 'libxtst' 'libxt' 'libxext' 'libxrandr' 'alsa-lib' 'pandoc'
'graphviz' 'freetype2' 'libjpeg-turbo' 'giflib' 'libpng' 'lcms2'
- 'libnet' 'bash' 'ant' 'git' 'rsync')
+ 'libnet' 'bash' 'harfbuzz' 'glibc' 'gcc-libs' 'jcef-jetbrains' 'git')
+options=(!lto)
source=(git+https://github.com/JetBrains/JetBrainsRuntime.git#tag=$_hg_tag
- git+https://github.com/JetBrains/jcef.git#commit=$_jcef_commit
- https://github.com/prehonor/myJetBrainsRuntime/raw/master/idea.patch
+# git+https://github.com/JetBrains/jcef.git#commit=$_jcef_commit
+ idea.patch
freedesktop-java.desktop
freedesktop-jconsole.desktop
freedesktop-jshell.desktop)
sha256sums=('SKIP'
- 'SKIP'
- 'ceb149421aeceb286143a9c9979f3b9ce9fc9b161dfda1e20d41352c5e4741c4'
+# 'SKIP'
+ 'd895f224a2130a677e52e176dc740186d40a6b2b5fc100c1d09f0413d9115ae7'
'915bd0722e897fd811bb0d77829528017ecdfd703880454bc690018ee54e44b6'
'3f072ef4d1f59e1188d4b36ff83378c67b9f77db532b4f5cbaeb57cd37620f07'
'c0c01fcc02dc18ed96ef697b3bedce0e8336b212cb1fcee90b2129987f4ae8ec')
@@ -60,13 +63,13 @@ _imgdir=${_jdkdir}/build/linux-${_JARCH}-normal-server-release/images
build() {
# build jcef
- cd $srcdir/jcef
- sed -i "s/4.46/5.4/g" tools/buildtools/download_from_google_storage.py
- mkdir jcef_build && cd jcef_build
- cmake -DCMAKE_BUILD_TYPE=Release ..
- make
- cd ../jb/tools/linux
- JDK_11=/usr/lib/jvm/$(ls /usr/lib/jvm | grep 11 | head -n 1) ./build.sh all
+ #cd $srcdir/jcef
+ #sed -i "s/4.46/5.4/g" tools/buildtools/download_from_google_storage.py
+ #mkdir jcef_build && cd jcef_build
+ #cmake -DCMAKE_BUILD_TYPE=Release ..
+ #make
+ #cd ../jb/tools/linux
+ #JDK_11=/usr/lib/jvm/$(ls /usr/lib/jvm | grep 11 | head -n 1) ./build.sh all
# build jbr
cd $srcdir/${_jdkdir}
@@ -118,11 +121,12 @@ build() {
--with-libpng=system \
--with-lcms=system \
--with-zlib=system \
+ --with-harfbuzz=system \
--with-jvm-features=zgc \
--enable-unlimited-crypto \
--disable-warnings-as-errors \
${NUM_PROC_OPT} \
- --with-import-modules=$srcdir/jcef/out/linux64/modular-sdk
+ --with-import-modules=/usr/lib/jcef-jetbrains/modular-sdk
#--disable-javac-server
make images legacy-jre-image
@@ -139,12 +143,13 @@ check() {
package_jre11-jetbrains-imfix() {
pkgdesc="JetBrains Java ${_majorver} full runtime environment (With patch that allows the IME window follow the cursor)"
- depends=('java-runtime-common>=3' 'ca-certificates-utils' 'nss' 'libjpeg-turbo' 'lcms2' 'libnet' 'freetype2' 'giflib')
+ depends=('java-runtime-common>=3' 'ca-certificates-utils' 'nss' 'libjpeg-turbo' 'libjpeg.so' 'lcms2' 'liblcms2.so' 'libnet' 'freetype2' 'libfreetype.so' 'harfbuzz' 'libharfbuzz.so'
+ 'glibc' 'gcc-libs' 'giflib' 'libgif.so' 'libpng' 'jcef-jetbrains')
optdepends=('java-rhino: for some JavaScript support'
'alsa-lib: for basic sound support'
'gtk2: for the Gtk+ 2 look and feel - desktop usage'
'gtk3: for the Gtk+ 3 look and feel - desktop usage')
- provides=("java-runtime=${_majorver}" "java-runtime-jetbrains=${_majorver}" "jre${_majorver}-jetbrains=${pkgver}-${pkgrel}")
+ provides=("java-runtime=${_majorver}" "java-runtime-headless=${_majorver}" "java-runtime-jetbrains=${_majorver}" "jre${_majorver}-jetbrains=${pkgver}-${pkgrel}")
conflicts=("jre11-jetbrains")
_pkgname="jre11-jetbrains"
backup=(etc/${_pkgbase}/logging.propertopenjdkies
@@ -171,7 +176,9 @@ package_jre11-jetbrains-imfix() {
"${pkgdir}${_jvmdir}"
# Include jcef libs
- rsync -av $srcdir/jcef/jcef_build/native/Release/ ${pkgdir}${_jvmdir}/lib --exclude="modular-sdk"
+ find /usr/lib/jcef-jetbrains -maxdepth 1 -mindepth 1 -exec ln -sf {} "${pkgdir}${_jvmdir}/lib/" \;
+ rm "${pkgdir}${_jvmdir}/lib/modular-sdk"
+ #rsync -av $srcdir/jcef/jcef_build/native/Release/ ${pkgdir}${_jvmdir}/lib --exclude="modular-sdk"
cp ../jdk/release "${pkgdir}${_jvmdir}"
cp ../jdk/lib/modules "${pkgdir}${_jvmdir}/lib"
@@ -200,7 +207,7 @@ package_jre11-jetbrains-imfix() {
package_jdk11-jetbrains-imfix() {
pkgdesc="JetBrains Java ${_majorver} development kit (With patch that allows allow the IME window follow the cursor)"
- depends=("jre${_majorver}-jetbrains=${pkgver}-${pkgrel}" 'java-environment-common=3' 'hicolor-icon-theme' 'libelf')
+ depends=("jre${_majorver}-jetbrains=${pkgver}-${pkgrel}" 'java-environment-common=3' 'hicolor-icon-theme' 'libelf' 'glibc' 'gcc-libs')
provides=("java-environment=${_majorver}" "java-environment-jetbrains=${_majorver}" "jdk${_majorver}-jetbrains=${pkgver}-${pkgrel}")
conflicts=("jdk11-jetbrains")
_pkgname="jdk11-jetbrains"
diff --git a/idea.patch b/idea.patch
new file mode 100644
index 000000000000..518d3fbf5457
--- /dev/null
+++ b/idea.patch
@@ -0,0 +1,425 @@
+diff --git a/src/java.desktop/share/classes/java/awt/Container.java b/src/java.desktop/share/classes/java/awt/Container.java
+index 1a6163eb4..88f3b8d04 100644
+--- a/src/java.desktop/share/classes/java/awt/Container.java
++++ b/src/java.desktop/share/classes/java/awt/Container.java
+@@ -678,6 +678,10 @@ public class Container extends Component {
+ }
+ }
+
++ public ComponentPeer getPeer(){
++ return peer;
++ }
++
+ /**
+ * 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 d64fa0272..ccf7dceca 100644
+--- a/src/java.desktop/share/classes/javax/swing/JTextArea.java
++++ b/src/java.desktop/share/classes/javax/swing/JTextArea.java
+@@ -547,7 +547,10 @@ public class JTextArea extends JTextComponent {
+ }
+ return rowHeight;
+ }
+-
++
++ public FontMetrics getFontMetrics() {
++ return getFontMetrics(getFont());
++ }
+ /**
+ * 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 b8e3ffe06..3bfe3cae1 100644
+--- a/src/java.desktop/share/classes/javax/swing/JTextField.java
++++ b/src/java.desktop/share/classes/javax/swing/JTextField.java
+@@ -409,7 +409,11 @@ public class JTextField extends JTextComponent implements SwingConstants {
+ }
+ return columnWidth;
+ }
+-
++
++ public FontMetrics getFontMetrics() {
++ return getFontMetrics(getFont());
++ }
++
+ /**
+ * Returns the preferred size <code>Dimensions</code> needed for this
+ * <code>TextField</code>. 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 ad9d71be7..3d437ae8a 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;
+ import java.awt.AWTEvent;
+ import java.awt.AWTKeyStroke;
+ import java.awt.Component;
++import java.awt.Cursor;
+ import java.awt.EventQueue;
+ import java.awt.Frame;
+ import java.awt.Rectangle;
+@@ -39,6 +40,7 @@ import java.awt.event.FocusEvent;
+ import java.awt.event.InputEvent;
+ import java.awt.event.InputMethodEvent;
+ import java.awt.event.KeyEvent;
++import java.awt.event.MouseEvent;
+ import java.awt.event.WindowEvent;
+ import java.awt.event.WindowListener;
+ import java.awt.im.InputMethodRequests;
+@@ -54,6 +56,7 @@ import java.util.prefs.BackingStoreException;
+ import java.util.prefs.Preferences;
+ import sun.util.logging.PlatformLogger;
+ import sun.awt.SunToolkit;
++import sun.awt.X11InputMethod;
+
+ /**
+ * This InputContext class contains parts of the implementation of
+@@ -249,13 +252,26 @@ public class InputContext extends java.awt.im.InputContext
+ focusLost((Component) event.getSource(), ((FocusEvent) event).isTemporary());
+ break;
+
++ case MouseEvent.MOUSE_RELEASED:
++ if(checkTextCursor((Component)event.getSource())) {
++ // focusGained((Component) event.getSource());
++ transCaretPositionToXIM((Component)event.getSource());
++ break;
++ }
++
+ case KeyEvent.KEY_PRESSED:
+- if (checkInputMethodSelectionKey((KeyEvent)event)) {
++ if (event instanceof KeyEvent && checkInputMethodSelectionKey((KeyEvent)event)) {
+ // pop up the input method selection menu
+ InputMethodManager.getInstance().notifyChangeRequestByHotKey((Component)event.getSource());
+ break;
+ }
+
++ case KeyEvent.KEY_RELEASED:
++ if (event instanceof KeyEvent && checkDirectionKey((KeyEvent)event)) {
++ transCaretPositionToXIM((Component) event.getSource());
++ break;
++ }
++
+ // fall through
+
+ default:
+@@ -359,7 +375,65 @@ public class InputContext extends java.awt.im.InputContext
+ }
+ }
+ }
+-
++ /**
++ * fix fcitx position
++ */
++ private void transCaretPositionToXIM(Component source) {
++ synchronized (source.getTreeLock()) {
++ synchronized (this) {
++ if ("sun.awt.im.CompositionArea".equals(source.getClass().getName())) {
++ // no special handling for this one
++ } else if (getComponentWindow(source) instanceof InputMethodWindow) {
++ // no special handling for this one either
++ } else {
++ if (!source.isDisplayable()) {
++ // Component is being disposed
++ return;
++ }
++ currentClientComponent = source;
++ }
++ awtFocussedComponent = source;
++ if (inputMethod != null && inputMethod instanceof X11InputMethod) {
++ ((X11InputMethod)inputMethod).setXICTextCursorPosition(source);
++ }
++ InputMethodContext inputContext = ((InputMethodContext)this);
++ if (!inputContext.isCompositionAreaVisible()) {
++ InputMethodRequests req = source.getInputMethodRequests();
++ if (req != null && inputContext.useBelowTheSpotInput()) {
++ inputContext.setCompositionAreaUndecorated(true);
++ } else {
++ inputContext.setCompositionAreaUndecorated(false);
++ }
++ }
++ // restores the composition area if it was set to invisible
++ // when focus got lost
++ if (compositionAreaHidden == true) {
++ ((InputMethodContext)this).setCompositionAreaVisible(true);
++ compositionAreaHidden = false;
++ }
++
++ }
++ }
++ }
++ /**
++ * fix fcitx position
++ */
++ private boolean checkDirectionKey(KeyEvent event) {
++ // if (event.getKeyCode() >= 37 && event.getKeyCode() <=40) {
++ // return true;
++ // } else {
++ // return false;
++ // }
++ return true;
++ }
++ /**
++ * fix fcitx position
++ */
++ private boolean checkTextCursor(Component source) {
++ if(source.getCursor().getType()==Cursor.TEXT_CURSOR)
++ return true;
++ return false;
++ }
+ /**
+ * 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 07c1334b8..01d5910de 100644
+--- a/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java
++++ b/src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java
+@@ -28,15 +28,27 @@ package sun.awt.X11;
+ import java.awt.AWTException;
+ import java.awt.Component;
+ import java.awt.Container;
++import java.awt.geom.Point2D;
++import java.awt.FontMetrics;
++import java.awt.Point;
+ import java.awt.Rectangle;
+ import java.awt.im.spi.InputMethodContext;
+ import java.awt.peer.ComponentPeer;
+
++import java.lang.reflect.Field;
++import java.lang.reflect.InvocationTargetException;
++import java.lang.reflect.Method;
++
++import javax.swing.JTextArea;
++import javax.swing.JTextField;
++import javax.swing.text.JTextComponent;
++
+ import sun.awt.AWTAccessor;
+ import sun.awt.X11InputMethod;
+
+ import sun.util.logging.PlatformLogger;
+
++
+ /**
+ * Input Method Adapter for XIM (without Motif)
+ *
+@@ -83,8 +95,20 @@ public class XInputMethod extends X11InputMethod {
+ return 0;
+ return releaseXICNative(pData);
+ }
+-
++
++
+ private static volatile long xicFocus = 0;
++
++ public void setXICTextCursorOffXY(ComponentPeer peer) {
++
++ if (peer == null) {
++ return;
++ }
++ xicFocus = ((XComponentPeer)peer).getContentWindow();
++ int[] result = getOffXYRelateToFrame(peer ,true);
++ setXICFocusNative(((XComponentPeer)peer).getContentWindow(),true,true,result);
++ // setXICTextCursorOffXYNative(((XComponentPeer)peer).getContentWindow(),result);
++ }
+
+ protected void setXICFocus(ComponentPeer peer,
+ boolean value, boolean active) {
+@@ -92,9 +116,11 @@ public class XInputMethod extends X11InputMethod {
+ return;
+ }
+ xicFocus = ((XComponentPeer)peer).getContentWindow();
++ int[] result = getOffXYRelateToFrame(peer ,value);
+ setXICFocusNative(((XComponentPeer)peer).getContentWindow(),
+ value,
+- active);
++ active,
++ result);
+ }
+
+ public static long getXICFocus() {
+@@ -156,6 +182,71 @@ public class XInputMethod extends X11InputMethod {
+ return peer.getContentWindow();
+ }
+
++ protected int[] getOffXYRelateToFrame(ComponentPeer peer, boolean value) {
++ int[] result = null;
++ if(value && this.awtFocussedComponent!=null && this.awtFocussedComponent instanceof JTextComponent){
++ try {
++ Method method_getFontMetrics = null;
++ Method method_getEditor = null;
++ FontMetrics font_metrics = null;
++ Object editor = null;
++ int font_height = 0;
++ int caret_x = 0;
++ int caret_y = 0;
++ if(this.awtFocussedComponent instanceof JTextArea || this.awtFocussedComponent instanceof JTextField){
++ method_getFontMetrics = this.awtFocussedComponent.getClass().getMethod("getFontMetrics");
++ font_metrics = (FontMetrics)method_getFontMetrics.invoke(this.awtFocussedComponent);
++ font_height = font_metrics.getHeight();
++ JTextComponent jc = (JTextComponent)this.awtFocussedComponent;
++ if( jc.getCaret().getMagicCaretPosition() != null) {
++ caret_x = jc.getCaret().getMagicCaretPosition().x;
++ caret_y = jc.getCaret().getMagicCaretPosition().y;
++ }
++ }else {
++ method_getEditor = this.awtFocussedComponent.getClass().getMethod("getEditor");
++
++ editor = method_getEditor.invoke(this.awtFocussedComponent);
++
++ method_getFontMetrics = editor.getClass().getMethod("getFontMetrics",int.class);
++ font_metrics = (FontMetrics)method_getFontMetrics.invoke(editor, 0);
++ font_height = font_metrics.getHeight();
++ Method getCaretLocations = editor.getClass().getMethod("getCaretLocations", boolean.class);
++ Object[] locations = (Object[])getCaretLocations.invoke(editor, false);
++ Field point = locations[0].getClass().getField("myPoint");
++ Point2D pd = (Point2D)point.get(locations[0]);
++ caret_x = (int)pd.getX();
++ caret_y = (int)pd.getY();
++ }
++
++
++ Method method_getLocationOnScreen = this.awtFocussedComponent.getClass().getMethod("getLocationOnScreen");
++
++ Point point = (Point)method_getLocationOnScreen.invoke(this.awtFocussedComponent);
++
++ Method method_getNativeContainer = Component.class.getDeclaredMethod("getNativeContainer");
++ method_getNativeContainer.setAccessible(true);
++ Container c = (Container)method_getNativeContainer.invoke(awtFocussedComponent);
++ if(c!=null)
++ result = new int[]{point.x - c.getPeer().getLocationOnScreen().x + caret_x, point.y - c.getPeer().getLocationOnScreen().y + font_height + caret_y};
++
++ return result;
++ } catch (IllegalAccessException e) {
++ e.printStackTrace();
++ } catch (IllegalArgumentException e) {
++ e.printStackTrace();
++ } catch (InvocationTargetException e) {
++ e.printStackTrace();
++ } catch (NoSuchMethodException e) {
++ e.printStackTrace();
++ } catch (SecurityException e) {
++ e.printStackTrace();
++ } catch(NoSuchFieldException e) {
++ e.printStackTrace();
++ }
++ }
++ return result;
++ }
++
+ /*
+ * Native methods
+ */
+@@ -164,6 +255,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,
+- boolean value, boolean active);
++ boolean value, boolean active, int[] offxy);
+ 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 d9c45ed97..834164ad8 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;
+ import java.awt.event.InputMethodEvent;
+ import java.awt.font.TextAttribute;
+ import java.awt.font.TextHitInfo;
++import java.awt.Component;
+ import java.awt.peer.ComponentPeer;
+ import java.text.AttributedString;
+ import java.util.Map;
+@@ -56,6 +57,10 @@ public abstract class X11InputMethod extends X11InputMethodBase {
+ public X11InputMethod() throws AWTException {
+ super();
+ }
++ /**
++ * fix fcitx position
++ */
++ public abstract void setXICTextCursorOffXY(ComponentPeer peer);
+
+ /**
+ * Reset the composition state to the current composition state.
+@@ -380,6 +385,30 @@ public abstract class X11InputMethod extends X11InputMethodBase {
+ }
+ }
+
++ /**
++ * fix fcitx position
++ */
++ public synchronized void setXICTextCursorPosition(Component component){
++ if (component == null) {
++ return;
++ }
++ if (isActive) {
++ // deactivate/activate are being suppressed during a focus change -
++ // this may happen when an input method window is made visible
++ // boolean ac = haveActiveClient(); already set true in awt_InputMethod.c
++ setXICTextCursorOffXY(getPeer(awtFocussedComponent));
++
++ }
++ awtFocussedComponent = component;
++ // ComponentPeer lastXICFocussedComponentPeer = null;
++ // if (lastXICFocussedComponent != null) {
++ // lastXICFocussedComponentPeer = getPeer(lastXICFocussedComponent);
++ // }
++ ComponentPeer awtFocussedComponentPeer = getPeer(awtFocussedComponent);
++ if(awtFocussedComponent !=null )
++ setXICTextCursorOffXY(awtFocussedComponentPeer);
++ }
++
+ protected abstract boolean recreateXIC(int ctxid);
+ 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 847c44b52..c619d3773 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
+@@ -436,13 +436,17 @@ setXICFocus(XIC ic, unsigned short req)
+ * Sets the focus window to the given XIC.
+ */
+ static void
+-setXICWindowFocus(XIC ic, Window w)
++setXICWindowFocus(XIC ic, Window w, int arr[2])
+ {
+ if (ic == NULL) {
+ (void)fprintf(stderr, "Couldn't find X Input Context\n");
+ return;
+ }
+- (void) XSetICValues(ic, XNFocusWindow, w, NULL);
++ XPoint spot;
++ spot.x = arr[0];
++ spot.y = arr[1];
++ XVaNestedList xy = (XVaNestedList)XVaCreateNestedList(0, XNSpotLocation, &spot, NULL);
++ (void) XSetICValues(ic, XNFocusWindow, w, XNPreeditAttributes, xy, NULL);
+ }
+
+ /*
+@@ -1468,7 +1472,8 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
+ jobject this,
+ jlong w,
+ jboolean req,
+- jboolean active)
++ jboolean active,
++ jintArray arr)
+ {
+ X11InputMethodData *pX11IMData;
+ AWT_LOCK();
+@@ -1489,7 +1494,17 @@ Java_sun_awt_X11_XInputMethod_setXICFocusNative(JNIEnv *env,
+ * On Solaris2.6, setXICWindowFocus() has to be invoked
+ * before setting focus.
+ */
+- setXICWindowFocus(pX11IMData->current_ic, w);
++ int positions[2] = {100,50};
++ if (arr)
++ {
++ int length = (*env)->GetArrayLength(env,arr);
++ int *addArr = (*env)->GetIntArrayElements(env, arr, NULL);
++ for (int i= 0; i < length; ++i) {
++ positions[i] = *(addArr + i);
++ }
++ (*env)->ReleaseIntArrayElements(env, arr, addArr, 0);
++ }
++ setXICWindowFocus(pX11IMData->current_ic, w, positions);
+ setXICFocus(pX11IMData->current_ic, req);
+ currentX11InputMethodInstance = pX11IMData->x11inputmethod;
+ currentFocusWindow = w;