Ubuntu新版本中通过_NET_WM_ICON设置X11窗口Dock图标失效问题咨询
Ubuntu新版本中通过_NET_WM_ICON设置X11窗口Dock图标失效问题咨询
我最近碰到个棘手的问题:在Ubuntu 14.04这类旧版本系统里,通过_NET_WM_ICON原子给X11窗口设置图标后,图标会自动出现在应用Dock中。但升级到Ubuntu 24.04这种新版本后,这套方法彻底失效了——我的应用只会显示一个默认的 fallback 图标,完全不识别我通过_NET_WM_ICON设置的内容。
我查了相关资料,看到说X11应用需要正确设置WM_CLASS提示才能让Dock识别图标。我照着做了,结果还是不行:Ubuntu的Dock能正确识别我用XSetClassHint设置的应用ID,但就是不显示我通过_NET_WM_ICON设置的图标,依然是那个通用的默认图标。
我写了一段测试代码,通过_NET_WM_ICON给X11窗口添加不同尺寸的纯红色矩形图标。在Ubuntu 14.04上运行完全正常,但在24.04上就完全看不到图标。代码如下:
#include <stdio.h> #include <stdlib.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/X.h> #include <X11/Xatom.h> #define WMICONENTRIES (16*16+24*24+32*32+48*48+256*256+5+5) static const long sz[] = {16, 24, 32, 48, 256}; int main(int argc, char **argv) { Display *disp = XOpenDisplay(0); Window rootWnd = DefaultRootWindow(disp); int screen = DefaultScreen(disp); int depth = DefaultDepth(disp, screen); Visual *vis = DefaultVisual(disp, screen); Atom wmicon = XInternAtom(disp, "_NET_WM_ICON", 0); long *buf = malloc(WMICONENTRIES * sizeof(long)); long *p = buf; int k, j; for(k = 0; k < 5; k++) { *p++ = sz[k]; *p++ = sz[k]; for(j = 0; j < sz[k] * sz[k]; j++) *p++ = 0xffff0000; } XSetWindowAttributes setWndAttr = {0}; Window wnd = XCreateWindow(disp,rootWnd,300,400,640,480,0,depth,InputOutput,vis,CWEventMask,&setWndAttr); XClassHint *classhints = XAllocClassHint(); classhints->res_name = "test"; classhints->res_class = "com.example.foo"; XSetClassHint(disp, wnd, classhints); XFree(classhints); XChangeProperty(disp, wnd, wmicon, XA_CARDINAL, 32, PropModeReplace, (const unsigned char *) buf, WMICONENTRIES); XStoreName(disp,wnd,"Test"); XMapWindow(disp,wnd); Atom closeWndAtom = XInternAtom(disp,"WM_DELETE_WINDOW",0); XSetWMProtocols(disp,wnd,&closeWndAtom,1); int run = 1; XEvent evt; while(run) { XNextEvent(disp,&evt); switch(evt.type) { case ClientMessage: run = 0; break; } } XDestroyWindow(disp,wnd); XCloseDisplay(disp); free(buf); return 0; }
我现在特别困惑:新版本的Ubuntu到底还支持通过_NET_WM_ICON这种程序化方式设置Dock图标吗?还是说现在所有应用的图标都必须通过.desktop文件来指定了?
内容来源于stack exchange
相关产品推荐
相关产品推荐

