背景

某台 Arch Linux 桌面系统使用 KDE Plasma 6,显示会话为 X11,登录管理器为 SDDM,桌面缩放设置为 150%。系统使用 Breeze 主题,光标、图标、颜色主题也都保持 Breeze 系列,以保证视觉风格一致。

问题出现在开机后的 SDDM 登录界面:登录前的界面没有按照预期进行缩放,文字显得很小,但鼠标指针又显得偏大。进入 KDE 桌面之后,应用界面和字体整体看起来正常,但经过进一步观察发现,桌面里的鼠标指针反而偏小。也就是说,问题并不是单纯的“SDDM 没有缩放”,而是登录界面、桌面会话、光标大小、字体 DPI 之间没有完全统一。

本次排查的目标是:

1. 找出 SDDM 登录界面文字过小的原因;
2. 让 SDDM 登录界面与 KDE 桌面的缩放比例协调;
3. 让登录界面和桌面里的鼠标指针大小一致;
4. 总结未来硬件迁移到 100%、125%、150% 等不同缩放比例设备时需要调整的地方。

一、现象描述

系统设置中,KDE Plasma 桌面缩放比例为 150%。进入桌面后,大部分 Qt/KDE 应用显示正常。

但是开机后的 SDDM 登录界面出现以下现象:

1. 用户名、密码框、按钮文字明显偏小;
2. 鼠标指针看起来很大;
3. 鼠标指针在登录界面和登录后的桌面中观感不一致;
4. 点击 KDE 系统设置中的“应用 Plasma 设置”后,登录界面没有明显变化。

最初容易误判为 SDDM 完全没有继承 KDE 的 150% 缩放。但后续检查发现,问题更细:SDDM 的底层 X11 DPI 已经是 144,也就是 150%,只是 SDDM greeter 没有完整吃到 Qt 字体 DPI 环境;同时 KDE 桌面的鼠标光标大小仍是默认 24,没有按 150% 放大。


二、基础环境

排查环境可以概括为:

发行版:Arch Linux
桌面环境:KDE Plasma 6
会话类型:X11
登录管理器:SDDM
SDDM greeter:sddm-greeter-qt6
SDDM 主题:breeze
桌面缩放:150%
屏幕类型:高 DPI 内置屏
主题体系:Breeze

确认会话类型:

echo "XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
echo "XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP"
echo "KDE_SESSION_VERSION=$KDE_SESSION_VERSION"

典型输出:

XDG_SESSION_TYPE=x11
XDG_CURRENT_DESKTOP=KDE
KDE_SESSION_VERSION=6

确认当前显示管理器:

readlink -f /etc/systemd/system/display-manager.service
systemctl status sddm.service --no-pager -l

如果指向 sddm.service,说明当前登录管理器确认为 SDDM。


三、第一次误判:以为 SDDM 没有拿到 Plasma 设置

KDE 系统设置中提供了一个按钮:

系统设置 → 外观/颜色与主题 → 登录界面 SDDM → 应用 Plasma 设置

点击后,系统会把部分 Plasma 外观、显示、字体相关配置同步给 SDDM 用户。同步后可以看到类似目录和文件:

/var/lib/sddm/.config/kdeglobals
/var/lib/sddm/.config/kcminputrc
/var/lib/sddm/.config/kwinoutputconfig.json
/var/lib/sddm/.config/plasmarc

检查命令:

sudo ls -la /var/lib/sddm/.config

sudo grep -nE 'ScaleFactor|ScreenScaleFactors|font=|menuFont=|activeFont=' \
  /var/lib/sddm/.config/kdeglobals

sudo python -m json.tool /var/lib/sddm/.config/kwinoutputconfig.json

同步后可以看到:

ScaleFactor=1.5
ScreenScaleFactors=...1.5...

kwinoutputconfig.json 中也能找到当前高 DPI 屏幕对应的 scale: 1.5 条目。

但是,重启后 SDDM 登录界面没有变化。由此可以判断:

“应用 Plasma 设置”确实生成了 SDDM 用户配置;
但这些配置没有完全解决当前 X11 SDDM greeter 的实际缩放问题。

因此不能只停留在“Plasma 设置是否复制过去”这一层,还要继续检查 SDDM greeter 实际启动时拿到了哪些 DPI 和环境变量。


四、确认 SDDM X11 DPI 已经是 144

进一步检查 SDDM 日志:

sudo journalctl -b -u sddm.service --no-pager -n 500 \
  | grep -iE 'dpi|scale|hidpi|qt|qml|theme|cursor|font|greeter|x11|xorg|wayland|error|warn'

