[英]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.