wsl2-解决高分辨率屏的模糊问题

上一级页面:wsl2配置使用gui

前言

修复高分辨率屏的模糊问题

为 X server 可执行文件启用高 DPI 设置。

在Windows端,可以通过设置x server的启动参数来启动高DPI设置,

关闭该X server的任何正在运行的实例。

打开您安装X server的文件夹,X server的实现非常多,例如VcxSrvXmingX410等。

在这里,我选择VcxSrv作为例子。打开vcxsrv安装文件夹,

右键单击vcxsrv.exe

选择“属性”–>“兼容性”选项卡–>更改高 DPI 设置–>启用覆盖高 DPI 缩放–>更改为“应用程序”(或“系统增强”选项)。

更改如下:

Pasted%20image%2020221121214536.png

同理,右键单击xlaunch.exe,进行相同的设置。

选择“属性”–>“兼容性”选项卡–>更改高 DPI 设置–>启用覆盖高 DPI 缩放–>更改为“应用程序”(或“系统增强”选项)。

打开注册表编辑器regedit

进入HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

分别更改两个字符串值,更改如下图:

Pasted%20image%2020221121214625.png

1
2
3
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"path\\to\\xlaunch.exe"="~ HIGHDPIAWARE"
"path\\to\\vcxsrv.exe"="~ HIGHDPIAWARE"

wsl端设置x11的DPI,以修复高分辨率模糊问题

参考HiDPI (简体中文) - ArchWiki (archlinux.org)

wsl端设置X11环境参数,修复高分辨率屏的模糊问题

如果你没有使用一个桌面环境,比如 KDE,Xfce,或是没有一个为您操作 Xorg 设置的程序,

你可以通过在 Xresources 中的 Xft.dpi 变量手动修改DPI设置。

具体过程如下:

x-org自动获取DPI

首先xorg会自动获取dpi,

  • 注意,这里x org想要正确获得你的显示器信息,需要先按照上一小节的设置,在Windows端,为 X server 可执行文件启用高 DPI 设置。
1
xdpyinfo | grep -B 2 resolution

dots per inch就是dpi,这里PPI可以看作DPI

1
2
3
screen #0:
dimensions: 1920x1080 pixels (339x191 millimeters)
resolution: 144x144 dots per inch

这里的1920x1080就是自动获取的分辨率,如果按照前文教程,正确设置x server,这里就能够正确获取到电脑的分辨率。

给出的输出可能不准,x org自动计算出的结果为144

获取主机的实际DPI

可以通过The Best Notebooks with the Best Displays - NotebookCheck.net Reviews获取你电脑的DPI

或者通过计算器可以计算:如何获取电脑的dpi-ppi

我通过上面文章的链接,计算得出我的DPI数值为157.35

按照Windows的推荐设置,可以取100125150175……

157.35150最近,所以结果为150

HiDPI 显示器的推荐DPI

在 HiDPI 显示器上,通常可以设为180或者192

最终结果

建议把前文的144,150,180,192挨个试一遍,保留你想要的结果。

具体配置过程见wsl2-x11-环境变量配置

结果如下:

1
2
3
4
5
6
7
Xft.dpi: 144
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

此外还需要确保设置在X client启动时,~/.Xresources能够被载入,

不能使用xinit,wsl端没有xinit。。因为xinitx server自带的组件。而x server运行在windows端,(与之相对的,x client运行在wsl端)

我们可以手动载入Xresources

配置文件见wsl2-x11-环境变量配置

概括来说,在类似于~/.zshrc的配置文件中,填写下面的设置:

1
2
3
4
5
# xterm/dpi设置
if [ -f $MY_CONF/.Xresources ]; then
   xrdb -merge -I$HOME $MY_CONF/.Xresources
fi

$MY_CONF是自己设置的一个环境变量,指向自己存放.Xresources的目录。

Xresources通常会让大多数地方的字体大小正确,但这并不会影响图标大小。

注:在设置Xft.dpi的同时,设置 GUI toolkit 缩放(例如下文提及的GDK_SCALE),可能导致某些程序界面元素过大(例如firefox)。

更多详细信息,请参阅 Xresources

设置字体的抗锯齿等功能

设置好默认字体,并且设置字体的antialiasinghinting两个参数,

可以通过font-manager或者gnome-tweak等应用程序来设置,

gnome-tweak:

v2-564d562dd65458d4dbfee125a6b6c568_b.jpg

font-manager

Pasted image 20220608111725

更多详细内容见linux-如何添加字体

设置目标DPI

前文最终计算结果为dpi: 144

所以这一节,将字体的目标DPI(target dpi)设置为144

可以通过font-manager或者gnome-tweak等应用程序来设置,

Pasted%20image%2020221121221655.png

覆盖应用程序的默认环境设置

这些GTK+参数和QT6参数,应当由应用程序开发者指定,用户不应手动覆盖和调整它们。建议跳过。

覆盖 X11 环境的 GTK+ 设置。

这篇文章深入介绍了GDK环境变量。

这里有官方文档:HiDPI (简体中文) - ArchWiki (archlinux.org)

  • GDK_SCALE将按特定因素缩放窗口
  • GDK_DPI_SCALE将缩放 DPI 以用于缩放感知应用程序。**
  1. GDK_SCALE=0.5要将UI缩放为0.5倍大小:

  2. GDK_SCALE=1要将UI缩放为1倍大小:

  3. GDK_DPI_SCALE * GDK_SCALE表示字体的缩放倍数

例如:0.5 * 2 = 1表示字体缩放为1倍大小

1
2
GDK_SCALE=2
GDK_DPI_SCALE=0.5

具体配置过程见wsl2-x11-环境变量配置

类似于下面的设置:

1
2
export GDK_SCALE=2
export GDK_DPI_SCALE=0.5

QT5配置

自从 Qt 5.6 开始,Qt 5 应用程序可以遵守屏幕DPI。设置环境变量QT_AUTO_SCREEN_SCALE_FACTOR=1以启用这项功能。

但你也可以按屏幕(QT_SCREEN_SCALE_FACTORS)或全局(QT_SCALE_FACTOR)手动设置缩放,有关详细信息,请参阅:

具体配置过程见wsl2-x11-环境变量配置

类似于下面的设置:

1
export QT_AUTO_SCREEN_SCALE_FACTOR=1

现在重启你的 X server和 X11 程序(直接重启PC系统)

参考、引用、致谢

What should/shouldn’t go in .zshenv, .zshrc, .zlogin, .zprofile, .zlogout?

zsh的环境变量的加载.zprofile .zlogin .zshrc .zshenv – Vincent Blog (xsudo.com)