O problema
O problema é que na combinação de comandos que você usa, você precisa ter "sorte" de ter a janela do aplicativo aparecendo no tempo, para que os comandos wmctrl
sejam bem-sucedidos.
Seus comandos possivelmente funcionarão a maior parte do tempo para aplicativos leves, iniciando rapidamente, mas afetarão outros, como Inkscape, Firefox ou Thunderbird.
Você pode construir um intervalo de 5 ou 10 segundos, como você fez (mencionado nos comentários), mas ou você tem que esperar mais tempo do que o necessário, ou ele vai quebrar depois de tudo se o seu o processador está ocupado e a janela está "mais tarde que o normal".
A solução
A solução, então, é incluir um procedimento no seu script, esperando que a janela apareça na saída de wmctrl -lp
e, subseqüentemente, execute o comando para maximizar a janela.
No exemplo python
abaixo, usei xdotool
para redimensionar a janela, um pouco mais robusto na minha experiência do que wmctrl
para fazer o trabalho:
#!/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
Como usar
-
O script precisa dos dois
wmctrl
exdotool
:sudo apt-get install wmctrl xdotool
-
Copie o script em um arquivo vazio, salve-o como
resize_window.py
-
Teste- execute o script com o aplicativo como argumento, por exemplo:
python3 /path/to/resize_window.py firefox
Notas
- Se você usá-lo como um script em Aplicativos de inicialização, há uma pequena chance de o comando
wmctrl
buscar a lista de janelas ser executado muito cedo. Se você tiver algum problema, precisamos adicionar umtry
/except
para todo o procedimento. Se sim, por favor me avise.