在 Windows 或 macOS 上使用 Rocket Exceed TurboX(ETX)访问 Linux/X11 应用时,经常会遇到几个看似相同、实则处于不同层次的参数:客户端操作系统缩放、Profile 的 Screen Size、Single Window 的根窗口分辨率、Xfce 字体 DPI,以及 ETX 的 High DPI resolution。
如果没有先区分这些层次,很容易出现字体过小、窗口尺寸不一致、模糊、重复放大,或者“在 Xfce 中调整 DPI 不生效,但在 ETX Profile 中设置 96、120、144 却有效”的现象。
本文基于 ETX 手册,以及 X.Org、Xfce、GTK、Microsoft 和 Apple 的技术资料,分析以下三种 Window Mode:
- Multiple Window + Native Window Manager;
- Multiple Window + X Window Manager;
- Single Window。Single 模式本质上由 X Window Manager 管理,不再单独提供 Native/X 选择。
本文讨论的是 Linux/UNIX X11 应用和 Xfce 桌面,不讨论 Windows Desktop - RDP 或 Windows Desktop - Direct 的远端 Windows DPI 机制。
一、先分清四层缩放
一条完整的显示链可以概括为:
1
2
3
4
5
远端 X 应用的布局和字体
-> X Server 的像素尺寸与逻辑 DPI
-> ETX Window Mode 的窗口或图像处理
-> Windows/macOS 的客户端缩放
-> 物理显示器
这四层可以同时存在,但作用完全不同。
| 参数 | 实际含义 | 主要影响 |
|---|---|---|
| Windows/macOS 显示缩放 | 本地操作系统逻辑坐标与物理像素的转换 | ETX 本地窗口、标题栏,以及必要时对 ETX 输出做整体放大 |
| ETX High DPI resolution | ETX Client 是否声明自己能够处理高 DPI | 开启时使用高分辨率绘制;关闭时允许操作系统对结果做兼容性放大 |
| Single Root window size | X 根窗口的像素宽度和高度 | 远端桌面工作区大小、应用可用像素和滚动范围 |
| Screen Size / Compute based on monitor DPI | 根据目标 DPI 计算 X Screen 对外报告的毫米尺寸 | 远端应用从像素数和毫米数推导出的逻辑 DPI |
| Xfce Custom DPI | xfsettingsd 通过 XSETTINGS/Xft 发布的字体 DPI 覆盖 |
主要影响 GTK、Xft、Pango 等支持该机制的应用 |
| ETX Fonts / Default font | 指定会话默认字体和字体数据库 | 不是全局字号或全局缩放开关 |
ETX 手册对 Fonts 页面的定义是设置默认文本字体、字体数据库、字体替换及 X Font Server,并没有把它定义为统一的字体大小调节器。ETX:Configuring Fonts settings
二、ETX Profile DPI 的技术原理
1. X11 同时报告像素尺寸和毫米尺寸
在 X11 中,一个 Screen 会同时向客户端报告:
- 宽度和高度的像素数;
- 宽度和高度的毫米数。
Xlib 分别通过 DisplayWidth、DisplayHeight、DisplayWidthMM 和 DisplayHeightMM 提供这些值。X.Org:Xlib Display Functions
应用或字体系统可以由此计算逻辑 DPI:
1
2
DPI = pixels * 25.4 / millimeters
millimeters = pixels * 25.4 / DPI
ETX 手册把以下三项放在 Screen -> Screen Size 下:
- Use local system settings;
- Specify in mm;
- Compute based on monitor DPI。
其中 Compute based on monitor DPI 明确要求输入 1 到 2000 之间的 DPI,由 ETX 根据该 DPI 计算 screen size。ETX:Configuring Screen settings
结合 X11 的像素/毫米模型,可以确定这个选项的作用是:根据目标 DPI 计算 X Screen 对外报告的毫米尺寸,而不是改变显示器的物理 PPI。
2. 96、120、144 分别代表什么
假设 X Screen 是 1920×1080:
| Profile DPI | 对外报告的约等于尺寸 | 相对 96 DPI | 12 pt 字体的理论像素高度 |
|---|---|---|---|
| 96 | 508×286 mm | 100% | 16 px |
| 120 | 406×229 mm | 125% | 20 px |
| 144 | 339×191 mm | 150% | 24 px |
| 192 | 254×143 mm | 200% | 32 px |
点字体到像素的近似换算为:
1
pixel size ~= point size * DPI / 72
GTK/GDK 文档同样说明,在 96 DPI 下,10 pt 字体约为 13.3 个绘图单位。GTK:Gdk.Screen.set_resolution
因此,ETX 中输入 120 或 144,通常应理解为设置远端应用的 125% 或 150% 逻辑 DPI,而不是声称显示器的真实像素密度就是 120 或 144 PPI。
三、Multiple Window + Native
ETX 手册对 Multiple Window 的定义是:不显示 ETX 根窗口,每个 X 应用显示在自己的应用窗口中,看起来像是在客户端本机运行。
选择 Native Window Manager 后:
- 窗口由 ETX Client 所在的 Windows 或 macOS 管理;
- 本地操作系统负责窗口位置、边框、最小化、最大化和焦点;
- ETX 手册说明 Native 可以减少网络流量;
- 手册同时警告,不应对依赖完整 X Window Manager 的桌面环境使用 Native,并以 CDE 为例。
详见 ETX:Configuring Multiple window mode。
其显示链为:
1
2
3
X 应用按照 X Server DPI 或 Xft DPI 生成内容
-> ETX 把每个 X 顶层窗口映射成本地窗口
-> Windows DWM 或 macOS WindowServer 显示窗口
Native 只替换了“谁管理顶层窗口”,并没有消除 X Server,也没有使 X 应用变成本地 Windows/macOS 应用。X 应用内部的按钮、菜单、字体和画布仍由远端应用按照 X11 和工具包规则生成。
推荐组合
对于单个发布的 X 应用,可以采用:
1
2
3
4
Window mode: Multiple
Window manager: Native
High DPI resolution: Enabled
Screen Size: Compute based on monitor DPI
Windows 端可先按以下关系配置:
| Windows 缩放 | 建议起始 Profile DPI |
|---|---|
| 100% | 96 |
| 125% | 120 |
| 150% | 144 |
| 200% | 192 |
如果应用完全不响应 Profile DPI,再调整应用自身的字体或工具包缩放。只有应用无法正确处理高 DPI 时,才考虑关闭 High DPI resolution,让本地操作系统进行兼容性放大。
四、Multiple Window + X
选择 X Window Manager 后,窗口由本地或远端 X Window Manager 管理。ETX 手册说明 X Window Manager 不会自动启动,必须通过应用启动命令、XDMCP 会话或主机命令显式启动;同一个 ETX 会话只能运行一个 Window Manager。ETX:Starting a window manager
这种模式适合:
xfwm4、GNOME、KDE 等 X 桌面环境;- 依赖 X11 Window Manager hints、工作区或远端窗口装饰的程序;
- 需要完整运行
xfce4-session、xfsettingsd和xfwm4的环境。
此时存在两种 DPI 来源:
1
2
3
4
5
ETX Profile DPI
-> X Server 的基础 DPI
Xfce Custom DPI
-> 通过 XSETTINGS/Xft 发布的字体 DPI 覆盖
比较稳妥的配置是:先用 Profile DPI 建立整个 X Display 的基础 DPI;只有确实需要对 GTK/Xft 应用做桌面级覆盖时,才启用 Xfce Custom DPI。
五、Single Window
Single Window 把所有 X 应用放进一个可见的 X 根窗口。ETX 手册明确说明,该模式中的窗口功能由本地或远端 X Window Manager 控制,所以它本质上属于 X Window Manager 模式,不再提供 Native/X 下拉选项。ETX:Selecting the window mode
Single 中需要分别配置“根窗口像素尺寸”和“本地窗口变化时的调整策略”。
1. Root window size
Fit window to screen:按所选显示器的工作区计算根窗口像素尺寸,不包含任务栏;Full screen:占满所选显示器,根窗口尺寸跟随显示器分辨率;Pre-defined:使用预定义像素尺寸;Custom:手工指定像素宽度和高度,最大 8192×8192。
2. Resizing policy
Fixed:X 根窗口尺寸在会话期间保持不变;本地窗口较小时使用滚动条;Dynamic:本地窗口变化时重新改变 X 根窗口尺寸,应用重新协商布局并重绘;Scaled:X 根窗口尺寸不变,只把已生成的会话内容整体放大或缩小。
ETX 手册特别指出,Dynamic 会让应用按照新的根窗口信息重新布局,不会产生 Scaled 模式可能出现的失真。ETX:Configuring Single window mode
常见组合如下:
| 使用目标 | Root window size | Resizing | DPI 建议 |
|---|---|---|---|
| 完整 Xfce 桌面,清晰优先 | Fit window to screen | Dynamic | 120 或 144 |
| CAD/EDA 固定画布 | Pre-defined 或 Custom | Fixed | 96、120,按应用测试 |
| 需要固定远端分辨率并临时缩放 | Pre-defined 或 Custom | Scaled | 保持固定,避免再叠加 OS 放大 |
| 不支持动态分辨率的旧程序 | Fit 或 Custom | Fixed | 优先用 Profile DPI 调整字体 |
Scaled 是图像级缩放。它不会通知远端应用屏幕发生变化,因此不应该作为日常增大字体的首选。
六、为什么 Multiple + Native 中调整 Xfce DPI可能不生效
首先需要纠正一个常见推论:DPI 并不是 Window Manager 的职责。
Xfce 的 Window Manager 是 xfwm4,负责窗口放置、装饰、移动、缩放和关闭。Xfce:xfwm4 Introduction
Xfce 字体和 DPI 则由另一个进程 xfsettingsd 管理。它通常由 Xfce Session Manager 启动,监听 xfconf,并通过 XSETTINGS 把字体、主题和 DPI 发布给应用。Xfce:xfsettingsd
Xfce 文档把 Custom DPI 明确定义为“覆盖 X Server 计算出的字体 DPI”。Xfce:Appearance / Fonts / DPI
所以,“Native Window Manager 会屏蔽 Xfce DPI”不是 ETX 手册或 X11 规范能够支持的结论。若现场只在 Native 下无效,通常应检查以下三类原因。
原因一:当前 DISPLAY 上没有运行 xfsettingsd
Multiple + Native 常用于启动一个或若干发布应用,而不是完整启动 xfce4-session。即使能够打开 Xfce 设置对话框,也不代表当前 DISPLAY 上存在正常持有 XSETTINGS selection 的 xfsettingsd。
原因二:目标应用不消费 XSETTINGS/Xft DPI
XSETTINGS 是跨工具包的桌面设置传播协议,但应用必须主动实现或通过工具包使用它。freedesktop.org:XSETTINGS specification
GTK 会从 XSettings manager 获取桌面级设置;没有 manager 时才读取自己的 settings.ini。GTK:GtkSettings
传统 Motif、Xt、Core X Font 应用,或者把控件和字号写死为像素的程序,不一定响应 Xfce 的 Xft/DPI。Profile DPI 改变的是 X Server 的基础像素/毫米关系,因此这些应用反而可能响应 Profile DPI。
原因三:调整的是 Xfce Display/RandR,而不是字体 DPI
客户端真实显示器属于 Windows 或 macOS。远端 Xfce 看到的是 ETX 提供的虚拟 X Screen,无法像控制本地 Linux 显卡那样直接控制 Windows/macOS 的物理输出。
因此,显示器选择、客户端高 DPI 和 X Screen 基础 DPI应由 ETX Profile 控制;Xfce Display 中的输出缩放或 RandR 设置未必能映射到客户端真实显示器。
为什么 Profile DPI 又能够生效
Profile 的 Compute based on monitor DPI 改变的是应用连接 X Display 时看到的基础 screen metric。没有有效 Xft/XSETTINGS 覆盖的应用会根据这组像素和毫米数据推导 DPI,所以 96、120、144 会直接产生差异。
更严谨的结论是:
Native 将顶层窗口管理权交给本地操作系统,但不会直接禁用 XSETTINGS。Native 场景中 Xfce DPI 无效,通常说明 Xfce 设置服务没有运行、没有连接到同一个 DISPLAY,或者目标应用不消费 XSETTINGS。ETX Profile DPI 因为位于 X Server 基础指标层,所以覆盖面更底层。
如果 xfsettingsd 正在同一个 DISPLAY 上运行,并且目标是正常消费 XSETTINGS 的 GTK 应用,那么 Xfce Custom DPI 理论上仍应生效,即使没有运行 xfwm4。
七、Windows High DPI 的组合原则
Microsoft 把 96 DPI 定义为 100% 的传统基准。DPI-unaware 应用按 96 DPI 绘制,在高缩放显示器上由 Windows 对最终位图进行拉伸;这样通常能够变大,但可能模糊。DPI-aware 应用则接收实际像素,并负责按照 DPI 重新布局和绘制。Microsoft:High DPI Desktop Application Development
这与 ETX 手册中的 High DPI resolution 说明一致:
- 开启:启用 ETX Client 的 DPI awareness;
- 关闭:对于不能处理 DPI 的 X 应用,允许显示结果被放大。
推荐顺序:
- 开启 High DPI resolution;
- 按 Windows 缩放从 Profile 96、120、144 中选择;
- 必要时调整应用自己的字体或 UI scale;
- 只有旧应用仍然过小时,才关闭 High DPI resolution,让 Windows 整体放大。
应避免同时使用 Windows 150%、关闭 High DPI resolution、Profile 144,以及 Single Scaled。这些缩放可能叠加,造成 UI 过大和图像模糊。
八、macOS Retina 的组合原则
macOS 使用逻辑 point 和 backing pixel。Retina 显示模式下 backing scale factor 通常为 2,但 Apple 特别说明,该值不是显示器的真实物理 DPI,也不应该直接作为布局或物理尺寸计算依据。Apple:High Resolution Explained
因此:
- 建议开启
High DPI resolution on MacOS,使用原生 backing resolution 绘制; - 不要因为 Retina 是 2× 就机械地把 Profile 设置为 192 DPI;
- Profile 96、120、144 应按希望获得的远端逻辑 UI 大小选择;
- 只有不支持高 DPI 的旧应用才考虑关闭该项,接受 macOS 的兼容性放大和清晰度损失。
Rocket 的 ETX 12.5.1 Release Notes 也把 Mac DPI awareness 描述为使用原生硬件分辨率,不再像旧行为那样把窗口内容放大到超过显示范围。Rocket:ETX 12.5.1 Release Notes
九、现场验证方法
ETX 手册明确说明,Advanced mode 中修改 Profile 不会应用到已经活动的会话。因此测试 96、120、144 时,应创建新会话,不能仅复用旧会话。ETX:Customizing profiles in Advanced mode
建议复制三个完全相同的 Profile,只修改 DPI。进入每个新会话后执行:
1
2
3
4
5
xdpyinfo | sed -n '/dimensions:/,/resolution:/p'
xrandr --current
pgrep -a xfsettingsd
xfconf-query -c xsettings -p /Xft/DPI
xrdb -query | grep -i 'Xft.dpi'
判读方式:
- Profile 从 96 改为 144 后,
xdpyinfo的毫米尺寸和 resolution 应相应变化; - 找不到
xfsettingsd,说明 Xfce DPI 设置传播链没有运行; /Xft/DPI已改变但目标应用不变,说明应用不支持该设置或只在启动时读取;- 新启动的 GTK 应用变化而旧应用不变,说明应用缓存了启动时的 DPI;
- Xfce Custom DPI 生效后,它可能覆盖 X Server 基础 DPI,此时再改 Profile DPI,GTK 字体未必继续变化。
十、最终配置建议
可以把配置选择归纳为以下原则:
| 场景 | 推荐配置 |
|---|---|
| 单个 X 应用与本地桌面融合 | Multiple + Native + High DPI ON + Profile 96/120/144 |
| 完整 Xfce 桌面 | 优先 Single,或者 Multiple + X,并确保 xfce4-session、xfsettingsd、xfwm4 正常运行 |
| 字体和 UI 太小 | 优先提高 Profile DPI或应用字号 |
| 固定 CAD/EDA 画布 | Single + Pre-defined/Custom + Fixed |
| 需要窗口变化时应用重新布局 | Single + Dynamic |
| 旧应用完全不支持 DPI | 最后才考虑 High DPI OFF 或 Single Scaled |
最关键的判断标准不是“数值越大越好”,而是先确定缩放发生在哪一层:
1
2
3
4
5
需要应用重新布局和清晰字体
-> 调整 Profile DPI、Xfce/应用字体或使用 Dynamic
只需要把已有图像整体变大
-> 使用 OS 兼容性放大或 Single Scaled
前者是 DPI-aware 的重新渲染,通常更清晰;后者是最终图像缩放,兼容性更好,但可能模糊。
参考资料
- ETX:Selecting the window mode
- ETX:Configuring Multiple window mode
- ETX:Configuring Single window mode
- ETX:Configuring Screen settings
- ETX:Configuring Fonts settings
- X.Org:Xlib
- Xfce:Appearance / Fonts / DPI
- Xfce:xfsettingsd
- freedesktop.org:XSETTINGS
- Microsoft:High DPI Desktop Application Development
- Apple:High Resolution Explained