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

如何在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工具检查:

  1. 终端运行xprop
  2. 点击你的应用窗口
  3. 输出里应该能看到:
    _NET_WM_NAME(UTF8_STRING) = "我的自定义C++应用"
    WM_NAME(STRING) = "我的自定义C++应用"
    _NET_WM_CLASS(STRING) = "MyCustomApp", "MyCustomApp"
    

为什么终端能正常显示?

终端程序(比如GNOME Terminal)在创建窗口时会严格遵循EWMH规范,自动设置了这些属性,所以窗口管理器能直接读取到名称。

内容的提问来源于stack exchange,提问作者H. Guijt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:27