如何修复Waybar微信图标错误
Waybar 是 Sway 或者 Wayland compositors 的状态栏组件,状态栏在英文中叫 status bar,好比吧台上的酒水一样,方便取用?对于软件来说就是方便展示核心系统信息、快速和不同软件交互。
waybar 中有一个很重要的模块叫 taskbar,即任务栏,Windows 用户应该都知道,Mac 用户可以理解为 Dock,下图中间所示(wabar 可以配置为左/中/右显示)。
作用就是点击软件图标,切换不同软件到前台。
在我的 labwc 环境下,各种 Linux 的软件图标都显示正确,唯独 wine 的微信图标显示错误。waybar 和 wine system tray 并不能和谐共存,启动微信的时候,会单独展示个窗口(Gnome 环境没有问题)。
明显跑偏了,好在可以关闭该窗口,问题不大。
回到正题,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 识别没有问题,从.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
上面会输出成吨的日志文件,还好我停止得快,更科学的用法参考这个文章
运气好搜索关键字 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 命令在查找软件载入什么文件的时候很好用,往往有惊喜,输出很多的时候最好要先想办法过滤,而不是海量输出信息中搜索。
问题每天都会遇到,功夫在平时,分享出来,不是什么高深内容,但是的确填补了中文世界的小小空白,对后人有益。
版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- Linux环境下维护公众号记录
- Wine安装微信保姆教程
- Wayland环境ksnip无法复制问题解决
- Wayland环境下截图加后期修改
- 窗口管理器labwc使用记
- Ubuntu安装微信(Ubuntu install Wechat)
- 信封加密简要
- Wayland环境自动切换壁纸
- SuperTuxKart 试玩
- 为什么你的kill命令不能列出信号表