HiDPI

来自 Arch Linux 中文维基

这篇文章或章节的翻译不反映原文。

原因:Not in sync with the English page, some sections are untranslated.(在 Talk:HiDPI# 中讨论)

HiDPI(High Dots Per Inch)显示器,指的是在较小尺寸下却拥有较高分辨率的显示器。Apple 将其称作“视网膜屏幕”,这项技术主要存在于高端笔记本电脑和显示器中。

并非所有的软件都在高分辨率屏幕下工作良好。此页列出了一些常见的调整方法,让您更好的使用 HiDPI 显示器。

桌面环境[编辑 | 编辑源代码]

GNOME[编辑 | 编辑源代码]

可在设置 > 设备 > 显示 > 缩放 中设置合理的数值。也可以使用 gsettings 进行设置:

$ gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "[{'Gdk/WindowScalingFactor', <2>}]"
$ gsettings set org.gnome.desktop.interface scaling-factor 2
注意: scaling-factor仅能设置为整数。1 = 100%,2 = 200%,依此类推。非整数倍缩放请见下。

非整数倍缩放[编辑 | 编辑源代码]

在某些设备(例如小平板电脑)上使用 scaling-factor设置整数倍缩放的效果可能并不理想。wayland 和 Xorg 均支持非整数倍缩放,但步骤不同:

Wayland[编辑 | 编辑源代码]

启用实验性的非整数倍缩放功能:

$ gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"

之后再次打开 设置 > 设备 > 显示。如果没有立即生效,请尝试重启。

注意: 使用 Xwayland 的旧程序,因为渲染方法不同,在非 100% 缩放下都可能出现字体模糊的问题。

如要为所有用户启用,需创建如下三个文件:

/etc/dconf/profile/user
user-db:user
system-db:local
/etc/dconf/db/local.d/00-hidpi
[org/gnome/mutter]
experimental-features=['scale-monitor-framebuffer']
/etc/dconf/db/locks/hidpi
/org/gnome/mutter/experimental-features

运行dconf update并重启系统。这将永久锁定选项。

Xorg[编辑 | 编辑源代码]

您可以同时使用 scaling-factorxrandr 来实现任意的非整数倍缩放。这可以使 TTF 字体被正确缩放,防止出现单独使用 xrandr 时出现的模糊现象。您可以使用 gsettings 来指定放大系数,并用 xrandr 指定缩小系数。

首先使将缩放设为“UI看起来太大”的最小值。通常 2 已经足够大,如果不够大就继续尝试 3 以及更大的数。之后使用 xrandr 设置缩小系数。首先获取相关的输出名称,下面的例子将使用 eDP1 。先试着将缩小系数设为1.25,如果 UI 看起来仍然太大,则增大缩放系数。反之则缩小缩放系数。

$ xrandr --output eDP1 --scale 1.25x1.25
注意: 如果你的鼠标光标移动范围和屏幕显示并不匹配,你可能需要同时使用 --panning。参阅#Side display

可考虑使用autorandr让设置在重启时保持不变。参考这个网页获取更多信息。

本文内容或本节内容已经过期。

原因: 需要GNOME用户验证是否仍然需要重新编译。 (在Talk:HiDPI讨论)

在GNOME设置守护进程中的xsettings插件中,DPI设置是硬编码的。这将忽略Xorg的设置。这里有一篇重编译 Gnome Settings Daemon[失效链接 2022-09-18 ⓘ]的博客文章。在文档中还介绍了另一种方法来设置 xsettings 的DPI:

你可以使用dconf编辑器转到这个键值:

/org/gnome/settings-daemon/plugins/xsettings/overrides

加入这个条目:

'Xft/DPI': <153600>

来自 README.xsettings

注意必须使用这种方式指定(使用<>)。

上述DPI数值的单位是1024分之一英寸。

字体缩放[编辑 | 编辑源代码]

可以另外设置字体缩放。在 Gnome Tweak 中的字体 > 缩放,或者也可使用 gsettings。字体缩放倍率不需要是整数。

$ gsettings set org.gnome.desktop.interface text-scaling-factor 1.5

Xorg 下的 GTK+ 和 Gnome 外壳元素[编辑 | 编辑源代码]

在老版本的 Gnome 中(3.35 以前),Gnome 外壳 UI 元素中的字体缩放可能需要以单独编辑界面 CSS 文件的方式单独设置。文件是 /usr/share/themes/你的主题/gnome-shell/gnome-shell.css。单独设置其中所有的”font-size“属性,使其与缩放后的 UI 大小一致。设置完后,切换到另一个主题,再切换回来。

如果需要更改窗口标题栏的字体大小,可以使用 dconf 编辑器。(org > gnome > desktop > wm > preferences :: titlebar-font)这同时需要关闭title-bar-uses-system-fonts选项。 或者也可使用 gsettings:

$ gsettings set org.gnome.desktop.wm.preferences titlebar-font 'Cantarell Bold 22' ## 具体内容依需求更改
$ gsettings set org.gnome.desktop.wm.preferences titlebar-uses-system-font false

KDE[编辑 | 编辑源代码]

您可以使用KDE的设置来微调字体、图标和部件缩放,这些改动会同时影响 Qt 和 GTK+ 程序。

要调整整体缩放:

  1. 系统设置显卡与显示器显示器配置缩放率
  2. 将滑块调整至适合的位置
  3. 重新启动以使设置生效

要仅调整字体缩放:

  1. 系统设置外观字体
  2. 勾选“固定字体DPI”并调整DPI的值。调整之后重新启动应用程序即可生效。要在整个桌面上生效,您需要注销之后重新登录。

要仅调整图标缩放:

  1. 系统设置外观图标配置图标大小
  2. 为每一项选择合适的图标大小,更改将会立即生效。

非整数倍缩放下的Bug[编辑 | 编辑源代码]

当您使用非整数倍的缩放比例时,这可能导致一些 Qt 应用程序的字体渲染出现问题(例如 okular)。

有一个办法可以绕过这个问题:

  1. 将缩放比例设为1
  2. 用上面的方法调整字体和图标缩放(这会影响所有的应用程序,且不会导致字体问题)
  3. 重新启动KDE
  4. 如果需要缩放 GTK 程序,设置环境变量GDK_SCALE/GDK_DPI_SCALE(参见下文)。

托盘图标不缩放[编辑 | 编辑源代码]

在 Xorg 环境下,托盘图标不会跟随整体缩放。Plasma 默认会忽略 Qt 设置。要让 Plasma 使用 Qt 设置,要么使用 Wayland,要么将 PLASMA_USE_QT_SCALING 设为1;但对于多台不同 DPI 显示器混用的环境,这会让 UI 显示变得更糟糕。也可以将底栏高度设置为原来的两倍以缩放底栏和底栏内的应用程序图标,此时右键菜单内的图标等其他元素将不会缩放。

Xfce[编辑 | 编辑源代码]

打开设置管理器外观字体,修改 DPI 的值。在 HiDPI 显示器上,通常可以设为180或者192。要获得更精确的数字,可以使用xdpyinfo | grep resolution,使用输出DPI两倍的值。

要增大托盘图标,右键点击托盘的空白处,选择属性,将最大图标大小设置为32,48或者64。

Cinnamon[编辑 | 编辑源代码]

应当开箱即用。

Enlightenment[编辑 | 编辑源代码]

对于E18,首先打开设置面板,在 外观缩放 中,你可以调整缩放倍数。在MBPr 15 上,你可以选择1.2。

X Server[编辑 | 编辑源代码]

某些程序使用 X Server 所提供的 DPI 值。比如 i3 (来源) 和 Chromium(来源)。

本文或本章节的事实准确性存在争议。

原因: Xorg always sets dpi to 96. See this, this and finally this.(在 Talk:HiDPI 中讨论)


要验证 X Server 是否正确检测到了您的显示器的DPI,使用 xorg-xdpyinfo 中的 xdpyinfo 工具。

$ xdpyinfo | grep -B 2 resolution
screen #0:
  dimensions:    3200x1800 pixels (423x238 millimeters)
  resolution:    192x192 dots per inch

这个例子中 X Server 检测到的屏幕尺寸并不准确(423mm x 328mm,实际上Dell XPS 9530的屏幕尺寸是346mm x 194mm),但报告的 DPI 是96的整数倍。通常这往往比正确的DPI更好,可以保证字体渲染正确。

如果 xdpyinfo 显示的DPI不正确,参阅Xorg#Display size and DPI了解如何修复。

X Resources[编辑 | 编辑源代码]

如果你没有使用一个桌面环境,比如 KDE,Xfce,或是没有一个为您操作 Xorg 设置的程序,你可以通过在 Xresources 中的 Xft.dpi 变量手动修改DPI设置。

~/.Xresources
Xft.dpi: 180
Xft.autohint: 0
Xft.lcdfilter:  lcddefault
Xft.hintstyle:  hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

确保设置在X启动时已经被载入。例如在~/.xinitrc中使用xrdb -merge ~/.Xresources。有关详细信息,请参阅 Xresources

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

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

GUI toolkits[编辑 | 编辑源代码]

Qt 5[编辑 | 编辑源代码]

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

export QT_AUTO_SCREEN_SCALE_FACTOR=1

如果自动检测的 DPI 并不理想,你也可以按屏幕(QT_SCREEN_SCALE_FACTORS)或全局(QT_SCALE_FACTOR)手动设置缩放,有关详细信息,请参阅 Qt 博客文章

注意:
  • 如果您手动设置了缩放,则需要设置QT_AUTO_SCREEN_SCALE_FACTOR=0。否则某些明确启用 HiDPI 支持的程序会被缩放两次。
  • QT_SCALE_FACTOR缩放字体,但QT_SCREEN_SCALE_FACTORS并不会。
  • 如果您还在xrdb中手动设置过DPI以支持其他toolkits,同时使用QT_SCALE_FACTORS会使字体过大。
  • 如果您有多个不同DPI的屏幕,即 #Side display,您可能需要设置QT_SCREEN_SCALE_FACTORS="2;2"

GDK 3 (GTK+ 3)[编辑 | 编辑源代码]

要将UI缩放为两倍大小:

export GDK_SCALE=2

并同时不影响字体:

export GDK_DPI_SCALE=0.5

GTK+ 2[编辑 | 编辑源代码]

GTK+ 2本身并不支持缩放UI。但您可以使用 themix-full-gitAUR 创建预缩放过的主题。

Elementary (EFL)[编辑 | 编辑源代码]

要将缩放倍数设为1.5:

 export ELM_SCALE=1.5

更多信息请查看 https://phab.enlightenment.org/w/elementary/

引导程序[编辑 | 编辑源代码]

GRUB[编辑 | 编辑源代码]

降低帧缓冲分辨率[编辑 | 编辑源代码]

参见GRUB/Tips and tricks#Setting the framebuffer resolution

改变GRUB字体大小[编辑 | 编辑源代码]

/usr/share/fonts/中找一个你喜欢的字体。

使用GRUB工具转换:

# grub-mkfont -s 30 -o /boot/grubfont.pf2 /usr/share/fonts/FontFamily/FontName.ttf
注意: -s 30是字体大小。

编辑/etc/default/grub来设置字体。参见GRUB/Tips and tricks#Background image and bitmap fonts:

GRUB_FONT="/boot/grubfont.pf2"

使用grub-mkconfig -o /boot/grub/grub.cfg重新生成 GRUB 配置。

应用程序[编辑 | 编辑源代码]

浏览器[编辑 | 编辑源代码]

Firefox[编辑 | 编辑源代码]

Firefox 应到使用 #GDK 3 (GTK+ 3) 的设置。但是,建议的 GDK_SCALE 可能会使 Firefox 界面的缩放并不一致,并且不能使用小数.你可以使用GDK_DPI_SCALE来代替。

要覆盖这些设置,请打开 Firefox 的高级选项页面(about:config)并将 layout.css.devPixelsPerPx 设置为 2(或是其它需要的数值),但这个选项也可能导致 Firefox 界面的缩放不一致。如果 Firefox 没有缩放字体,您可能需要创建 userChrome.css 并添加适当的样式。有关 userChrome.css,请访问mozillaZine

~/.mozilla/firefox/<profile>/chrome/userChrome.css
@namespace url("https://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

/* #tabbrowser-tabs, #navigator-toolbox, menuitem, menu, ... */
* {
    font-size: 15px !important;
}

/* exception for badge on adblocker */
.toolbarbutton-badge {
    font-size: 8px !important;
}
警告: 下面的扩展不支持 Firefox Quantum (57版本及以上)。

如果你将 HiDPI 显示器与另一台显示器一起使用,你可以使用 AutoHiDPI 来自动调整。另外,从 Firefox 49 以来,它会自动根据您的屏幕分辨率调整缩放,从而更容易处理多个屏幕的情况。

Chromium / Google Chrome[编辑 | 编辑源代码]

Chromium 应当使用#GDK 3 (GTK+ 3)设置。

要覆盖这一选项,请使用--force-device-scale-factor flags。这将缩放所有内容。例如:chromium --force-device-scale-factor=2

当此选项设为1时将会采用正常缩放,此选项也可以使用小数。要永久应用此更改,对于Chromium,可以将其添加到~/.config/chromium-flags.conf

~/.config/chromium-flags.conf
--force-device-scale-factor=2

对于Chrome,使用 ~/.config/chrome-flags.conf

如果你将 HiDPI 显示器与另一台显示器一起使用,你可以使用 reszoom 扩展。这个扩展将会根据所在屏幕自动调整缩放。

Opera[编辑 | 编辑源代码]

Opera 应当使用 #GDK 3 (GTK+ 3) 设置。

要覆盖这一选项,请使用 --alt-high-dpi-setting=X 命令行选项。其中 X 是所需的 DPI。例如,使用 --alt-high-dpi-setting=144 Opera 将认为 DPI 是 144。在较新版本中,Opera 将使用字体DPI(在 KDE 中可以强制设置字体 DPI)。

Thunderbird[编辑 | 编辑源代码]

参见#Firefox。要访问 about:config,打开 首选项高级配置编辑器

Wine程序[编辑 | 编辑源代码]

运行

$ winecfg

并且更改显示选项卡中的 DPI。这仅影响字体大小。

Skype[编辑 | 编辑源代码]

Skype for Linux (skypeforlinux-stable-binAUR) 使用 #GDK 3 (GTK+ 3)

Spotify[编辑 | 编辑源代码]

您可以简单的使用 Ctrl++Ctrl+- 来调整缩放。使用 Ctrl+0 来恢复默认缩放。缩放设置保存在~/.config/spotify/Users/YOUR-SPOTIFY-USER-NAME/prefs,您可能需要自行创建该设置文件:

~/.config/spotify/Users/YOUR-SPOTIFY-USER-NAME/prefs
app.browser.zoom-level=100

Spotify 也可以使用自定义的缩放启动。这个系数和~/.config/spotify/Users/YOUR-SPOTIFY-USER-NAME/prefs中的系数相乘的积是实际的缩放倍数。

$ spotify --force-device-scale-factor=1.5

Zathura 文档查看器[编辑 | 编辑源代码]

文档缩放应当开箱即用。

UI缩放可以在配置文件中设置 (注意 "font" 是一个girara option):

set font "monospace normal 20"

Sublime Text 4[编辑 | 编辑源代码]

Sublime Text 4 完整支持显示缩放。在 首选项设置 中添加 "ui_scale": 2.0

IntelliJ IDEA[编辑 | 编辑源代码]

IntelliJ IDEA 15 及以上应有对 HiDPI 的支持,[1] 如果这不能工作最简便的解决办法可能是覆盖默认的字体设置:

File -> Settings -> Behaviour & Appearance -> Appearance

14版本中将 -Dhidpi=true 添加到 $HOME/.IdeaC14//usr/share/intelligj-idea-ultimate-edition/bin/ 的方法应该不再需要了。

NetBeans[编辑 | 编辑源代码]

NetBeans 可以在启动时用--fontsize选项设置字体大小。要要使此设置永久生效,编辑/usr/share/netbeans/etc/netbeans.conf,添加--fontsizenetbeans_default_options[2]

编辑器字体大小可以在 Tools → Option → Fonts & Color 中设置。

输出窗口的字体大小可以在Tools → Options → Miscelaneous → Output中控制。

Gimp 2.8[编辑 | 编辑源代码]

使用 HiDPI主题,或是更改现有主题的 gtkrc。(Change all occurrences of the size button to dialog,例如GimpToolPalette::tool-icon-size。)

另外也有 gimp-hidpi

Steam[编辑 | 编辑源代码]

官方 HiDPI支持[编辑 | 编辑源代码]

  • 从2018年1月25日开始,测试版本已经支持HiDPI并能自动启用。
  • Steam设置界面勾选 "按照显示器大小放大图标和文本(需要重启)"
  • 如果自动检测并不能正确工作,使用GDK_SCALE=2来指定缩放级别。
  • 如果以上不工作,使用steam -forcedesktopscaling 2或者设置STEAM_FORCE_DESKTOPUI_SCALING=2.0[3]在2023年6月UI大改动之后,该参数还支持分数缩放级别,例如1.25

非官方[编辑 | 编辑源代码]

使用 HiDPI-Steam-Skin 可以增大字体大小,虽然并不完美,但至少能用。

注意: 皮肤的 README 列出了皮肤应当放置的位置。正确的位置下面应该有一个叫 skins_readme.txt的文件。

MetroSkin Unofficial Patch 也可以使用。

Java 程序[编辑 | 编辑源代码]

可以通过设置 sun.java2d.uiScale 来缩放使用 AWT/Swing 框架的 Java 程序。例如:

java -Dsun.java2d.uiScale=2 -jar some_application.jar

从 Java 9 开始,GDK_SCALE 也可以缩放 Swing 程序。

Mono 程序[编辑 | 编辑源代码]

根据 [4],Mono 程序应像 GTK3 程序一样缩放。

MATLAB[编辑 | 编辑源代码]

MATLAB 的近期版本(R2017b)可以设置缩放:

>> s = settings;s.matlab.desktop.DisplayScaleFactor
>> s.matlab.desktop.DisplayScaleFactor.PersonalValue = 2

此设置将在重启 Matlab 后生效。

VirtualBox[编辑 | 编辑源代码]

注意: 仅适用于启用了缩放的 KDE。

VirtualBox 按照系统的缩放级别缩放虚拟监视器,从而降低虚拟机的最大分辨率(参见[5])。

可以单独缩小 VirtualBox 来绕过这个问题:

$ QT_SCALE_FACTOR=0.5 VirtualBox --startvm vm-name

Zoom[编辑 | 编辑源代码]

可以指定QT_SCALE_FACTOR来启动 Zoom:

$ QT_SCALE_FACTOR=2 zoom

不支持的程序[编辑 | 编辑源代码]

run_scaled-gitAUR 可以缩放应用程序(内部使用xpra)。

另一个办法是使每个程序在各自的 VNC 桌面上运行。要缩放 VNC 查看器,使用vncdesk-gitAUR。你可以为每个程序设置单独的桌面,使用简单的命令启动客户端和服务端,例如vncdesk 2

x11vnc 有一个实验性的选项 -appshare,可以为每个窗口单独打开一个 VNC 查看器。也许我们可以在上面做些文章。

多显示器[编辑 | 编辑源代码]

HIDPI 将会对整个桌面生效,所以如果你同时使用普通显示器,那么在普通显示器上元素会变得过于巨大。但是Wayland 已经支持为每个显示器设置单独的缩放。

Side display[编辑 | 编辑源代码]

本文内容或本节内容已经过期。

原因: The bug with the mouse unable to reach the whole screen should be fixed in xorg 1.20. (在Talk:HiDPI讨论)

One workaround is to use xrandr's scale option. To have a non-HiDPI monitor (on DP1) right of an internal HiDPI display (eDP1), one could run:

xrandr --output eDP-1 --auto --output DP-1 --auto --scale 2x2 --right-of eDP-1

When extending above the internal display, you may see part of the internal display on the external monitor. In that case, specify the position manually, e.g. using this script.

You may run into problems with your mouse not being able to reach the whole screen. That is a known bug with an xserver-org patch (or try the panning option, but that might cause other problems).

An example of the panning syntax for a 4k laptop with an external 1920x1080 monitor to the right:

xrandr --output eDP-1 --auto --output HDMI-1 --auto --panning 3840x2160+3840+0 --scale 2x2 --right-of eDP-1

Generically if your HiDPI monitor is AxB pixels and your regular monitor is CxD and you are scaling by [ExF], the commandline for right-of is:

xrandr --output eDP-1 --auto --output HDMI-1 --auto --panning [C*E]x[D*F]+[A]+0 --scale [E]x[F] --right-of eDP-1

If panning is not a solution for you it may be better to set position of monitors and fix manually the total display screen.

An example of the syntax for a 2560x1440 WQHD 210 DPI laptop monitor (eDP1) using native resolution placed below a 1920x1080 FHD 96 DPI external monitor (HDMI) scaled to match global DPI settings:

xrandr --output eDP-1 --auto --pos 0x1458 --output HDMI-1 --scale 1.35x1.35 --auto --pos 0x0 --fb 2592x2898

The total screen size (--fb) and positioning (--pos) are to be calculated taking into account the scaling factor.

In this case laptop monitor (eDP1) has no scaling and uses native mode for resolution so it will total 2560x1440, but external monitor (HDMI) is scaled and it has to be considered a larger screen so (1920*1.35)x(1080*1.35) from where the eDP1 Y position came 1080*1.35=1458 and the total screen size: since one on top of the other X=(greater between eDP1 and HDMI, so 1920*1.35=2592) and Y=(sum of the calculated heights of eDP1 and HDMI, so 1440+(1080*1.35)=2898).

Generically if your hidpi monitor is AxB pixels and your regular monitor is CxD and you are scaling by [ExF] and hidpi is placed below regular one, the commandline for right-of is:

xrandr --output eDP-1 --auto --pos 0x(DxF) --output HDMI-1 --auto --scale [E]x[F] --pos 0x0 --fb [greater between A and (C*E)]x[B+(D*F)]

You may adjust the "sharpness" parameter on your monitor settings to adjust the blur level introduced with scaling.

注意: Above solution with --scale 2x2 does not work on some Nvidia cards. No solution is currently available. [6] A potential workaround exists with configuring ForceFullCompositionPipeline=On on the CurrentMetaMode via nvidia-settings. For more info see [7].

多外部监视器[编辑 | 编辑源代码]

如果你有多于个低于内置的 HiDPI 显示器 DPI 的显示器,那么可能会碰到一些问题。这种情况下您可以想要缩小 HiDPI 显示器的内容,例如:

xrandr --output eDP1 --scale 0.5x0.5 --output DP2 --right-of eDP1 --output HDMI1 --right-of DP2

另外,当您缩小内置 HIDPI 显示器中的内容时,内置显示器的字体可能会变得有些模糊。但这与扩大外置显示器内容时带来的模糊并不相同。您可以对比之后选择自己想要的方案。

镜像[编辑 | 编辑源代码]

如果你只想使用镜像的话,可以按照如下操作:

A×B是你 HiDPI 显示器的原生分辨率,CxD 是你的另一个显示器的原生分辨率。

xrandr --output HDMI --scale [A/C]x[B/D]

一个 QHD 的例子(3200/1920 = 1.66 and 1800/1200 = 1.5):

xrandr --output HDMI --scale 1.66x1.5

UHD和1080p的例子 (3840/1920=2 2160/1080=2):

xrandr --output HDMI --scale 2x2

您可以调整显示器上的清晰度选项以减少模糊感。

Linux 控制台[编辑 | 编辑源代码]

默认的 Linux 控制台在 HiDPI 显示器上太小了。kbd中最大的字体是latarcyrheb-sun32,其他软件包中包含一些更大的字体,例如terminus-font中的ter-132nter-132b(粗体)。参阅Linux console#Fonts获取配置详情。

在改变字体之后,当您切换到其他控制台时,屏幕上的内容可能无法读取。要修复这一问题,你可以设置force specific mode,例如video=2560x1600@60(设为您显示器的原生分辨率)并重新启动。

另请参阅[编辑 | 编辑源代码]