如何修復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命令不能列出信號表