在 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。

调整后,桌面光标明显变大,但登录界面仍然存在不一致现象:

开机后的登录界面:光标图标或大小看起来不一致
输入密码并点击确认后:光标立即发生变化
进入桌面后:光标恢复为预期样式和大小

这说明系统中至少存在多个阶段的光标来源:

  1. 系统默认 Xcursor 光标;
  2. SDDM Greeter 登录界面光标;
  3. 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 设备的专属基线,而不是所有设备的通用模板。

Leave a Reply

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