微信 Linux 光标主题不生效修复
问题
系统已安装并启用自定义光标主题,其他应用都正常,微信窗口里却回退成默认光标,彻底退出(含托盘进程)重开也没用。
实际有两种表现,对应两种不同的原因:
- 拖拽窗口/边缘时光标正常,窗口内点击、滑动却是默认光标 —— 多见于 KDE + 原生 deb/tar 包
- 整个窗口内都是默认黑箭头,而且
env里XCURSOR_THEME明明就是正确值 —— 见于 Flatpak 版
先定位是哪一种
先让微信开着窗口,再跑:
# 1) 是不是 Flatpak 版
flatpak list --app | grep -i wechat
# 2) 微信窗口是不是 X11(PID 显示成 xwayland-satellite 就是,正常应是微信进程自己的 PID)
niri msg windows | grep -A4 'Title: "微信"'
# 3) 进程有没有加载 libXcursor(0 = 客户端从不做光标主题查找)
grep -c Xcursor /proc/$(pgrep -n -x wechat)/maps
flatpak list有输出 → 情况二- 没有、且环境里缺
XCURSOR_THEME→ 情况一
情况一:读不到 XCURSOR_THEME(KDE / 原生包)
原因
微信 Linux 版是基于 Qt 框架的 XWayland 应用。在 Wayland 环境下,光标渲染分为两种情况:
- 拖拽窗口/拖动边缘:由 KWin 合成器渲染,使用系统光标主题
- 窗口内点击/滑动:由 XWayland 应用自身渲染,依赖
XCURSOR_THEME环境变量加载主题
当 XCURSOR_THEME 未设置时,XWayland 回退到默认光标,导致微信窗口内光标与系统主题不一致。
解决办法
通过修改微信的 .desktop 文件,在启动时注入 XCURSOR_THEME 和 XCURSOR_SIZE 环境变量。
1. 确认光标主题名称和路径
cat ~/.config/kcminputrc
输出示例:
[Mouse]
cursorSize=48
cursorTheme=miku-cursor-linux
确认光标主题文件存在于标准路径:
ls -d ~/.icons/miku-cursor-linux
# 输出: /home/zhou/.icons/miku-cursor-linux
XWayland 查找光标主题的路径为 ~/.icons/ 和 /usr/share/icons/,主题需至少存在于其中一个路径下。
2. 创建本地 desktop 文件覆盖
cp /usr/share/applications/wechat.desktop ~/.local/share/applications/
3. 修改 Exec 行,注入环境变量
sed -i 's/^Exec=\/usr\/bin\/wechat/Exec=env XCURSOR_THEME=miku-cursor-linux XCURSOR_SIZE=48 \/usr\/bin\/wechat/' ~/.local/share/applications/wechat.desktop
修改后的 Exec 行应为:
Exec=env XCURSOR_THEME=miku-cursor-linux XCURSOR_SIZE=48 /usr/bin/wechat %U
将
miku-cursor-linux和48替换为你实际的光标主题名和尺寸。
4. 更新桌面数据库
update-desktop-database ~/.local/share/applications/
验证
完全退出微信(包括托盘进程),从应用菜单重新启动微信,在窗口内点击和滑动时光标应显示为主题样式。
情况二:Flatpak 版(注入变量无效)
原因
- Flatpak 没给 wayland socket
flatpak info --show-permissions com.tencent.WeChat
# sockets=pulseaudio;x11; ← 没有 wayland
沙箱里因此没有 WAYLAND_DISPLAY,Qt 配的 wayland;xcb 只好回退 X11,窗口由 xwayland-satellite 创建。这就是上面"定位"第 2 条 PID 不对的原因。
- X11 下主题必然失效,因为两边都不查主题
- 微信进程没加载
libXcursor(定位第 3 条为 0); Xwayland也不链接libXcursor(readelf -d的 NEEDED 里没有),只会画内置光标字体的黑箭头。
也就是说环境变量写得再对也没人去读,所以情况一那套"注入 XCURSOR_THEME"在这里无效——卡点不是变量,是"微信根本没跑 Wayland"。
解决办法
给微信补上 wayland socket,不动系统、不用 sudo,写一个用户级 .desktop 覆盖:
mkdir -p ~/.local/share/applications
cp /var/lib/flatpak/exports/share/applications/com.tencent.WeChat.desktop ~/.local/share/applications/
sed -i -e 's|^Exec=/usr/bin/flatpak run |Exec=env "QT_QPA_PLATFORM=wayland;xcb" /usr/bin/flatpak run |' \
-e 's|--command=wechat |--command=wechat --socket=wayland |' \
~/.local/share/applications/com.tencent.WeChat.desktop
update-desktop-database ~/.local/share/applications/
desktop-file-validate ~/.local/share/applications/com.tencent.WeChat.desktop
改完的 Exec 应该是:
Exec=env "QT_QPA_PLATFORM=wayland;xcb" /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=wechat --socket=wayland --file-forwarding com.tencent.WeChat @@u %U @@
desktop-file-validate必须无输出。报 “reserved character ‘;’” 就是引号丢了,QT_QPA_PLATFORM=wayland;xcb必须整体包在引号里。- 用户级
.desktop优先级高于 Flatpak 导出的那份,升级/重装微信都不会覆盖它。 QT_QPA_PLATFORM平时由 DMS 注入,这里写死是为了不依赖启动它的那个启动器。
验证
完全退出微信(含托盘)再开,然后:
pgrep -x wechat
niri msg windows | grep -A4 'Title: "微信"' # 两处 PID 一致 = Wayland 原生窗口
tr '\0' '\n' < /proc/$(pgrep -n -x wechat)/environ | grep -E '^(WAYLAND_DISPLAY|XCURSOR_THEME)='
期望输出 WAYLAND_DISPLAY=wayland-1 和 XCURSOR_THEME=你的主题,此时微信窗口内光标就跟随主题了。
回滚
rm ~/.local/share/applications/com.tencent.WeChat.desktop
备注
- 想先试一次不落地:
flatpak run --socket=wayland com.tencent.WeChat。 - 系统级永久授权是
sudo flatpak override --socket=wayland com.tencent.WeChat(要密码,上面的方案不需要)。 - 通用结论:
flatpak info --show-permissions <app>里sockets缺wayland的应用都可能中招,凡是不加载libXcursor的客户端最后都会露出内置黑箭头。 - 情况一的回滚:删掉
~/.local/share/applications/wechat.desktop恢复原样。