首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Xlib/XCB获取内外窗口尺寸?

如何使用Xlib/XCB获取内外窗口尺寸?
EN

Stack Overflow用户
提问于 2015-07-03 09:34:25
回答 1查看 1.7K关注 0票数 4

是否有可靠的方法可以获得具有XCB/Xlib的顶级窗口的内外矩形?(IOW框架和客户端矩形)。

以下是我尝试过的:

  • xcb_get_geometry总是在窗口调整大小之后返回初始维度(什么会产生?)
  • 我想我会反复打电话给xcb_query_tree,直到我找到窗口的框架窗口--就是这样做的吗?我认为ICCCM/EWMH应该提供这个,但什么也找不到。对此还有其他标准/非标准吗?无论如何,这并不适用于compiz/ ubuntu 10,因为xcb_query_tree将客户端窗口报告为具有root = parent (在普通的ubuntu下,该窗口得到了正确的修复)。
  • xcb_translate_coordinates()似乎是2007年获得基于根的coords1的唯一可靠方法也就是说,XCB_CONFIGURE_NOTIFY是否不符合WMs标准?

1

EN

回答 1

Stack Overflow用户

发布于 2016-03-05 08:44:17

这是一个部分的答案,因为它只解释了如何找到一个窗口的内在维度。另外,我不确定这是否是典型的方法,但它对我有效。

您可以在创建窗口时订阅XCB_EVENT_MASK_RESIZE_REDIRECT事件:

代码语言:javascript
复制
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);

然后,在事件循环中,可以跟踪大小大小:

代码语言:javascript
复制
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从应用程序代码启动调整大小时是否会发出此事件。我从未测试过它,只需在包装器函数中更新widthheight中的xcb_configure_window

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31203412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档