Я пытаюсь записать сценарий, который открывает набор программ и перемещается/изменяет размер окна в экран.
Например,
#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1
Я запускаю этот скрипт, окно максимизируется и переместилось немного направо. Но, если я заменяю zim
firefox
или acroread
, этому не удается переместиться/изменить размер окно.
Это действительно работает, если я ввожу wmctrl
в терминале, но, я хотел бы его в сценарии. Я думаю, что это должно иметь некоторое отношение к пути firefox
помнит его место на экране.
Править: Я поместил
firefox
wmctrl -lG
в сценарии и я получаю следующий вывод:
0x03800032 0 1168 347 750 731 briareos emacs@briareos
0x02a00002 0 -2020 -1180 1920 1080 briareos XdndCollectionWindowImp
0x02a00005 0 0 24 47 1056 briareos unity-launcher
0x02a00008 0 0 0 1920 24 briareos unity-panel
0x02a0000b 0 -420 -300 320 200 briareos unity-dash
0x02a0000c 0 -420 -300 320 200 briareos Hud
0x03c00011 0 59 52 900 1026 briareos Notes - Zim
Это означает, что сценарий не знает, что Firefox был запущен.
Проблема - то, что в комбинации команд Вы используете, необходимо "посчастливилось" иметь окно приложения, появляются вовремя, для wmctrl
команды, чтобы быть успешным.
Ваши команды будут возможно работать большую часть времени на легкие приложения, запуская быстро, но повредятся на других, как Inkscape, Firefox или Thunderbird.
Можно создать - в повреждении 5 или десяти секунд, как Вы сделал (упомянутый в комментариях), но или необходимо ожидать дольше затем необходимые, или оно повредится, в конце концов, если процессор будет занят, и окно "позже чем обычно".
Решение затем состоит в том, чтобы включать процедуру в Ваш сценарий, ожидающий окна для появления в выводе wmctrl -lp
, и впоследствии выполненный команда для максимизации окна.
В python
пример ниже, я использовал xdotool
изменить размер окна, более устойчивого, по моему опыту, чем wmctrl
сделать задание:
#!/usr/bin/env python3
import subprocess
import getpass
import time
import sys
app = sys.argv[1]
# to only list processes of the current user
user = getpass.getuser()
get = lambda x: subprocess.check_output(x).decode("utf-8")
# get the initial window list
ws1 = get(["wmctrl", "-lp"]); t = 0
# run the command to open the application
subprocess.Popen(app)
while t < 30:
# fetch the updated window list, to see if the application's window appears
ws2 = [(w.split()[2], w.split()[0]) for w in get(["wmctrl", "-lp"]).splitlines() if not w in ws1]
# see if possible new windows belong to our application
procs = sum([[(w[1], p) for p in get(["ps", "-u", user]).splitlines() \
if app[:15].lower() in p.lower() and w[0] in p] for w in ws2], [])
# in case of matches, move/resize the window
if len(procs) > 0:
subprocess.call(["xdotool", "windowsize", "-sync", procs[0][0] , "100%", "100%"])
break
time.sleep(0.5)
t = t+1
Для сценария нужны оба wmctrl
и xdotool
:
sudo apt-get install wmctrl xdotool
Скопируйте сценарий в пустой файл, сохраните его как resize_window.py
Тестовый прогон сценарий с приложением как аргумент, например:
python3 /path/to/resize_window.py firefox
wmctrl
управляйте для выборки выполнений списка окна слишком рано. Если Вы сталкиваетесь с проблемой, мы должны добавить a try
/except
для целой процедуры. Если так, сообщите мне.