如何在X11(Ubuntu)中设置应用程序的图标显示名称
解决Ubuntu 18.04下X11 C++程序Alt-Tab显示"Unknown"的问题
嘿,这个问题我之前帮朋友排查过——你遇到的是典型的X11窗口缺少EWMH标准属性导致的窗口管理器识别问题。Ubuntu 18.04用的GNOME Shell虽然你没依赖GTK/KDE,但它依然遵循EWMH(Extended Window Manager Hints)规范,需要你的窗口提供几个关键属性才能正确显示名称。
你需要设置的核心X11属性
窗口管理器在Alt-Tab时显示的名称主要来自两个属性,同时补充一个类属性可以让识别更完整:
_NET_WM_NAME:EWMH标准的UTF-8窗口名称,现代窗口管理器优先读取这个WM_NAME:传统X11窗口名称,兼容旧版工具_NET_WM_CLASS:标识应用的类/实例名,帮助窗口管理器关联应用信息
C++代码实现(原生Xlib)
假设你已经用Xlib创建了窗口(Display* display和Window window是你的窗口句柄),在窗口创建后、映射到屏幕前(XMapWindow之前)添加以下代码:
#include <X11/Xlib.h> #include <X11/Xatom.h> #include <cstring> // 设置窗口名称和类名 const char* appName = "我的自定义C++应用"; const char* appClass = "MyCustomApp"; // 1. 设置传统WM_NAME XSetWMName(display, window, appName); // 2. 设置UTF-8格式的_NET_WM_NAME(GNOME Shell优先读取这个) Atom netWmNameAtom = XInternAtom(display, "_NET_WM_NAME", False); Atom utf8StringAtom = XInternAtom(display, "UTF8_STRING", False); XChangeProperty( display, window, netWmNameAtom, utf8StringAtom, 8, PropModeReplace, reinterpret_cast<const unsigned char*>(appName), strlen(appName) ); // 3. 设置_NET_WM_CLASS(实例名+类名,通常两者相同) Atom netWmClassAtom = XInternAtom(display, "_NET_WM_CLASS", False); const char* classData[] = {appClass, appClass}; XChangeProperty( display, window, netWmClassAtom, XA_STRING, 8, PropModeReplace, reinterpret_cast<const unsigned char*>(classData), sizeof(classData) / sizeof(char*) );
验证方法
设置完后,用xprop工具检查:
- 终端运行
xprop - 点击你的应用窗口
- 输出里应该能看到:
_NET_WM_NAME(UTF8_STRING) = "我的自定义C++应用" WM_NAME(STRING) = "我的自定义C++应用" _NET_WM_CLASS(STRING) = "MyCustomApp", "MyCustomApp"
为什么终端能正常显示?
终端程序(比如GNOME Terminal)在创建窗口时会严格遵循EWMH规范,自动设置了这些属性,所以窗口管理器能直接读取到名称。
内容的提问来源于stack exchange,提问作者H. Guijt
相关产品推荐
相关产品推荐