关键输出类似:

Running: /usr/bin/X -dpi 144 ...
Loading theme configuration from "/usr/share/sddm/themes/breeze/theme.conf"
Starting X11 session: ... /usr/bin/sddm-greeter-qt6 --theme /usr/share/sddm/themes/breeze

再检查 Xorg 日志:

sudo grep -iE 'dpi|dimension|DisplaySize|resolution|screen|monitor|EDID|3840|2160|font|cursor' \
  /var/log/Xorg.0.log | tail -n 120

关键结果:

Output eDP using initial mode 3840x2160
DPI set to (144, 144)

这说明 SDDM 登录界面阶段的 Xorg 已经使用:

-dpi 144

而 144 DPI 对应的正是:

96 × 1.5 = 144

所以问题不是 Xorg DPI 没有生效,也不是屏幕分辨率识别错误。


五、真正差异:SDDM greeter 缺少 Qt 字体 DPI 环境

桌面会话中检查缩放相关环境变量:

env | grep -E '^(QT_|KDE_|GDK_|XCURSOR_|XFT_|PLASMA_)' | sort
xrdb -query | grep -iE 'Xft.dpi|Xcursor'

KDE 桌面中可以看到:

QT_SCREEN_SCALE_FACTORS=eDP=1.5;...
Xft.dpi: 144

而 SDDM 默认配置中:

