Get window title with XCB

匿名 (未验证) 提交于 2019-12-03 08:28:06

问题:

I am trying to get information about the window in focus. It seems that I get a correct window id from xcb_get_input_focus_reply_t->focus: it stays the same for my Eclipse IDE (56623164) and is another for any other window in focus. However, the value length is always 0 for XCB_ATOM_WM_NAME.

shortened code

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 Debugger

reply xcb_get_property_reply_t * 0x60bd40     response_type uint8_t            1 '\001'     format        uint8_t            0 '\0'     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    

There is no error (I passed and inspected a xcb_generic_error_t). Do you have any idea what could go wrong? Maybe I should use Xlib instead...

回答1:

This code works for me, it is in js-ctypes but you can ignore that part and see this for API use:

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; 

Sometimes though what is returned by xcb_get_input_focus_reply_t->focus is not the window to act on. I have found that sometimes it doesn't have a title, but if you use xcb_query_tree you can find its parent window probaby has a title:

    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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!