如何修复Waybar微信图标错误

Waybar 是 Sway 或者 Wayland compositors 的状态栏组件,状态栏在英文中叫 status bar,好比吧台上的酒水一样,方便取用?对于软件来说就是方便展示核心系统信息、快速和不同软件交互。

waybar

waybar 中有一个很重要的模块叫 taskbar,即任务栏,Windows 用户应该都知道,Mac 用户可以理解为 Dock,下图中间所示(wabar 可以配置为左/中/右显示)。

waybar taskbar

作用就是点击软件图标,切换不同软件到前台。

在我的 labwc 环境下,各种 Linux 的软件图标都显示正确,唯独 wine 的微信图标显示错误。waybar 和 wine system tray 并不能和谐共存,启动微信的时候,会单独展示个窗口(Gnome 环境没有问题)。

wine system tray wechat

明显跑偏了,好在可以关闭该窗口,问题不大。

回到正题,waybar 的 taskbar 中,微信图标显示错误,而且错得很离谱,会载入 synaptic 的图标,旧版本的 waybar 是载入另外一图标,反正都是错的。

经过几天的排查(不连续,有空到时候才想起来处理),终于找到了修复办法,下面是解决过程记录。

1. 首先确认到底载入了什么错误图标

遇到程序问题,情况允许的话,一般开启 debug 模式是个好习惯,waybar 也不例外。

1waybar -l trace

终端直接运行上述命令,在标准输出中,逐行查看,即可看到载入了错误的 synaptic 图标。

1[2024-01-06 13:53:30.900] [debug] Task (12) overwriting app_id 'unknown' with 'wechat.exe'
2[2024-01-06 13:53:30.905] [debug] Task (12) 微信 [wechat.exe] <Amif> Loaded icon 'synaptic'
3[2024-01-06 13:53:30.905] [debug] Task (12) 微信 [wechat.exe] <Amif> changed
4[2024-01-06 13:53:30.905] [debug] Task (10) tmux ~ [Alacritty] <aMif> chang

修复后正确的载入是 E282_WeChat.0

1[2024-01-06 16:37:20.663] [debug] Task (7)  [unknown] <amif> Loaded icon from resource
2[2024-01-06 16:37:20.663] [debug] Task (0) overwriting app_id 'unknown' with 'wechat.exe'
3[2024-01-06 16:37:20.665] [debug] Task (0) 微信 [wechat.exe] <amif> Loaded icon 'E282_WeChat.0'
4[2024-01-06 16:37:20.665] [debug] Task (0) 微信 [wechat.exe] <amif> entered output 0x564841c811a0
5[2024-01-06 16:37:20.666] [debug] Task (0) 微信 [wechat.exe] <amif> now visible on eDP-1
6[2024-01-06 16:37:20.666] [debug] Task (0) 微信 [wechat.exe] <amif> changed

2. 如何修复

wine 微信在 waybar 下,app_id 被识别为 wechat.exe,具体怎么来的这要去翻看 waybar 的 C++源码,所谓少壮不努力,老大徒伤悲,C++上学时没有学好,看了个把小时,头晕眼花。一头扎进源码虽然治本,但是事后想还是有简便方法。

我按照自己理解的源码逻辑,把图标放在系统的各个位置都不起作用(肯定是代码理解错误了,也没办法回炉重造 😅)。反复试验,反复错误,仿佛走进了死胡同。

后来我想起 wofi 启动器里面图标正常显示,有了一些灵感。

wofi wechat

既然 wofi 识别没有问题,从.desktop 文件到图标的链路应该没有问题。

waybar 本身的嫌疑更大,但是从 debug 日志中也看不出来什么原因导致的,源码是看不动了。

lsof 查看系统图标缓存也是正常载入

1➜  ~ lsof -p 183863 |grep -i icon
2waybar  183863 mephisto  mem       REG               0,27    44472  904982 /usr/share/icons/hicolor/icon-theme.cache
3waybar  183863 mephisto  mem       REG               0,27   327184  160612 /usr/share/icons/Humanity/icon-theme.cache
4waybar  183863 mephisto  mem       REG               0,27   186604  503138 /usr/share/icons/Yaru/icon-theme.cache
5waybar  183863 mephisto  mem       REG               0,27   117372  852152 /usr/share/icons/Adwaita/icon-theme.cache
6waybar  183863 mephisto  mem       REG               0,27     6900  503298 /usr/share/icons/Yaru-purple/icon-theme.cache

最终,我想到了 strace,排查启动时到底按照什么顺序载入了什么文件。

1 strace waybar -l trace

上面会输出成吨的日志文件,还好我停止得快,更科学的用法参考这个文章

strace wechat

运气好搜索关键字 wechat 发现,waybar 一直在查找 wechat.exe.desktop 文件,而 wine 微信 启动文件叫 WeChat.desktop,找不到指导文件,载入奇怪图标也就不足为奇了。

最终解决办法是,按照 waybar 的逻辑重命名文件 😅

 1➜  applications pwd
 2/home/mephisto/.local/share/applications
 3➜  applications mv WeChat.desktop wechat.exe.desktop
 4➜  applications cat wechat.exe.desktop
 5[Desktop Entry]
 6Name=WeChat
 7Exec=env WINEPREFIX="/home/mephisto/.wine" wine C:\\\\ProgramData\\\\Microsoft\\\\Windows\\\\Start\\ Menu\\\\Programs\\\\WeChat\\\\WeChat.lnk
 8Type=Application
 9StartupNotify=true
10Path=/home/mephisto/.wine/dosdevices/c:/Program Files/Tencent/WeChat
11Icon=E282_WeChat.0
12StartupWMClass=wechat.exe

至于为什么 app_id 被识别为 wechat.exe,经测试和 StartupWMClass=wechat.exe 没有关系,一般来说 app_id 由 wayland compositors 传给 waybar, waybar 后续怎么操作得看它的源码。改不了 app_id,就只能改 desktop 文件名了。

waybar 根据 app_id wechat.exe 查找 desktop 文件,desktop 文件中的 Icon 决定载入的图标,再从 系统的各种 icons 路径中载入正确的图标。

wofi 是直接读取的 desktop 文件,启动文件的时候,搜索 desktop 中的 Name,启动对应程序,不存在找不到 desktop 文件的问题,启动器设计的时候,天生就是去找 desktop 文件。

waybar 的逻辑链路是: app_id > desktop file > icon,结合之前写得 快速隐藏和呼出终端,可见 app_id 是 wayland 下标识各种应用的,很关键,taskbar 自然也是通过 app_id 控制软件的各种行为。

结论,Linux 生态中 C 和 C++的成分很大,如果没有学好,碰到问题的时候,要走的弯路很多,如果能读懂源码,解决问题会快速精准很多,这才是真本事,当然只有部分人做 Linux 相关开发;另外,strace 命令在查找软件载入什么文件的时候很好用,往往有惊喜,输出很多的时候最好要先想办法过滤,而不是海量输出信息中搜索。

问题每天都会遇到,功夫在平时,分享出来,不是什么高深内容,但是的确填补了中文世界的小小空白,对后人有益。

最后修改于: Wednesday, January 10, 2024
欢迎关注微信公众号,留言交流。

相关文章:

翻译: