Мне интересно, есть ли способ добиться эффекта сочетания клавиш Ctrl-Alt-Keypad в Unity, используя вместо этого команды терминала? Я хочу команду, которая устанавливает окно графического интерфейса на половину размера экрана, либо по левому, либо по правому краю.
В качестве фона я пишу скрипт, который запускается после входа в систему. Он использует Zenity, чтобы спросить, хочу ли я открыть свою среду разработки (GVim и IPython параллельно). Я пытался добиться двух окон одинакового размера для этих программ, используя set lines= columns=
в моих .gvimrc
и c.IPythonWidget.width =
и c.IPythonWidget.height =
в моем ipython_qtconsole_config.py
. Однако есть проблемы, связанные с этим подходом.
Ответы:
С чем вы столкнетесь
Если вы хотите сначала вызвать приложение, а затем поместить его окно в определенную позицию и размер, время между вызовом приложения и моментом, когда окно действительно появляется , непредсказуемо. Если ваша система занята, она может быть значительно дольше, чем в режиме ожидания.
Вам нужен «умный» способ убедиться , что размещение / изменение размеров делается (сразу) после того , как окно появляется .
Скрипт для вызова приложения, дождитесь его появления и разместите на экране
С помощью приведенного ниже сценария вы можете вызвать приложение и установить позицию и размер, в котором оно должно отображаться, с помощью команды:
Несколько примеров:
Чтобы вызвать
gnome-terminal
и изменить размер окна до 50%, поместите его в правую часть:Чтобы позвонить
gedit
, поместите его окно слева и позвонитеgnome-terminal
, разместите его справа (установив егоv-size
46%, чтобы оставить немного пространства между окнами):Чтобы вызвать Inkscape, поместите его окно в левую / верхнюю четверть экрана:
Сценарий и как его использовать
установить оба
xdotool
иwmctrl
. Я использовал оба, так как изменение размера сwmctrl
может вызвать некоторые особенности (в частности)Unity
.setwindow
(без расширения) в~/bin
; создайте каталог при необходимости.~bin
, запустите:source ~/.profile
Тестовый запуск скрипта с помощью команды (например)
Другими словами:
Если все работает нормально, используйте команду везде, где вам это нужно.
Сценарий
Что оно делает
Когда скрипт вызывается, он:
wmctrl -lp
)ps -ef ww
, сравнивая pid окна с pid приложения)Незначительная проблема
В Unity, когда вы (пере) перемещаете и (изменяете) размер окна с помощью
wmctrl
илиxdotool
, окно всегда будет держать небольшой отступ к границам экрана, если вы не установите его на 100%. Вы можете видеть это на изображении (3) выше; в то время какinkscape
окно было расположено вx
позиции 0, вы все еще можете видеть незначительный разрыв между Unity Launcher иinkscape
окном.источник
wmctrl
установили, командаwmctrl -lG | grep <windowname>
покажет вам выход , как:0x03600e4f 0 723 197 1114 563 jacob-System-Product-Name dimkeyboard.sh (~/Bureaublad) - gedit
. В этих выходных данных с 3-го по 6-й столбец показаны размеры: x, y, ширина, ширина, высота.appAndParams = sys.argv[1] app = appAndParams[0].split(' ', 1)[0] get = lambda x: subprocess.check_output(["/bin/bash", "-c",x]).decode("utf-8") ws1 = get("wmctrl -lp"); t = 0 subprocess.Popen(["/bin/bash", "-c", appAndParams])
</ pre> <edit> оно отказывается форматировать этот код. </ Edit>Фактическая команда, которую вы хотите это что-то вроде
Это заставит текущее окно занимать половину экрана (изменить
$HALF
размеры экрана) и привязываться к левой стороне. Для привязки вправо используйтеВы также можете поиграть,
wmctrl
чтобы получить идентификатор интересующего вас окна вместо того, чтобы использовать:ACTIVE:
. Я не могу помочь, хотя, так как это зависит от рассматриваемых окон. Посмотрите наman wmctrl
больше.Я написал сценарий для этого. Я не использую Unity, поэтому я не могу гарантировать, что он будет работать с ним, но я не вижу причин, почему бы и нет. Необходимо
wmctrl
,xdpyinfo
иdisper
должны быть установлены:Затем сохраните приведенный ниже скрипт как
~/bin/snap_windows.sh
, сделайте его исполняемым,chmod a+x ~/bin/snap_windows.sh
и вы сможете запуститьДля привязки к правой стороне. Используйте
l
для левой стороны и без аргументов, чтобы развернуть окно. Обратите внимание, что оно запускается в текущем окне, поэтому вам нужно назначить ему ярлык, если вы хотите, чтобы он работал на любом другом устройстве, кроме терминала.Сценарий немного сложнее, чем вы просите, потому что я написал его для работы как с одним, так и с двумя мониторами.
источник
Вы можете сделать это используя
xdotool
.Для установки
xdotool
вы можете запустить:Затем, чтобы отправить Ctrl+ Alt+ <keypad_key>нажатие в
X
окно терминала, вы можете запустить:* <keypad_key_value> = значение клавиши клавиатуры в списке ниже
Чтобы запустить программу с графическим интерфейсом и отправить нажатие клавиши в ее
X
окно (которое в данном случае является активным окном во время выполненияxdotool
команды), вы можете запустить:* <команда> = команда, которая открывает окно, в которое вы хотите отправить нажатие клавиши; <delay> = время ожидания в миллисекундах перед отправкой нажатия клавиши; <keypad_key_value> = значение клавиши клавиатуры в списке ниже
Обратите внимание, что в большинстве случаев вам нужно будет запустить команду, которую вы выдаете, как отдельный процесс (например, запустив
nohup <command> &
вместо того, что<command>
в примере выше), иначеxdotool
не будет выполняться до<command>
, пока не завершится выполнение.Также вам нужно будет установить некоторую задержку, в противном случае нажатие клавиши будет отправлено до того, как целевое окно будет полностью загружено
X
(задержка500ms
должна быть).Возможные значения для
<keypad_key_value>
:90
87
88
89
83
84
85
79
80
81
Как правило большого пальца, чтобы узнать значение любой клавиши на клавиатуре в
X
среде, можно запуститьxev
и нажать клавишу, чтобы вывести ее значение внутри терминала.источник
Я создал приложение под названием Worksets (на github ) для Unity, которое позволяет вам сделать это легко через графический интерфейс пользователя - это бесплатно и с открытым исходным кодом.
По сути, это оболочка для решений wmctrl и xdotool, перечисленных здесь как ответы, и предоставляет простой способ быстрого создания и сохранения таких настроек.
источник
У меня нет представителя, чтобы напрямую комментировать превосходный пост Якоба Влиима, но я изменил скрипт, чтобы разрешить запуск приложения с аргументами (необходимо использовать
setwindow
сgedit --new-window
). Изменить:чтобы:
источник
Я поиграл со сценарием Тердона сверху и добавил несколько новых вещей (возможность выбирать монитор и устанавливать высоту для каждого монитора). Я думаю, что это можно расширить, добавив больше мониторов. Надеюсь, другие найдут это полезным.
Основной синтаксис:
Где prog_name - это то, что вы сохранили этот код; монитор - это номер монитора, например, 1 или 2; л / р / м слева или справа или макс; а window_name - это имя (или часть его имени) целевого окна.
Например:
Bash скрипт
источник