在 HiDPI 显示器上使用 Linux 桌面环境时,鼠标光标的大小和图标主题有时并不会在所有阶段保持一致。尤其是在 KDE Plasma、SDDM 登录管理器、X11 会话共同存在的环境中,可能会出现这样的现象:
- 进入桌面后,鼠标光标大小正常;
- 登录界面中的光标较小;
- 开机后登录界面的光标图标与桌面不同;
- 输入密码并点击确认后,光标图标或大小突然发生变化。
本文记录一次针对特定 HiDPI 硬件环境的光标统一定制过程。设备信息已脱敏,仅保留与显示效果相关的参数。
环境背景
系统环境大致如下:
操作系统:Arch Linux
桌面环境:KDE Plasma
显示服务器:X11
登录管理器:SDDM
显示器:27 英寸
分辨率:3840×2160
DPI 设置:144
光标主题目标:breeze_cursors
目标光标大小:36
该显示器属于 4K HiDPI 场景。如果系统整体按约 150% 缩放理解,常见 24 像素光标按比例放大后约为:
24 × 1.5 = 36
因此,最终目标不是随意放大光标,而是让光标大小与 HiDPI 缩放比例保持一致。
问题现象
最初 KDE 桌面和 SDDM 登录界面都已设置为光标大小 32。使用一段时间后,32 在 27 英寸 4K 屏幕上显得略小,因此决定将光标大小调整为 36。
调整后,桌面光标明显变大,但登录界面仍然存在不一致现象:
开机后的登录界面:光标图标或大小看起来不一致
输入密码并点击确认后:光标立即发生变化
进入桌面后:光标恢复为预期样式和大小
这说明系统中至少存在多个阶段的光标来源:
- 系统默认 Xcursor 光标;
- SDDM Greeter 登录界面光标;
- KDE 用户会话光标。
只修改 KDE 桌面设置,无法完全覆盖 SDDM 和系统默认阶段。
第一步:确认 KDE 桌面光标配置
KDE 用户会话的光标设置位于:
~/.config/kcminputrc
查询命令:
echo "===== KDE desktop cursor setting ====="
echo -n "cursorTheme = "
kreadconfig6 --file kcminputrc --group Mouse --key cursorTheme
echo -n "cursorSize = "
kreadconfig6 --file kcminputrc --group Mouse --key cursorSize
echo
echo "===== raw kcminputrc Mouse section ====="
awk '
/^\[Mouse\]/ {show=1}
/^\[/ && $0!="[Mouse]" {show=0}
show {print}
' ~/.config/kcminputrc
目标状态为:
[Mouse]
cursorTheme=breeze_cursors
cursorSize=36
如果需要修改 KDE 桌面光标大小,可以执行:
kwriteconfig6 --file kcminputrc --group Mouse --key cursorTheme breeze_cursors
kwriteconfig6 --file kcminputrc --group Mouse --key cursorSize 36
修改后,注销并重新登录 KDE 会话最稳妥。
第二步:确认 SDDM 登录界面光标配置
SDDM 登录界面不一定会自动跟随 KDE 用户会话设置,因此需要单独配置。
本次使用的本地 SDDM HiDPI 配置文件为:
/etc/sddm.conf.d/90-local-greeter-hidpi.conf
查询所有 SDDM 相关配置:
echo "===== active SDDM .conf files ====="
ls -l /etc/sddm.conf /etc/sddm.conf.d/*.conf /usr/lib/sddm/sddm.conf.d/*.conf 2>/dev/null
echo
echo "===== active SDDM cursor/dpi settings only ====="
grep -RniE 'CursorTheme|CursorSize|GreeterEnvironment|ServerArguments|QT_FONT_DPI|dpi' \
/etc/sddm.conf /etc/sddm.conf.d/*.conf /usr/lib/sddm/sddm.conf.d/*.conf 2>/dev/null
目标配置为:
[General]
GreeterEnvironment=QT_FONT_DPI=144
[Theme]
CursorTheme=breeze_cursors
CursorSize=36
此时可以确认 SDDM Greeter 主题层面的光标主题和大小已经设置为 Breeze / 36。
第三步:发现系统默认光标仍然是 Adwaita
虽然 KDE 桌面和 SDDM 配置都已经设置为 breeze_cursors,但登录界面最初出现的光标仍然和桌面不同。
继续检查系统默认 Xcursor 设置:
echo "===== system default cursor theme ====="
cat /usr/share/icons/default/index.theme 2>/dev/null || echo "no /usr/share/icons/default/index.theme"
echo
echo "===== default icon symlink/path ====="
ls -ld /usr/share/icons/default 2>/dev/null
readlink -f /usr/share/icons/default 2>/dev/null
发现原始系统默认配置为:
[Icon Theme]
Inherits=Adwaita
这说明在 SDDM Greeter 完全加载或 KDE 用户会话启动之前,系统可能先使用默认的 Adwaita 光标。这就解释了为什么登录前后光标会发生变化。
第四步:将系统默认光标主题改为 Breeze
修改前先备份:
sudo cp /usr/share/icons/default/index.theme \
/usr/share/icons/default/index.theme.before-breeze-cursor.$(date +%Y%m%d-%H%M%S)
然后将系统默认光标改为 Breeze:
printf '[Icon Theme]\nInherits=breeze_cursors\n' | sudo tee /usr/share/icons/default/index.theme
复查:
cat /usr/share/icons/default/index.theme
目标结果:
[Icon Theme]
Inherits=breeze_cursors
此时,系统默认光标主题、SDDM 登录界面光标主题、KDE 桌面光标主题已经统一为:
breeze_cursors
第五步:解决登录界面光标大小仍然偏小的问题
系统默认光标主题统一后,图标样式已经一致,但登录界面光标大小仍可能偏小。
原因是:
/usr/share/icons/default/index.theme 只能指定默认光标主题,
不能指定默认光标大小。
也就是说,系统默认光标可以变成 Breeze,但大小仍可能是默认值,例如 24,而不是 HiDPI 环境下期望的 36。
因此,需要进一步通过 SDDM Greeter 环境变量明确指定:
XCURSOR_THEME=breeze_cursors
XCURSOR_SIZE=36
最终将 /etc/sddm.conf.d/90-local-greeter-hidpi.conf 修改为:
[General]
GreeterEnvironment=QT_FONT_DPI=144,XCURSOR_THEME=breeze_cursors,XCURSOR_SIZE=36
[Theme]
CursorTheme=breeze_cursors
CursorSize=36
修改前备份:
sudo cp /etc/sddm.conf.d/90-local-greeter-hidpi.conf \
/etc/sddm.conf.d/90-local-greeter-hidpi.conf.before-xcursor-env.$(date +%Y%m%d-%H%M%S)
覆盖写入:
sudo tee /etc/sddm.conf.d/90-local-greeter-hidpi.conf >/dev/null <<'EOF'
[General]
GreeterEnvironment=QT_FONT_DPI=144,XCURSOR_THEME=breeze_cursors,XCURSOR_SIZE=36
[Theme]
CursorTheme=breeze_cursors
CursorSize=36
EOF
复查:
cat /etc/sddm.conf.d/90-local-greeter-hidpi.conf
最终配置状态
最终实现的状态如下:
系统默认光标主题:breeze_cursors
KDE 桌面光标主题:breeze_cursors
KDE 桌面光标大小:36
SDDM 登录界面光标主题:breeze_cursors
SDDM 登录界面光标大小:36
SDDM Greeter DPI:144
SDDM Greeter 环境变量:
XCURSOR_THEME=breeze_cursors
XCURSOR_SIZE=36
对应关键文件如下。
系统默认光标
/usr/share/icons/default/index.theme
内容:
[Icon Theme]
Inherits=breeze_cursors
KDE 桌面光标
~/.config/kcminputrc
相关内容:
[Mouse]
cursorTheme=breeze_cursors
cursorSize=36
SDDM 登录界面光标
/etc/sddm.conf.d/90-local-greeter-hidpi.conf
内容:
[General]
GreeterEnvironment=QT_FONT_DPI=144,XCURSOR_THEME=breeze_cursors,XCURSOR_SIZE=36
[Theme]
CursorTheme=breeze_cursors
CursorSize=36
验证结果
重启系统后验证:
开机后的登录界面:光标主题正确,大小正确
SDDM Greeter 阶段:光标主题和大小正确
输入密码并点击确认后的过渡阶段:光标不再突变
进入 KDE 桌面后:光标与登录界面保持一致
最终实现了从开机登录界面到桌面的完整一致性。
回退方案
如果修改后出现光标异常、登录界面显示异常,或某些程序兼容性问题,可以回退系统默认光标主题。
原始系统默认配置为:
[Icon Theme]
Inherits=Adwaita
回退命令:
printf '[Icon Theme]\nInherits=Adwaita\n' | sudo tee /usr/share/icons/default/index.theme
如果需要回退 SDDM 配置,可以从之前创建的备份文件恢复:
ls -l /etc/sddm.conf.d/90-local-greeter-hidpi.conf.before-*
选择合适的备份文件复制回去:
sudo cp /etc/sddm.conf.d/90-local-greeter-hidpi.conf.before-某个时间戳 \
/etc/sddm.conf.d/90-local-greeter-hidpi.conf
KDE 用户配置也可以从备份恢复:
ls -l ~/.config/kcminputrc.before-cursor36.*
经验总结
这次问题的关键在于,Linux 桌面环境中的鼠标光标并不一定只有一个配置来源。至少需要区分:
KDE 用户会话光标
SDDM Greeter 登录界面光标
系统默认 Xcursor 光标
Qt / Xcursor 环境变量
在普通显示器上,这些差异可能并不明显。但在 27 英寸 4K HiDPI 显示环境中,默认光标大小很容易显得偏小。只调整 KDE 桌面设置,无法保证登录界面和开机早期阶段一致。
最终方案采用了多层统一:
主题统一:全部使用 breeze_cursors
大小统一:全部使用 36
DPI 统一:SDDM Greeter 使用 QT_FONT_DPI=144
兜底统一:系统默认 Xcursor 也指向 breeze_cursors
这是一套针对特定硬件、特定分辨率、特定 DPI、特定桌面环境的高度定制配置。将来如果更换显示器、分辨率、缩放比例或桌面环境,光标大小不应机械沿用 36,而应重新按照新硬件条件评估。
例如:
普通 1080p 显示器:可能使用 24 更合适
2K 显示器或轻度缩放:可能使用 28 或 32
4K / 150% 缩放:36 可能较合适
更高 DPI 或视距更远:可能需要 40 或更大
因此,这次配置应视为当前 HiDPI 设备的专属基线,而不是所有设备的通用模板。