JetBrainsRuntime-for-Linux-x64 icon indicating copy to clipboard operation
JetBrainsRuntime-for-Linux-x64 copied to clipboard

关于高分辨率显示器下,开启缩放后输入法显示偏移问题的临时修改方案

Open szoyj opened this issue 2 years ago • 9 comments

本地环境 Ubuntu 22.04,搜狗输入法 4.0.1.2123,编辑器intellij idea ce 2022.1.3,笔记本屏幕分辨率2560*1600,缩放比例150%

修改方案 由于能力有限也没有时间精力去找遍整个jbr源码,暂时没有找到函数可以直接获得系统的设置的缩放值。所以,需要各位自己根据自身情况写死。

修改这两行,调整result就行了。 https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/blob/9f6927487ba1af70bbdfb0fcc1cb6078ef6565ad/idea.patch#L296-L297

修改后

if(c!=null){
    double scale = 2.0;
    result = new int[]{point.x - c.getPeer().getLocationOnScreen().x + caret_x, point.y - c.getPeer().getLocationOnScreen().y + font_height + caret_y};
    result[0] = (int)Math.round(result[0]*scale);
    result[1] = (int)Math.round(result[1]*scale);
    //print调试大法可以放这里
}

已知的问题

  1. 我本地系统缩放比例选择的是150%,但是scale值居然得写2,否则对不齐。
  2. x轴能对齐,y轴还是略微偏下,有强迫症的同学建议直接调整 result[1] 的值。

关于本地编译调试问题 1.编译参考 https://blog.csdn.net/qq_41929417/article/details/117171581 和 https://blog.csdn.net/joi_la/article/details/121998331 2.调试的话,先把编辑器安装目录下的jbr改名备份,再软链接到编译后的jdk目录(我这里是 ln -s xxxxx/JetBrainsRuntime/build/linux-x86_64-normal-server-release/jdk jbr),这样重新打开ide用的就是你编译的jbr了。 3.print调试大法,直接用下面这行,在我这里日志会输出到/home/xxxx/.cache/JetBrains/IdeaIC2022.1/log/idea.log里,直接tail -f就可以看了,每次在编辑器里鼠标点击或是按下键盘键就会有输出。

System.out.printf("%d %d %d %s %d %d %d %d %n", point.x, c.getPeer().getLocationOnScreen().x, caret_x, "=", point.y, c.getPeer().getLocationOnScreen().y, font_height, caret_y);

关于这行print里几个参数代表的含义,我推测point代表的是编辑器里editor控件的左上角坐标,c代表的是编辑器外框的左上角坐标,caret当然就是输入光标的位置了。 4. java代码修改后的重新编译,直接make images就行,几秒钟就编译好了,调试很方便。c代码make images无效,估计是修改后没有被编译工具检测到,我也没有深究,如果用make clean这样就很费时间了。

szoyj avatar Jul 01 '22 02:07 szoyj

idea.patch:25: trailing whitespace.
    
idea.patch:41: trailing whitespace.
    
idea.patch:45: trailing whitespace.
    
idea.patch:96: trailing whitespace.
        case KeyEvent.KEY_RELEASED:   
idea.patch:146: trailing whitespace.
                
error: corrupt patch at line 324

你好,请问一下这边报错怎么解决?

Bryan2333 avatar Jul 03 '22 02:07 Bryan2333

你是不是直接修改了patch?得先打patch再直接修改源码。不能直接修改patch的,patch里有行信息。

szoyj avatar Jul 04 '22 05:07 szoyj

@szoyj 在你的解决方案基础上,我简单修复了一下这个问题,可以下载试试会不会导致别的问题:Release 17.0.4.1-b469.62 · tangruize/JetBrainsRuntime-for-Linux-x64。没有什么问题的话再提一个pr.

修复方式:获取了X11的scale factor

private int scale = ((X11GraphicsDevice)GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()).getScaleFactor();

