我發現我的 appimag-ed 應用程式在啟動時沒有在視窗管理器中顯示任何應用程式圖示,即使它本身就有圖示。順便說一句,例如,黑曜石應用程式確實遇到了這個問題。一般來說,從網上搜索來看,appimage 看起來像圖示失敗。例如,一個人還回答說 appimage 無法為視窗管理器提供應用程式圖示:Electron Linux:.AppImage 沒有顯示圖示,而 .deb 是。而且,當我從https://appimage.github.io/apps/加載任何應用程式時——至少在 Fedora 33 和 35 上——我在啟動它們時看不到任何應用程式圖示。
我嘗試使用QMainWindow::setWindowIcon()或設定 env variable之類的變通方法XDG_DATA_DIRS,但沒有幫助——這些方法可以在 appimage 相關網站上找到。
我通過這些鏈接發現了關于 SO 的答案:
- Qt Creator - 如何為 ubuntu linux 設定應用程式圖示?
- 如何給 C 程式一個圖示?
答案的想法是你不能做這樣的事情,你必須通過 deb/rpm/etc安裝你的.desktop檔案和圖示。/usr/share包。
但是,我發現 xfreerdp 似乎帶有它的圖示:我試圖將我的系統路徑臨時更改為圖示 ( /usr/share/iconsto /usr/share/icons_),并且 xfreerdp 的圖示仍然存在于視窗管理器中,而其他應用程式的圖示則顯示為灰色。另外,我在整個作業系統上搜索了 xfreerdp 的 .svg 或 .png 圖示,但沒有找到任何東西。
所以我只是好奇他們是怎么做到的?我在 Github 上查看了它的源代碼,但無法理解。這對我來說真的只是一個謎。也許,任何人都知道他們是如何做到的或如何實作這一點的?
uj5u.com熱心網友回復:
這是一個不完整的答案,因為它僅涵蓋 X11 情況,并未描述如何從 QT 物件轉換為 X11 句柄。我什至不知道這種方法是否能解決你的具體問題。
想法是直接與X server 對話來設定視窗圖示,這里使用XCB API(同樣的事情可以使用Xlib 來實作)。
X 服務器需要以 32 位ARGB格式提供位圖資料,影像寬度和高度前面有兩個 32 位無符號整數。從視覺上看,這就是 X 服務器所等待的:
4 bytes 4 bytes 4 bytes 4 bytes 4 bytes
[ WIDTH ][ HEIGHT ][ ARGB ][ ARGB ][ ARGB ]...
實際上,如果您從常見的編碼影像格式(如 PNG、JPEG 或其他格式)加載影像,您需要將影像資料正確解碼為 RGB(A),然后將位圖轉換為正確的 ARGB 格式...
這是設定任何X視窗圖示的功能。第一個引數c是 X 服務器連接的句柄,第二個引數是wX 視窗的句柄/識別符號(實際上它是一個簡單的整數)。第三個引數icon_data是如上所述的圖示資料緩沖區,最后一個引數icon_size是 指向的緩沖區的大小(以位元組為單位)icon_data。
setWindowIcon(xcb_connection_t* c, xcb_window_t w, uint32_t* icon_data, size_t icon_size)
{
// get the _NET_WM_ICON atom
xcb_intern_atom_reply_t* r;
r = xcb_intern_atom_reply(c, xcb_intern_atom(c,1,12,"_NET_WM_ICON"), 0);
xcb_atom_t _NET_WM_ICON = r->atom;
free(r);
// get the CARDINAL atom
r = xcb_intern_atom_reply(c, xcb_intern_atom(c,1,8,"CARDINAL"), 0);
xcb_atom_t CARDINAL = r->atom;
free(r);
// change window property
xcb_change_property(c, XCB_PROP_MODE_REPLACE, w, _NET_WM_ICON, CARDINAL, 32, icon_size, icon_data);
// make sure everything is done
free(xcb_get_input_focus_reply(c, xcb_get_input_focus(c), NULL));
}
如您所見,此代碼的主要目的是修改/設定由_NET_WM_ICON. 您可以在此處找到有關此 X 特定協議和語法的一些資訊:
- https://specifications.freedesktop.org/wm-spec/1.3/ar01s05.html
- https://tronche.com/gui/x/xlib/window-information/properties-and-atoms.html
請注意,我個人并不是 X 服務器協議方面的專家,前段時間我只是為了一些低級的視窗管理目的才挖掘了這個特定的部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482070.html
上一篇:svg輪廓和填充
