Xlib中的窗口位置

时间:2010-09-27 18:55:21

标签: x11 xlib xcb

如何使用普通的'xlib(或全新的XCB)获得相对于根窗口(即整个屏幕)的顶级窗口位置?

4 个答案:

答案 0 :(得分:8)

XGetWindowAttributes返回的结构的x,y组件是相对于窗口父级的原点。这与屏幕左上角的相对不同。

调用XTranslateCoordinates传递根窗口,0,0给出窗口相对于屏幕的坐标。

我发现如果我写:

int x, y;
Window child;
XWindowAttributes xwa;
XTranslateCoordinates( display, window, root_window, 0, 0, &x, &y, &child );
XGetWindowAttributes( display, window, &xwa );
printf( "%d %d\n", x - xwa.x, y - xwa.y );

printf显示的值是那些传递给XMoveWindow的值,使窗口保持在当前位置。因此,这些坐标被合理地认为是窗口的位置。

答案 1 :(得分:6)

使用Xlib:

XWindowAttributes xwa;
XGetWindowAttributes(display, window, &xwa);
printf("%d %d\n", xwa.x, xwa.y);

XWindowAttributes附带了许多其他信息。请参阅here

答案 2 :(得分:4)

使用XTranslateCoordinates(或等效的xcb)将窗口上的0,0转换为根窗口坐标。

答案 3 :(得分:1)

这就是你用XCB做的事情:

auto geom = xcb_get_geometry(xcb_connection(), window);
auto offset = xcb_translate_coordinate(xcb_connection(), window, rootwin, geom->x, geom->y);

offset->dst_x // top-level window's x offset on the screen
offset->dst_y // top-level window's y offset on the screen
geom->width   // top-level window's width
geom->height  // top-level window's height