是否有可靠的方法来获得顶部的内部和外部矩形 使用XCB / Xlib的级别窗口? (IOW框架和客户端矩形)。
这是我试过的:
xcb_get_geometry始终返回初始尺寸 窗口调整大小(给出了什么?)
我想我会反复调用xcb_query_tree,直到找到 窗口的框架窗口 - 是这样做的吗?我想ICCCM / EWMH 应该提供这个,但找不到任何东西。还有别的吗? 标准/非标准?无论如何,这不起作用 compiz / ubuntu10因为xcb_query_tree将客户端窗口报告为 拥有root = parent(在正常的ubuntu下,窗口正常运行) 重设父)。
xcb_translate_coordinates()似乎是唯一可靠的方法 在2007年获得基于根的coords [1] - 情况仍然如此吗?即是 XCB_CONFIGURE_NOTIFY与WM非标准?
[1] http://fixunix.com/xwindows/91652-finding-position-top-level-windows.html
答案 0 :(得分: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
从应用程序代码启动调整大小时,我不确定是否会发出此事件。我从未对其进行过测试,只更新了width
的包装函数中的height
和xcb_configure_window
。