Как переместить окно за экран с помощью wmctrl

Я пытаюсь программно переместить окно, чтобы оно было частично на экране. Например, если щелкнуть строку заголовка VLC и перетащить ее, чтобы была видна только половина окна, то все работает отлично.

Когда я вывожу результаты wmctrl -lG это работает просто отлично:

0x04a00011  0 -293 138  600  420  HEVM002 VLC media player

Тем не менее, когда я затем перемещаю его обратно на экран и пытаюсь повторить его положение, это не работает и обрезает окно на противоположную сторону:

wmctrl -r "VLC media player" -e 0,-200,0,800,600

Я протестировал пару оконных менеджеров, и, кажется, работает нормально на xfwm, но НЕ на compiz. Есть ли флаг или что-то в этом роде, которое я могу установить, чтобы разрешить перемещение окон вне экрана?

1 ответ

Решение

При работе под оконным менеджером это полностью зависит от оконного менеджера. Существует ли флаг для принудительного ввода частичных положений вне экрана, зависит от того, какой это оконный менеджер.

Единственный способ добиться этого, не зависящий от оконного менеджера, - сделать окно override_redirect окно. Но, конечно, это означает, что окно больше не управляется. Если снова сделать его обычным окном, то оконный менеджер снова сможет им управлять, что, вероятно, опять же, в зависимости от оконного менеджера, означает, что оно снова должно быть в границах.

Тем не менее, глядя на исходный код wmctrl, он использует _NET_MOVERESIZE_WINDOW если поддерживается оконным менеджером и возвращается к XMoveResizeWindow (или аналогичный) в противном случае. Однако в первом случае он преобразует значения позиции в unsigned long Во-первых, это означает, что любые отрицательные значения будут потеряны. Во втором случае отрицательные значения, кажется, сигнализируют "не двигайся", так что не повезло и там.

Вы можете попробовать использовать xdotool windowmove вместо этого, который будет иметь дело с отрицательными значениями правильно. Может также рассмотреть вопрос об ошибке в wmctrl?

Другие вопросы по тегам