【问题标题】:How to get inner and outer window dimensions with Xlib/XCB?如何使用 Xlib/XCB 获取内部和外部窗口尺寸?
【发布时间】:2015-09-21 02:16:49
【问题描述】:

是否有可靠的方法来获取顶部的内部和外部矩形 XCB/Xlib 的水平窗口? (IOW 框架和客户矩形)。

这是我尝试过的:

  • xcb_get_geometry 始终返回初始尺寸,即使在 窗口被调整大小(什么给出?)

  • 我想我会反复调用 xcb_query_tree 直到找到 窗口的框架窗口 - 这是这样做的方法吗?我认为 ICCCM/EWMH 应该提供这个但找不到任何东西。有没有其他的 标准/非标准?无论如何,这不起作用 compiz/ubuntu10 因为 xcb_query_tree 将客户端窗口报告为 拥有root = parent(在正常的ubuntu wm下,窗口正常 重生)。

  • xcb_translate_coordinates() 似乎是唯一可靠的方法 在 2007 年获得基于根的坐标 [1] - 仍然是这种情况吗? IE。是 XCB_CONFIGURE_NOTIFY 非标准与 WM?

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

【问题讨论】:

    标签: xlib xorg xserver xcb


    【解决方案1】:

    这是一个部分答案,因为它只解释了如何找到窗口的内部尺寸。我也不确定这是否是规范的方法,但它对我有用。

    创建窗口时可以订阅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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多