Установите правильное положение окна на X

Простой вопрос: как мне установить положение окна в X11 с учетом любого оформления, добавленного оконным менеджером?

Я знаю, что когда я создаю окно, оконный менеджер перенесет его в другое окно, поэтому, если я хочу получить «истинное» положение окна, мне нужно сделать что-то вроде этого

XGetGeometry(dpy, win, &root, &oldx, &oldy, &w, &h, &bw, &depth);
XTranslateCoordinates(dpy, win, root, oldx, oldy, &newx, &newy, &c);

Как же мне правильно использовать XMoveWindow() для перемещения окна так, чтобы newx и newy были тем, что мне нужно?

Спасибо.


c x11
person user2746401    schedule 29.11.2016    source источник
comment
Вы можете использовать свойство _NET_FRAME_EXTENTS для установки смещений.   -  person n. 1.8e9-where's-my-share m.    schedule 01.12.2016


Ответы (2)


Как было указано, вы не можете. Основная причина заключается в том, что XServer передает все ваши запросы геометрии оконному менеджеру (именно поэтому он считается другим типом клиента, и у вас не может быть одновременно запущено несколько оконных менеджеров), который решает, следует ли предоставляет их или нет. В случае жесткого оконного менеджера вам вообще нельзя будет перемещать окно. Или он может перемещать окно не так, как вы просили.

person Luis Colorado    schedule 02.12.2016
comment
Что ж, вы можете, как уже было указано, некоторые свойства в окне клиента помогают вам обнаруживать украшения, которые wm размещает вокруг, но это также средство, предоставляемое wms в целом, и вы не можете полностью доверять ему. - person Luis Colorado; 02.12.2016

Вы не можете. Период. Насколько мне известно, оконный менеджер вашей X-сессии может добавлять любое украшение, которое ему нравится, так что ваше окно может сдвигаться на несколько пикселей. Или он может решить оставить ваше исходное окно на месте и соответствующим образом сместить его украшение.

Есть некоторые вещи, которые вы можете попробовать и компенсировать, как то, что вы сделали, но нет гарантии, что это будет работать на всех оконных менеджерах.

Это, конечно, вызывает вопрос: зачем вы хотите это сделать?

person JvO    schedule 30.11.2016
comment
Я хочу иметь возможность получить положение окна (используя код в моем вопросе), сохранить его на потом, а затем восстановить положение окна точно так, как оно было. Я бы подумал, что это довольно распространенный тип вещей. - person user2746401; 30.11.2016
comment
Ах... тогда имело бы смысл вместо этого сохранить позицию украшающего окна. Вы должны иметь возможность получить родительское окно, используя XQueryTree. - person JvO; 30.11.2016