Как переместить окно за экран с помощью 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?