Положение окна в Xlib - PullRequest
       100

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

6 голосов
/ 27 сентября 2010

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

Ответы [ 4 ]

8 голосов
/ 29 мая 2014

Компоненты 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 сохраняют окно в его текущей позиции.Таким образом, эти координаты обоснованно считаются положением окна.

6 голосов
/ 23 октября 2010

Использование Xlib:

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

Существует также много другой информации, которая поставляется с XWindowAttributes.Смотри здесь .

4 голосов
/ 27 сентября 2010

Используйте XTranslateCoordinates (или эквивалент xcb) для перевода 0,0 в окне в координаты корневого окна.

1 голос
/ 28 апреля 2018

Это то, что вы бы сделали с 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
...