【问题标题】:How to display XCB window's name in Gnome's alt-tab view?如何在 Gnome 的 alt-tab 视图中显示 XCB 窗口的名称?
【发布时间】:2020-01-15 17:27:35
【问题描述】:

我有一个简单的 XCB 窗口。当我运行我的应用程序和 alt-tab 时,Gnome 的窗口列表将我的应用程序显示为“未知”。窗口的标题栏显示正确的标题。

我是这样设置标题的:

xcb_change_property(WindowGlobal::connection,
                    XCB_PROP_MODE_REPLACE,
                    WindowGlobal::window,
                    XCB_ATOM_WM_NAME,
                    XCB_ATOM_STRING,
                    8,
                    strlen (title),
                    title );

这是我的大部分窗口创建代码:

int visualID = screen->root_visual;

xcb_colormap_t colormap = xcb_generate_id( connection );
WindowGlobal::window = xcb_generate_id( connection );

WindowGlobal::windowWidth = width == 0 ? screen->width_in_pixels : width;
WindowGlobal::windowHeight = height == 0 ? screen->height_in_pixels : height;

xcb_create_colormap( connection, XCB_COLORMAP_ALLOC_NONE, colormap, screen->root, visualID );

const uint32_t eventmask = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
                           XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_POINTER_MOTION;
const uint32_t valuelist[] = { eventmask, colormap, 0 };
const uint32_t valuemask = XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;

xcb_create_window(
                  connection,
                  XCB_COPY_FROM_PARENT,
                  WindowGlobal::window,
                  screen->root,
                  0, 0,
                  WindowGlobal::windowWidth, WindowGlobal::windowHeight,
                  0,
                  XCB_WINDOW_CLASS_INPUT_OUTPUT,
                  visualID,
                  valuemask,
                  valuelist
                  );

xcb_map_window( connection, WindowGlobal::window );

xcb_size_hints_t hints = {};

xcb_icccm_size_hints_set_min_size( &hints, WindowGlobal::windowWidth, WindowGlobal::windowHeight );
xcb_icccm_size_hints_set_max_size( &hints, WindowGlobal::windowWidth, WindowGlobal::windowHeight );

xcb_icccm_set_wm_size_hints( WindowGlobal::connection, WindowGlobal::window, XCB_ATOM_WM_NORMAL_HINTS, &hints );

xcb_atom_t protocols[] =
{
    WindowGlobal::wm_delete_window
};
xcb_icccm_set_wm_protocols( WindowGlobal::connection, WindowGlobal::window,
                            WindowGlobal::wm_protocols, 1, protocols );

如何让 XCB 设置在 Gnome 的窗口列表中显示的文本?

【问题讨论】:

  • 我不知道 Gnome 使用什么,但您是否尝试设置 _NET_WM_NAME(类型为 UTF8_STRING)代替或附加于 WM_NAME(类型为 STRING)? WM_NAME 早于 UTF8,因此必须为 UTF8 发明一个新属性。

标签: c gnome xcb


【解决方案1】:

xcb 中的正确属性是XCB_ATOM_WM_CLASS

我在 GitHub 上看到了一些代码,其中两个字符串与 "\0" 连接。 (我在 awesomeWM/awesome/xwindow.h 和 GitHub 上的其他窗口管理器中看到过)

这对我有用:

xcb_change_property(WindowGlobal::connection,
                    XCB_PROP_MODE_REPLACE,
                    WindowGlobal::window,
                    XCB_ATOM_WM_CLASS,
                    XCB_ATOM_STRING,
                    8,
                    sizeof("title""\0""Title"),
                    "title\0Title" );

字符串的第二部分是 gnome 中显示的内容。

这是我见过的另一种常见方式:

char *res_name = "title";
char *res_class = "Title";

char *class_hint;
size_t class_len;
class_len = strlen(res_name) + 1 + strlen(res_class) + 1;
class_hint = (char *)malloc(class_len);
strcpy(class_hint, res_name);
strcpy(class_hint + strlen(res_name) + 1, res_class);

xcb_change_property (WindowGlobal::connection,
                     XCB_PROP_MODE_REPLACE,
                     WindowGlobal::window,
                     XCB_ATOM_WM_CLASS,
                     XCB_ATOM_STRING,
                     8,
                     class_len,
                     class_hint);

free(class_hint);

char *res_class 是 gnome 中显示的内容。


使用 Xlib,您将使用函数 XSetClassHint。 在那里,您将使用由两个字符串组成的 XClassHint 结构: char *res_namechar *res_class

https://www.x.org/releases/X11R7.7/doc/man/man3/XAllocClassHint.3.xhtml 我发现了这个:

res_name 成员包含应用程序名称,res_class 成员包含应用程序类。请注意,此属性中设置的名称可能与设置为 WM_NAME 的名称不同。也就是说,WM_NAME 指定应该在标题栏中显示的内容,因此可以包含时间信息(例如,当前在编辑器缓冲区中的文件的名称)。另一方面,作为 WM_CLASS 一部分指定的名称是应用程序的正式名称,在从资源数据库中检索应用程序的资源时应使用该名称。

我可以找到更多信息herehere

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多