Estou tentando escrever um script que abra vários programas e mova/redimensione as janelas na tela.
Por exemplo,
#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1
Eu executo este script, a janela é maximizada e movida um pouco para a direita. Mas, se eu substituir zim
por firefox
ou acroread
, isso não moverá/redimensionará a janela.
Funciona se eu digitar wmctrl
no terminal, mas gostariadentro do roteiro. Acho que deve ter algo a ver com a forma como firefox
se lembra do seu lugar na tela.
Editar:eu coloquei
firefox
wmctrl -lG
dentro do script e recebo a seguinte saída:
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
Isso significa que o script não sabe que o Firefox foi iniciado.
Responder1
O problema
A questão é que na combinação de comandos que você utiliza, você precisa ter “sorte” de que a janela do aplicativo apareça a tempo, para que os wmctrl
comandos tenham sucesso.
Seus comandos possivelmente funcionarão na maior parte do tempo para aplicativos leves, iniciando rapidamente, mas falharão em outros, como Inkscape, Firefox ou Thunderbird.
Vocêpodebuild- em uma pausa de 5 ou dez segundos, como você fez (mencionado nos comentários), mas ou você tem que esperar mais do que o necessário, ou ele irá quebrar afinal se o seu processador estiver ocupado e a janela estiver "mais tarde que o normal" .
A solução
A solução então é incluir um procedimento em seu script, aguardando a janela aparecer na saída do wmctrl -lp
, e posteriormente executar o comando para maximizar a janela.
No python
exemplo abaixo, usei xdotool
para redimensionar a janela, um pouco mais robusto na minha experiência do que wmctrl
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 de ambos
wmctrl
exdotool
:sudo apt-get install wmctrl xdotool
Copie o script em um arquivo vazio e 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
wmctrl
comando para buscar a lista de janelas ser executado muito cedo. Se você tiver problemas, precisamos adicionar umtry
/except
para todo o procedimento. Se sim, por favor me avise.