如何修復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

相關文章:

翻譯: