2016-01-25 58 views
2

我正在嘗試獲取有關處於焦點的窗口的信息。看起來我從xcb_get_input_focus_reply_t->focus獲得了一個正確的窗口ID:它對於我的Eclipse IDE(56623164)保持不變,並且對於其他任何焦點窗口都是另一個。但是,對於XCB_ATOM_WM_NAME,值長度始終爲0。使用XCB獲取窗口標題

縮短代碼

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 '\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 

沒有錯誤(I傳遞和檢查一個xcb_generic_error_t)。你有什麼想法可能會出錯?也許我應該用Xlib的,而不是...

回答

1

此代碼的工作對我來說,它是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不是可以採取行動的窗口。我發現,有時候它並沒有標題,但如果你使用xcb_query_tree你可以找到它的父窗口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 
+0

這聽起來很合理。當我找到時間去嘗試時,我會接受答案。非常感謝! – Matthias