GDK的全局缩放factor(GDK_SCALE,org.gnome.desktop.interface/scaling-factor)只有整数才有效,字体缩放(GDK_DPI_SCALE)可以是浮点数,Xft.dpi (通过xrdb -q查看)除以96为dpi定义的缩放倍数。最后的缩放倍数为(int)Math.round(GDK_SCALE * GDK_DPI_SCALE * (Xft.dpi / 96)),所以你的缩放150%可能实际上大于2

参考了

  1. HiDPI configuration – IDEs Support (IntelliJ Platform) | JetBrains
  2. JetBrainsRuntime/X11GraphicsDevice.java at jbr-release-17.0.4.1b653.1 · JetBrains/JetBrainsRuntime

tangruize avatar Oct 29 '22 02:10 tangruize

能不能提供一个配置文件修改呢,这样就不用自己编译了

mygithub222225 avatar Nov 13 '22 08:11 mygithub222225

能不能提供一个配置文件修改呢,这样就不用自己编译了

mygithub222225 avatar Nov 13 '22 08:11 mygithub222225

编译过程中,打prehonor大佬的patch报错,尝试了多个版本: main :

$ git apply ../idea.patch

../idea.patch:25: trailing whitespace.
    
../idea.patch:41: trailing whitespace.
    
../idea.patch:45: trailing whitespace.
    
../idea.patch:96: trailing whitespace.
        case KeyEvent.KEY_RELEASED:   
../idea.patch:146: trailing whitespace.
                
error: patch failed: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java:83
error: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java: patch does not apply

master :

$ git apply ../idea.patch
../idea.patch:25: trailing whitespace.
    
../idea.patch:41: trailing whitespace.
    
../idea.patch:45: trailing whitespace.
    
../idea.patch:96: trailing whitespace.
        case KeyEvent.KEY_RELEASED:   
../idea.patch:146: trailing whitespace.
                
warning: squelched 9 whitespace errors
warning: 14 lines add whitespace errors.

RikudouPatrickstar大佬的patch也报错: main :

$ git apply ../idea_rikudou.patch
error: patch failed: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java:156
error: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java: patch does not apply

master :

$ git apply ../idea_rikudou.patch
error: patch failed: src/java.desktop/share/classes/java/awt/Container.java:25
error: src/java.desktop/share/classes/java/awt/Container.java: patch does not apply
error: patch failed: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java:86
error: src/java.desktop/unix/classes/sun/awt/X11/XInputMethod.java: patch does not apply

想请教一下咱们这边编译的版本和编译的流程是怎样的呢?

SunicYosen avatar Dec 13 '22 14:12 SunicYosen

我fork了 @tangruize 的分支,将JBR版本更新到了17.0.6, Markdown预览功能在这版本的JBR是正常的。有需要可以下载来用 jbr-release-17.0.8.1b1080.1

Bryan2333 avatar Apr 14 '23 12:04 Bryan2333

这个算法应该是对的 但是目前使用xwayland的情况下,GDK_SCALE 和 GDK_DPI_SCALE 环境变量不是必须的.而且现在也迁移到Xsettingsd了, Xft.dpi / 96 作为缩放倍数,两倍缩放下 一般的组合是 GDK_SCALE=2 GDK_DPI_SCALE=0.5,乘积也可以是1 应该是可以忽略了.

ihipop avatar May 08 '23 06:05 ihipop

我fork了 @tangruize 的分支,将JBR版本更新到了17.0.6, Markdown预览功能在这版本的JBR是正常的。有需要可以下载来用 jbr-release-17.0.6b829.9

这个很不错 唯一的问题就是终端光标更随的问题了 原来的候选框在左下角 现在因为终端不跟随 跑到是左上角 眼睛看的有点累.要是解决不了,不行就把终端的候选框还默认放回左下角 可能比较能接受.

ihipop avatar May 08 '23 06:05 ihipop