You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:34:32