Ubuntu下如何设置应用任务栏图标名称?Xlib代码问题求助
解决Xlib程序任务栏图标名称显示"unknown"的问题
你的代码已尝试设置窗口名称,但任务栏显示"unknown"是因为两个关键问题:现代窗口管理器依赖UTF8_STRING编码的_NET_WM_NAME,以及需要设置WM_CLASS属性(窗口管理器常用它识别应用)。
修改方案:
- 将
_NET_WM_NAME的属性类型从XA_STRING改为UTF8_STRING,这是当前X11标准推荐的编码格式。 - 添加
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
相关产品推荐
相关产品推荐