sudo grep -RInE 'GreeterEnvironment|QT_SCALE_FACTOR|QT_SCREEN_SCALE_FACTORS|QT_FONT_DPI' \
  /etc/sddm.conf /etc/sddm.conf.d/*.conf /usr/lib/sddm/sddm.conf.d/*.conf 2>/dev/null

可以看到默认状态下:

GreeterEnvironment=

也就是说,SDDM greeter 没有显式拿到 Qt 字体 DPI 环境。

这里需要注意一个陷阱:不能直接给 SDDM 设置 QT_SCALE_FACTOR=1.5。因为底层 Xorg 已经是 -dpi 144,也就是 150%。如果再叠加:

GreeterEnvironment=QT_SCALE_FACTOR=1.5,QT_FONT_DPI=144

视觉效果可能接近:

1.5 × 1.5 = 2.25

也就是 225%,登录界面会变得非常巨大。

实际验证也表明,直接使用 QT_SCALE_FACTOR=1.5 会导致 SDDM 登录界面过大,不协调。

正确方向是只补 Qt 字体 DPI:

[General]
GreeterEnvironment=QT_FONT_DPI=144

这样不会额外叠乘整体界面缩放,而是让 Qt greeter 明确使用 144 DPI 的字体渲染。


六、SDDM 本地覆盖配置

不建议修改这些软件包自带文件:

/usr/lib/sddm/sddm.conf.d/default.conf
/usr/share/sddm/themes/breeze/theme.conf
/usr/share/sddm/themes/breeze/Main.qml

这些文件属于软件包管理范围,系统更新时可能被覆盖,也不便于长期维护。

推荐使用本地管理员覆盖文件:

/etc/sddm.conf.d/90-local-greeter-hidpi.conf

这个目录本来就是 SDDM 本地配置覆盖目录,属于比较干净、可回退、可迁移的做法。

当前 150% 环境下,最终建议配置为:

[General]
GreeterEnvironment=QT_FONT_DPI=144

[Theme]
CursorTheme=breeze_cursors
CursorSize=36

[X11]
ServerArguments=-dpi 144

其中:

QT_FONT_DPI=144       用于修正 SDDM greeter 字体 DPI
CursorTheme=breeze_cursors
CursorSize=36         用于固定登录界面光标大小
ServerArguments=-dpi 144
                     用于保证 SDDM X11 层 DPI 是 144

写入命令:

sudo tee /etc/sddm.conf.d/90-local-greeter-hidpi.conf >/dev/null <<'EOF'
[General]
GreeterEnvironment=QT_FONT_DPI=144

[Theme]
CursorTheme=breeze_cursors
CursorSize=36

[X11]
ServerArguments=-dpi 144
EOF

cat /etc/sddm.conf.d/90-local-greeter-hidpi.conf

如果当前系统中 /etc/sddm.conf.d/kde_settings.conf 已经有:

[X11]
ServerArguments=-dpi 144

也可以暂时不重复写入 [X11] 段。但为了未来硬件迁移时集中管理 DPI,建议把 [X11] 也放进 90-local-greeter-hidpi.conf,让这个文件成为最终覆盖点。

修改后重启:

systemctl reboot

七、第二个问题:KDE 桌面光标原来没有按 150% 放大

SDDM 登录界面修正后,登录界面显示变得协调,但进入 KDE 桌面后,反而发现桌面鼠标指针偏小。

检查桌面光标:

echo "XCURSOR_THEME=$XCURSOR_THEME"
echo "XCURSOR_SIZE=$XCURSOR_SIZE"

kreadconfig6 --file kcminputrc --group Mouse --key cursorTheme
kreadconfig6 --file kcminputrc --group Mouse --key cursorSize

xrdb -query | grep -iE 'Xcursor|cursor'

初始状态中,桌面实际光标大小是:

Xcursor.size: 24
Xcursor.theme: breeze_cursors

这说明光标主题是 Breeze,但光标大小仍是默认 24。
在 150% 缩放下,合理值应为:

24 × 1.5 = 36

设置 KDE 桌面光标大小:

ts="$(date +%Y%m%d-%H%M%S)"
cp -a ~/.config/kcminputrc ~/.config/kcminputrc.$ts

kwriteconfig6 --file kcminputrc --group Mouse --key cursorTheme breeze_cursors
kwriteconfig6 --file kcminputrc --group Mouse --key cursorSize 36

kreadconfig6 --file kcminputrc --group Mouse --key cursorTheme
kreadconfig6 --file kcminputrc --group Mouse --key cursorSize

注销 KDE 会话后重新登录,再检查:

xrdb -query | grep -iE 'Xcursor|cursor'

理想结果:

Xcursor.theme: breeze_cursors
Xcursor.size: 36

至此,SDDM 登录界面和 KDE 桌面的鼠标指针大小都统一到 36。


八、GTK 程序也需要同步检查

KDE/Qt 显示正常,不代表 GTK 程序一定同步。需要检查:

~/.config/gtk-3.0/settings.ini
~/.config/gtk-4.0/settings.ini

检查命令:

grep -nE 'gtk-xft-dpi|gtk-cursor-theme-size|gtk-cursor-theme-name|gtk-theme-name' \
  ~/.config/gtk-3.0/settings.ini ~/.config/gtk-4.0/settings.ini

150% 下理想结果:

gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=36
gtk-xft-dpi=147456

这里的 147456 不是异常,而是 GTK 的 DPI 表示方式:

144 × 1024 = 147456

常见换算如下:

96  × 1024 = 98304
120 × 1024 = 122880
144 × 1024 = 147456
168 × 1024 = 172032
192 × 1024 = 196608

如果 GTK 设置中也显示 gtk-cursor-theme-size=36gtk-xft-dpi=147456,说明 GTK 程序与 KDE 桌面保持一致。


九、最终 150% 状态

修复后,整个系统应保持以下状态:

KDE 桌面:
ScaleFactor=1.5
ScreenScaleFactors=...1.5...
QT_SCREEN_SCALE_FACTORS=...1.5...
Xft.dpi=144
Xcursor.theme=breeze_cursors
Xcursor.size=36

KDE 光标配置:
cursorTheme=breeze_cursors
cursorSize=36

GTK:
gtk-xft-dpi=147456
gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=36

SDDM:
GreeterEnvironment=QT_FONT_DPI=144
CursorTheme=breeze_cursors
CursorSize=36
ServerArguments=-dpi 144

这套状态中没有使用 QT_SCALE_FACTOR=1.5,避免了重复叠乘。


十、完整审计命令

以后系统更新、迁移硬件或发现显示比例异常时,可以直接执行以下只读审计命令:

echo "===== session ====="
echo "XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
echo "XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP"
echo "KDE_SESSION_VERSION=$KDE_SESSION_VERSION"

echo
echo "===== env ====="
env | grep -E '^(QT_|KDE_|GDK_|XCURSOR_|XFT_|PLASMA_)' | sort || true

echo
echo "===== xrdb ====="
xrdb -query 2>/dev/null | grep -iE 'Xft.dpi|Xcursor|dpi|cursor' || true

echo
echo "===== KDE scale/font ====="
grep -nE '^\[KScreen\]|ScaleFactor|ScreenScaleFactors|^\[Fonts\]|^font=|^menuFont=|^smallestReadableFont=|^toolBarFont=|^activeFont=' \
  ~/.config/kdeglobals 2>/dev/null || true

echo
echo "===== KDE cursor ====="
kreadconfig6 --file kcminputrc --group Mouse --key cursorTheme
kreadconfig6 --file kcminputrc --group Mouse --key cursorSize
grep -nE 'cursorTheme|cursorSize|Cursor|cursor' ~/.config/kcminputrc 2>/dev/null || true

echo
echo "===== GTK ====="
grep -nE 'gtk-xft-dpi|gtk-cursor-theme-size|gtk-cursor-theme-name|gtk-theme-name' \
  ~/.config/gtk-3.0/settings.ini ~/.config/gtk-4.0/settings.ini 2>/dev/null || true

echo
echo "===== SDDM ====="
sudo grep -RInE '^\[General\]|^\[Theme\]|^\[X11\]|GreeterEnvironment|QT_SCALE_FACTOR|QT_SCREEN_SCALE_FACTORS|QT_FONT_DPI|CursorTheme|CursorSize|Font=|ServerArguments|EnableHiDPI|Current=' \
  /etc/sddm.conf /etc/sddm.conf.d/*.conf /usr/lib/sddm/sddm.conf.d/*.conf 2>/dev/null || true

echo
echo "===== global override check ====="
for f in /etc/environment ~/.pam_environment ~/.profile ~/.bash_profile ~/.bashrc ~/.xprofile ~/.xinitrc ~/.config/plasma-workspace/env/*.sh; do
  [ -e "$f" ] || continue
  echo "--- $f ---"
  grep -nE 'QT_SCALE_FACTOR|QT_SCREEN_SCALE_FACTORS|QT_FONT_DPI|GDK_SCALE|GDK_DPI_SCALE|XCURSOR_SIZE|XCURSOR_THEME|Xft.dpi|Xcursor.size|PLASMA_USE_QT_SCALING' "$f" 2>/dev/null || true
done

重点关注是否存在这些危险项:

QT_SCALE_FACTOR=1.5
GDK_SCALE=2
GDK_DPI_SCALE=...
XCURSOR_SIZE=24

尤其是 QT_SCALE_FACTOR=1.5,在 Xorg 已经使用 -dpi 144 的情况下容易导致 225% 的过度放大。


十一、未来硬件迁移时的核心公式

如果将来把系统迁移到其他显示设备,不同设备可能适合 100%、125%、150%、175% 或 200% 缩放。

统一规则:

目标缩放比例 = S
字体 DPI = 96 × S
光标大小 = 24 × S
GTK DPI = 字体 DPI × 1024

常用表:

目标缩放字体 DPI光标大小GTK gtk-xft-dpi
100%962498304
125%12030122880
150%14436147456
175%16842172032
200%19248196608

十二、迁移到 100% 设备时

适用于普通 1080p 屏幕或低 DPI 屏幕。

KDE 桌面:

显示缩放:100%
Force font DPI:96
光标大小:24

KDE 光标命令:

kwriteconfig6 --file kcminputrc --group Mouse --key cursorTheme breeze_cursors
kwriteconfig6 --file kcminputrc --group Mouse --key cursorSize 24

SDDM 本地配置:

[General]
GreeterEnvironment=QT_FONT_DPI=96

[Theme]
CursorTheme=breeze_cursors
CursorSize=24

[X11]
ServerArguments=-dpi 96

GTK 理想值:

gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=24
gtk-xft-dpi=98304

十三、迁移到 125% 设备时

适用于部分 2K 屏幕或中等 DPI 屏幕。

KDE 桌面:

显示缩放:125%
Force font DPI:120
光标大小:30

KDE 光标命令:

kwriteconfig6 --file kcminputrc --group Mouse --key cursorTheme breeze_cursors
kwriteconfig6 --file kcminputrc --group Mouse --key cursorSize 30

SDDM 本地配置:

[General]
GreeterEnvironment=QT_FONT_DPI=120

[Theme]
CursorTheme=breeze_cursors
CursorSize=30

[X11]
ServerArguments=-dpi 120

GTK 理想值:

gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=30
gtk-xft-dpi=122880

十四、迁移到 150% 设备时

适用于 4K 高 DPI 屏幕。

KDE 桌面:

显示缩放:150%
Force font DPI:144
光标大小:36

KDE 光标命令:

kwriteconfig6 --file kcminputrc --group Mouse --key cursorTheme breeze_cursors
kwriteconfig6 --file kcminputrc --group Mouse --key cursorSize 36

SDDM 本地配置:

[General]
GreeterEnvironment=QT_FONT_DPI=144

[Theme]
CursorTheme=breeze_cursors
CursorSize=36

[X11]
ServerArguments=-dpi 144

GTK 理想值:

gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=36
gtk-xft-dpi=147456

十五、迁移后推荐操作顺序

迁移到新硬件后,不建议直接沿用旧设备的所有显示配置。推荐顺序如下:

1. 登录 KDE 后,先确认屏幕分辨率和物理观感;
2. 在 KDE 系统设置中设置合适的显示缩放比例;
3. 在字体设置中设置 Force font DPI;
4. 设置 KDE 光标大小;
5. 检查 GTK 的 DPI 和光标大小是否同步;
6. 修改 /etc/sddm.conf.d/90-local-greeter-hidpi.conf;
7. 点击一次“应用 Plasma 设置”同步 SDDM 外观;
8. 重启验证 SDDM 登录界面;
9. 执行完整审计命令确认所有值一致。

图形界面路径:

系统设置 → 显示器与监视器 → 缩放
系统设置 → 外观/颜色与主题 → 字体 → Force font DPI
系统设置 → 外观/颜色与主题 → 光标
系统设置 → 外观/颜色与主题 → 登录界面 SDDM → 应用 Plasma 设置

十六、关于旧显示器记录

~/.config/kwinoutputconfig.json/var/lib/sddm/.config/kwinoutputconfig.json 中可能存在多个旧设备、旧分辨率、旧 EDID 的记录。例如:

旧笔记本屏幕:1366x768 scale=1
外接或旧屏幕:1920x1080 scale=1.25
当前高 DPI 屏幕:3840x2160 scale=1.5

这些历史记录本身不一定是问题。只要当前实际使用的屏幕条目对应正确缩放,系统就可以正常工作。

如果迁移新硬件后显示明显异常,可以先备份相关文件,再让 KDE 重新生成显示配置:

ts="$(date +%Y%m%d-%H%M%S)"
cp -a ~/.config/kwinoutputconfig.json ~/.config/kwinoutputconfig.json.$ts 2>/dev/null || true
cp -a ~/.config/kscreen ~/.config/kscreen.$ts 2>/dev/null || true

不建议在不理解结构的情况下直接手动编辑 kwinoutputconfig.json


十七、不要修改软件包文件

不建议修改:

/usr/lib/sddm/sddm.conf.d/default.conf
/usr/share/sddm/themes/breeze/theme.conf
/usr/share/sddm/themes/breeze/Main.qml

原因:

1. 这些文件属于软件包管理范围;
2. 系统更新可能覆盖;
3. 后续排查时不容易区分本地设置和上游默认;
4. 修改主题文件会让问题更难维护。

推荐只使用:

/etc/sddm.conf.d/90-local-greeter-hidpi.conf
~/.config/kcminputrc
~/.config/kdeglobals
~/.config/gtk-3.0/settings.ini
~/.config/gtk-4.0/settings.ini

其中 SDDM 的本地覆盖文件是最适合长期维护登录界面 DPI 与光标大小的地方。


十八、总结

本次问题表面上是 SDDM 登录界面文字过小,实际涉及 KDE X11 高 DPI 缩放中的多个层级:

KDE Plasma 显示缩放
Xft.dpi
Qt 环境变量
KDE 光标大小
GTK DPI 和光标大小
SDDM greeter 字体 DPI
SDDM X11 DPI
SDDM 光标大小

最终结论是:

1. SDDM X11 层已经使用 -dpi 144;
2. “应用 Plasma 设置”虽然复制了配置,但没有完全解决 X11 greeter 字体 DPI 问题;
3. 给 SDDM greeter 设置 QT_FONT_DPI=144 后,登录界面字体比例恢复正常;
4. 不应使用 QT_SCALE_FACTOR=1.5,否则会和已有 DPI 叠乘导致界面过大;
5. KDE 桌面光标原本仍是 24,在 150% 缩放下应设置为 36;
6. GTK 也需要确认 gtk-xft-dpi 和 gtk-cursor-theme-size;
7. 登录界面和桌面最终应统一为 144 DPI、36 光标。

当前 150% 环境的推荐最终组合:

KDE ScaleFactor=1.5
Xft.dpi=144
Xcursor.size=36
GTK gtk-xft-dpi=147456
GTK gtk-cursor-theme-size=36
SDDM QT_FONT_DPI=144
SDDM CursorSize=36
SDDM ServerArguments=-dpi 144

未来迁移硬件时,只要按公式统一即可:

字体 DPI = 96 × 缩放比例
光标大小 = 24 × 缩放比例
GTK DPI = 字体 DPI × 1024

这比单纯依赖桌面环境自动同步更可靠,也更便于长期维护。

Leave a Reply

Your email address will not be published. Required fields are marked *