Loading...

文章背景图

微信 Linux 光标主题不生效

2026-10-07
9
- 字
- 分钟
|

微信 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 版(注入变量无效)

原因

  1. Flatpak 没给 wayland socket
flatpak info --show-permissions com.tencent.WeChat
# sockets=pulseaudio;x11;   ← 没有 wayland

沙箱里因此没有 WAYLAND_DISPLAY,Qt 配的 wayland;xcb 只好回退 X11,窗口由 xwayland-satellite 创建。这就是上面"定位"第 2 条 PID 不对的原因。

  1. 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 恢复原样。
原创

微信 Linux 光标主题不生效

本文链接: 微信 Linux 光标主题不生效

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录