繁体   English   中英

XCB 如何获取原子的值

[英]XCB how to get value of a atom

我正在编写一个小的系统信息(“*fetch”)程序(在 C 中),我想获得 WM 的名称,唯一的问题是 XCB 的文档相当缺乏,而 Xlib 的文档非常糟糕。 所以我无法自己弄清楚。

我知道根窗口的 atom: _NET_SUPPORTING_WM_CHECK应该有 WM 的 ID,WM 应该将它的_NET_WM_NAME设置为它的名称。 但我不知道如何获得它的 id。

我唯一确定的是如何获取根窗口。 但是其他部分根本就没有任何文档,或者(更有可能)我一直在使用错误的搜索词...

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <xcb/xcb.h>

static xcb_intern_atom_cookie_t intern(xcb_connection_t *c, const char *name) {
    return xcb_intern_atom(c, 0, strlen(name), name);
}

int main() {
    // TODO: Any kind of error handling. This is just the happy path.

    xcb_connection_t *c = xcb_connect(NULL, NULL);
    xcb_screen_t *s = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
    xcb_intern_atom_cookie_t wm_name_cookie = intern(c, "_NET_WM_NAME");
    xcb_intern_atom_cookie_t wm_check_cookie = intern(c, "_NET_SUPPORTING_WM_CHECK");
    xcb_intern_atom_reply_t *wm_name = xcb_intern_atom_reply(c, wm_name_cookie, NULL);
    xcb_intern_atom_reply_t *wm_check = xcb_intern_atom_reply(c, wm_check_cookie, NULL);

    xcb_get_property_reply_t *wm_name_value = xcb_get_property_reply(c,
            xcb_get_property(c, 0, s->root, wm_name->atom, XCB_GET_PROPERTY_TYPE_ANY, 0, ~0),
            NULL);
    xcb_get_property_reply_t *wm_check_value = xcb_get_property_reply(c,
            xcb_get_property(c, 0, s->root, wm_check->atom, XCB_ATOM_WINDOW, 0, ~0),
            NULL);

    printf("%.*s\n", xcb_get_property_value_length(wm_name_value),
            (char*) xcb_get_property_value(wm_name_value));
    printf("0x%"PRIx32"\n", *(xcb_window_t*) xcb_get_property_value(wm_check_value));

    free(wm_name_value);
    free(wm_check_value);
    free(wm_name);
    free(wm_check);

    return 0;
}

为了检查上述情况,这是我与“已知良好”程序进行比较的实验:

$ gcc t.c -O2 -Wall -Wextra -lxcb && ./a.out ; echo ; xprop -root | grep -E '(_NET_WM_NAME|SUPPORTING_WM_CHECK)\('
i3
0x800063

_NET_WM_NAME(UTF8_STRING) = "i3"
_NET_SUPPORTING_WM_CHECK(WINDOW): window id # 0x800063

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM