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

Ubuntu下如何设置应用任务栏图标名称?Xlib代码问题求助

解决Xlib程序任务栏图标名称显示"unknown"的问题

你的代码已尝试设置窗口名称,但任务栏显示"unknown"是因为两个关键问题:现代窗口管理器依赖UTF8_STRING编码的_NET_WM_NAME,以及需要设置WM_CLASS属性(窗口管理器常用它识别应用)。

修改方案:

  1. 将_NET_WM_NAME的属性类型从XA_STRING改为UTF8_STRING,这是当前X11标准推荐的编码格式。
  2. 添加WM_CLASS属性设置,给窗口指定实例名和类名,多数任务栏会优先读取这个属性的值。

修改后的完整代码:

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool quited = false;

void on_delete(Display * display, Window window)
{
    XDestroyWindow(display, window);
    quited = true;
}

int main(int argc, char *argv[])
{
    Display * display = XOpenDisplay(NULL);
    if (NULL == display) {
        fprintf(stderr, "Failed to initialize display");
        return EXIT_FAILURE;
    }

    Window root = DefaultRootWindow(display);
    if (None == root) {
        fprintf(stderr, "No root window found");
        XCloseDisplay(display);
        return EXIT_FAILURE;
    }

    Window window = XCreateSimpleWindow(display, root, 0, 0, 800, 600, 0, 0, 0xffffffff);
    if (None == window) {
        fprintf(stderr, "Failed to create window");
        XCloseDisplay(display);
        return EXIT_FAILURE;
    }

    // 设置窗口标题(供窗口标题栏显示)
    XStoreName(display, window, "Test-Application");

    // 设置_NET_WM_NAME:使用UTF8_STRING编码
    Atom net_wm_name = XInternAtom(display, "_NET_WM_NAME", False);
    Atom utf8_string = XInternAtom(display, "UTF8_STRING", False);
    const char *wm_name_utf8 = "Testing";
    XChangeProperty(display, window, net_wm_name, utf8_string, 8,
                    PropModeReplace, (unsigned char *)wm_name_utf8, strlen(wm_name_utf8));

    // 设置WM_CLASS:实例名和类名,任务栏常用此识别应用
    const char *wm_class[] = {"test-app", "TestApplication"};
    XSetClassHint(display, window, (XClassHint*)wm_class);

    XMapWindow(display, window);

    Atom wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(display, window, &wm_delete_window, 1);

    XEvent event;
    while (!quited) {
        XNextEvent(display, &event);

        switch(event.type) {
        case ClientMessage:
            if(event.xclient.data.l[0] == wm_delete_window) {
                on_delete(event.xclient.display, event.xclient.window);
            }
            break;
        }
    }

    XCloseDisplay(display);

    return 0;
}

编译命令:

gcc test.c -o test -lX11

关键修改说明:

  • UTF8_STRING替换XA_STRING:XA_STRING使用本地编码,在多语言环境下兼容性差,现代窗口管理器几乎都优先支持UTF8_STRING格式的窗口名称。
  • WM_CLASS属性:该属性包含两个字符串,第一个是实例名(通常为可执行文件名),第二个是类名(通用的应用名称)。窗口管理器用它关联应用图标、分组窗口,很多任务栏会直接显示这个属性的类名或实例名。

内容的提问来源于stack exchange,提问作者Basavaraj Kittali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:24:51