Как получить положение окна верхнего уровня относительно корневого окна (т. е. всего экрана), используя обычный xlib (или совершенно новый XCB)?
Положение окна в Xlib
Ответы (4)
Компоненты x,y структуры, возвращаемой XGetWindowAttributes, относятся к происхождению родителя окна. Это не то же самое, что относительно верхней левой части экрана.
Вызов 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 сохраняют окно в его текущей позиции. Таким образом, эти координаты разумно считаются положением окна.
person
Robert J. Harwick
schedule
29.05.2014
Использование Xlib:
XWindowAttributes xwa;
XGetWindowAttributes(display, window, &xwa);
printf("%d %d\n", xwa.x, xwa.y);
Есть также много другой информации, которая поставляется с XWindowAttributes
. См. здесь.
person
André Wagner
schedule
23.10.2010
Используйте XTranslateCoordinates (или эквивалент xcb), чтобы преобразовать 0,0 в окне в корневые координаты окна.
person
Havoc P
schedule
27.09.2010
Вот что бы вы сделали с 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
person
gatis paeglis
schedule
28.04.2018