Положение окна в Xlib

Как получить положение окна верхнего уровня относительно корневого окна (т. е. всего экрана), используя обычный xlib (или совершенно новый XCB)?


person el.pescado    schedule 27.09.2010    source источник


Ответы (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