2015-07-03 62 views
3

有沒有一種可靠的方法來獲取頂級 級別窗口的內部和外部矩形與XCB/Xlib? (IOW框架和客戶矩形)。如何使用Xlib/XCB獲取內部和外部窗口尺寸?

這裏是我的嘗試:

  • xcb_get_geometry總是返回初始尺寸甚至 之後的窗口被調整(怎麼辦?)

  • 我想我會打電話xcb_query_tree,直到我找到 窗口的框架窗口 - 這是做到這一點的方式?我想ICCCM/EWMH 應該提供這個,但找不到任何東西。有沒有其他 標準/非標準呢?無論如何,這與 compiz/ubuntu10不起作用,因爲xcb_query_tree報告客戶端窗口爲 有root = parent(在正常的Ubuntu系統下,窗口得到正確的 重新設置)。

  • xcb_translate_coordinates()似乎是唯一可靠的方式來 在2007年獲得基於根的座標[1] - 這仍然是這種情況嗎?即是 XCB_CONFIGURE_NOTIFY與WMs非標準?

[1] http://fixunix.com/xwindows/91652-finding-position-top-level-windows.html

回答

2

這是一個局部的答案,因爲它僅說明了如何找到一個窗口的內部尺寸。此外,我不確定這是否是規範的方式,但它適用於我。

創建一個窗口時,您可以訂閱XCB_EVENT_MASK_RESIZE_REDIRECT事件:

xcb_window_t   window = xcb_generate_id   (connection); 
const xcb_setup_t  *setup  = xcb_get_setup   (connection); 
xcb_screen_t   *screen = xcb_setup_roots_iterator (setup).data; 
uint32_t    mask  = XCB_CW_EVENT_MASK; 
uint32_t    valwin[1] = { XCB_EVENT_MASK_EXPOSURE 
            | XCB_EVENT_MASK_RESIZE_REDIRECT }; 

xcb_create_window(
    connection, 
    XCB_COPY_FROM_PARENT, 
    window, 
    screen->root, 
    0, 0, 
    800, 600, 
    0, 
    XCB_WINDOW_CLASS_INPUT_OUTPUT, 
    screen->root_visual, 
    mask, valwin); 
xcb_map_window(connection, window); 
xcb_flush(connection); 

在事件循環,則可以繼續調整大小的軌跡:

xcb_generic_event_t *event; 
uint16_t width = 0, height = 0; 
while ((event = xcb_wait_for_event(connection)) != NULL) { 
    switch (event->response_type & ~0x80) { 
    case XCB_EXPOSE: { 
     /* ... */ 
     break; 
    } 
    case XCB_RESIZE_REQUEST: { 
     auto resize = (xcb_resize_request_event_t*) event; 
     if (resize->width > 0) width = resize->width; 
     if (resize->height > 0) height = resize->height; 
     break; 
    } 
    default: 
     break; 
    } 
    free(event); 
    xcb_flush(connection); 
} 

請注意,我不知道這是否例如,使用xcb_configure_window從應用程序代碼啓動調整大小時會發出事件。我從來沒有測試過它,只是在xcb_configure_window的包裝函數中更新widthheight

相關問題