使用 XCB 获得 window 头衔
Get window title with XCB
我正在尝试获取有关 window 的信息。似乎我从 xcb_get_input_focus_reply_t->focus
获得了正确的 window id:它对我的 Eclipse IDE (56623164) 保持不变,对任何其他 window 都是另一个焦点。但是,XCB_ATOM_WM_NAME
.
的值长度始终为 0
缩短代码
cookie = xcb_get_property(c, 0, fr->focus, XCB_ATOM_WM_NAME,
XCB_ATOM_STRING, 0, 0);
if ((reply = xcb_get_property_reply(c, cookie, NULL))) {
int len = xcb_get_property_value_length(reply);
if (len == 0) {
printf("Zero Length\n");
free(reply);
return;
}
printf("WM_NAME is %.*s\n", len, (char*) xcb_get_property_value(reply));
}
Eclipse 调试器
reply xcb_get_property_reply_t * 0x60bd40
response_type uint8_t 1 '[=12=]1'
format uint8_t 0 '[=12=]'
sequence uint16_t 2
length uint32_t 0
type xcb_atom_t 0
bytes_after uint32_t 0
value_len uint32_t 0
pad0 unsigned char [12] 0x60bd54
没有错误(我通过并检查了一个xcb_generic_error_t
)。你知道会出什么问题吗?也许我应该改用 Xlib...
此代码对我有用,它在 js-ctypes 中,但您可以忽略该部分并查看此代码以供 API 使用:
var win = aXcbWindowT;
// console.log('win:', win);
var req_title = ostypes.API('xcb_get_property')(ostypes.HELPER.cachedXCBConn(), 0, win, ostypes.CONST.XCB_ATOM_WM_NAME, ostypes.CONST.XCB_ATOM_STRING, 0, 100); // `100` means it will get 100*4 so 400 bytes, so that 400 char, so `rez_title.bytes_after` should be `0` but i can loop till it comes out to be 0
var rez_title = ostypes.API('xcb_get_property_reply')(ostypes.HELPER.cachedXCBConn(), req_title, null);
// console.log('rez_title:', rez_title);
var title_len = ostypes.API('xcb_get_property_value_length')(rez_title); // length is not null terminated so "Console - chrome://nativeshot/content/resources/scripts/MainWorker.js?0.01966718940939427" will be length of `88`, this matches `rez_title.length` but the docs recommend to use this call to get the value, i dont know why
console.log('title_len:', title_len, 'rez_title.contents.length:', rez_title.contents.length); // i think `rez_title.contents.length` is the actual length DIVIDED by 4, and rez_title_len is not dividied by 4
var title_buf = ostypes.API('xcb_get_property_value')(rez_title); // "title_len: 89 rez_title.contents.length: 23" for test case of "Console - chrome://nativeshot/content/resources/scripts/MainWorker.js?0.01966718940939427"
// console.log('title_buf:', title_buf);
var title = ctypes.cast(title_buf, ctypes.char.array(title_len).ptr).contents.readString();
console.log('title:', title);
ostypes.API('free')(rez_title);
return title;
虽然 xcb_get_input_focus_reply_t->focus
返回的内容有时不是要执行的 window。我发现有时候它没有标题,但是如果你使用 xcb_query_tree
你可以找到它的 parent window probaby 有一个标题:
var req_query = ostypes.API('xcb_query_tree')(ostypes.HELPER.cachedXCBConn(), win);
var rez_query = ostypes.API('xcb_query_tree_reply')(ostypes.HELPER.cachedXCBConn(), req_query, null);
console.log('rez_query.contents:', rez_query.contents);
if (root === -1) {
root = rez_query.contents.root;
}
win = rez_query.contents.parent; // this win should have the title
我正在尝试获取有关 window 的信息。似乎我从 xcb_get_input_focus_reply_t->focus
获得了正确的 window id:它对我的 Eclipse IDE (56623164) 保持不变,对任何其他 window 都是另一个焦点。但是,XCB_ATOM_WM_NAME
.
缩短代码
cookie = xcb_get_property(c, 0, fr->focus, XCB_ATOM_WM_NAME,
XCB_ATOM_STRING, 0, 0);
if ((reply = xcb_get_property_reply(c, cookie, NULL))) {
int len = xcb_get_property_value_length(reply);
if (len == 0) {
printf("Zero Length\n");
free(reply);
return;
}
printf("WM_NAME is %.*s\n", len, (char*) xcb_get_property_value(reply));
}
Eclipse 调试器
reply xcb_get_property_reply_t * 0x60bd40
response_type uint8_t 1 '[=12=]1'
format uint8_t 0 '[=12=]'
sequence uint16_t 2
length uint32_t 0
type xcb_atom_t 0
bytes_after uint32_t 0
value_len uint32_t 0
pad0 unsigned char [12] 0x60bd54
没有错误(我通过并检查了一个xcb_generic_error_t
)。你知道会出什么问题吗?也许我应该改用 Xlib...
此代码对我有用,它在 js-ctypes 中,但您可以忽略该部分并查看此代码以供 API 使用:
var win = aXcbWindowT;
// console.log('win:', win);
var req_title = ostypes.API('xcb_get_property')(ostypes.HELPER.cachedXCBConn(), 0, win, ostypes.CONST.XCB_ATOM_WM_NAME, ostypes.CONST.XCB_ATOM_STRING, 0, 100); // `100` means it will get 100*4 so 400 bytes, so that 400 char, so `rez_title.bytes_after` should be `0` but i can loop till it comes out to be 0
var rez_title = ostypes.API('xcb_get_property_reply')(ostypes.HELPER.cachedXCBConn(), req_title, null);
// console.log('rez_title:', rez_title);
var title_len = ostypes.API('xcb_get_property_value_length')(rez_title); // length is not null terminated so "Console - chrome://nativeshot/content/resources/scripts/MainWorker.js?0.01966718940939427" will be length of `88`, this matches `rez_title.length` but the docs recommend to use this call to get the value, i dont know why
console.log('title_len:', title_len, 'rez_title.contents.length:', rez_title.contents.length); // i think `rez_title.contents.length` is the actual length DIVIDED by 4, and rez_title_len is not dividied by 4
var title_buf = ostypes.API('xcb_get_property_value')(rez_title); // "title_len: 89 rez_title.contents.length: 23" for test case of "Console - chrome://nativeshot/content/resources/scripts/MainWorker.js?0.01966718940939427"
// console.log('title_buf:', title_buf);
var title = ctypes.cast(title_buf, ctypes.char.array(title_len).ptr).contents.readString();
console.log('title:', title);
ostypes.API('free')(rez_title);
return title;
虽然 xcb_get_input_focus_reply_t->focus
返回的内容有时不是要执行的 window。我发现有时候它没有标题,但是如果你使用 xcb_query_tree
你可以找到它的 parent window probaby 有一个标题:
var req_query = ostypes.API('xcb_query_tree')(ostypes.HELPER.cachedXCBConn(), win);
var rez_query = ostypes.API('xcb_query_tree_reply')(ostypes.HELPER.cachedXCBConn(), req_query, null);
console.log('rez_query.contents:', rez_query.contents);
if (root === -1) {
root = rez_query.contents.root;
}
win = rez_query.contents.parent; // this win should have the title