Skip to content

高分屏下 x11 缩放问题 #1356

Description

@jingzhudezhong

Treeland XWayland HiDPI 问题反馈与改进建议

反馈日期: 2026-08-31
环境: Deepin 25 / treeland (Wayland) / 4K 屏 3840x2160 / 输出缩放 200% (Scale: 2.0)


一、问题现象

  • 屏幕为 4K (3840x2160),treeland 输出缩放为 200%(wlr-randr 显示 Scale: 2.000000)。
  • 原生 Wayland 应用显示正常(正确适配 200%)。
  • 但 通过 XWayland 运行的 X11 应用 出现两种问题:
    1. 界面被放大 2 倍且模糊:XWayland 上报给应用的 DPI 仍是 96(xdpyinfo 显示 resolution: 96x96 dots per inch),应用以为自己在 100% 缩放下渲染,但 treeland 又对 XWayland 表面整体放大 2 倍,导致界面被"二次放大",字号、控件尺寸远超预期,且因低分辨率拉伸而模糊。
    2. 个别应用通过手动注入 --force-device-scale-factor=2 / Xft.dpi=192 才能恢复清晰(如 Electron 版 QQ),说明问题出在 XWayland 的 DPI 上报环节。

二、根因分析

  • XWayland 在 treeland 下 没有将输出缩放比例 (Scale=2.0) 同步到 X11 客户端的 DPI 信息。
  • X11 客户端通过 xdpyinfo / XSETTINGS 读取到的仍是 96 DPI(物理分辨率 3840x2160 对应的标准 DPI),因此:
    • DPI 感知型应用(GTK3/GTK4、Qt5/Qt6、Electron/Chromium)默认按 100% 渲染;
    • treeland 合成器又把 XWayland 表面放大 2 倍呈现 → 最终视觉效果 = 200% 放大 + 模糊。
  • 对比 KWin / GNOME Mutter 等成熟合成器:当输出 scale=2 时,XWayland 会向 X11 客户端上报 DPI=192 / 逻辑分辨率=1920x1080,让应用自行按 200% 渲染,合成器再以 1:1 呈现 → 清晰且尺寸正确。

三、建议的改进方案(按优先级)

方案 A(推荐,根治):XWayland DPI 跟随输出缩放

  • 在 treeland 合成 XWayland 时,把当前输出的 scale 同步为 X11 的 Xft.dpi / XSETTINGS Xft/DPI(即 96 × scale)。
  • 具体做法:
    • 在 XWayland 启动或输出 scale 变化时,通过 xsettingsd / XSETTINGS 广播 Xft/DPI = 96 * scale;
    • 同时更新根窗口的 RESOURCE_MANAGER 中的 Xft.dpi;
    • 这样所有 DPI 感知型 X11 应用无需任何手动配置即可自动清晰适配。

方案 B:提供"XWayland 缩放"独立配置项

  • 在 org.deepin.dde.treeland 或 org.deepin.dde.treeland.output 的 DSG 配置中,新增一个可选项,如 xwaylandScaleMode:
    • auto(跟随输出缩放,默认,即方案 A);
    • off(XWayland 保持 1:1,适合希望 X11 应用物理像素 1:1 的场景);
    • 手动指定 DPI。
  • 这样用户可在控制中心 → 显示设置中,直观地为"X11 应用"单独控制缩放,而无需逐个应用打补丁。

方案 C(兜底):提供官方建议的全局注入手段

  • 若暂无法在合成器层实现,至少提供官方支持的全局注入方式,例如:
    • 官方文档说明如何通过 ~/.config/xsettingsd/xsettingsd.conf + ~/.Xresources 设置 Xft.dpi=192、Gdk/WindowScalingFactor=2;
    • 或提供一个 dde-xipport-hidpi 之类的系统级守护进程,在会话启动时自动注入。

四、当前的临时解决方法(已在本机验证有效)

由于 treeland 暂未内置上述能力,本机通过以下方式临时修复:

  1. xsettingsd 注入 HiDPI(覆盖 GTK/Qt 应用):
    • 配置文件 /home/lai/.config/xsettingsd/xsettingsd.conf 设置:
      • Xft/DPI 192
      • Gdk/WindowScalingFactor 2
      • Gdk/UnscaledDPI 98304
  2. Xresources 注入(覆盖 Chromium/Electron 等读取 Xft.dpi 的应用):
    • /home/lai/.Xresources 设置 Xft.dpi: 192
  3. Electron 类应用 必要时追加 --force-device-scale-factor=2(如 linglong 版 QQ)。
  4. 通过 ~/.config/autostart/xsettingsd-hidpi.desktop 实现登录自启。

验证结果:GTK 测试窗口逻辑 960x540 → X11 上报 1920x1080 → 物理屏幕实测约 1920 物理像素,恰好 2 倍、无双重缩放、清晰。

五、期待

希望 treeland 后续版本能内置方案 A/B,让 Deepin 的 Wayland 环境在 4K/高分屏下对 X11 应用的开箱体验达到 KWin/GNOME 同等水平。如需要我配合测试补丁或提供更多复现信息,请通过本文件附带的联系方式联系。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions