O que você vai encontrar em
Se você quiser primeiro chamar um aplicativo e, subsequentemente, colocar sua janela em uma posição e tamanho específicos, o tempo entre chamar o aplicativo e no momento em que a janela realmente aparecer , é imprevisível. Se o seu sistema estiver ocupado, pode ser significativamente mais longo do que se estiver ocioso.
Você precisa de uma maneira "inteligente" para garantir que o posicionamento / redimensionamento seja feito (imediatamente) depois que a janela aparecer .
Script para chamar um aplicativo, espere ele aparecer e posicione-o na tela
Com o script abaixo, você pode chamar um aplicativo e definir a posição e o tamanho em que ele deve aparecer com o comando:
<script> <application> <x-position> <y-position> <h-size> <v-size>
Alguns exemplos:
-
Para chamar
gnome-terminal
e redimensionar sua janela para 50% e colocá-la na metade direita:<script> gnome-terminal 840 0 50 100
Parachamar
gedit
,coloquesuajanelaàesquerdaechamegnome-terminal
,coloque-aàdireita(configurandoseuv-size
46%paradarumpoucodeespaçoentreasjanelas):<script>gedit0046100&&<script>gnome-terminal860046100
-
Para chamar o Inkscape, coloque sua janela no quarto esquerdo / superior da tela:
<script> inkscape 0 0 50 50
Oscriptecomousá-lo
instaleosdois
xdotool
ewmctrl
.Euuseiambospoisoredimensionamentocomwmctrl
podecausaralgumaspeculiaridadesem(especificamente)Unity
.sudoapt-getinstallwmctrlsudoapt-getinstallxdotool
- Copieoscriptabaixoemumarquivovazio,salve-ocomo
setwindow
(semextensão)em~/bin
;crieodiretório,senecessário. - Torneoscriptexecutável(!)
- Sevocêacaboudecriar
~bin
,execute:source~/.profile
Testeoscriptcomocomando(porexemplo,
setwindowgnome-terminal0050100
Emoutraspalavras:
setwindow<application><horizontal-position><vertical-position><horizontal-size(%)><vertical-size(%)>
Setudofuncionarbem,useocomandoondevocêprecisar.
Oscript
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])
while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
cmd3 = "xdotool windowsize --sync "+procs[0][0][1]+" "+sys.argv[4]+"% "+sys.argv[5]+"%"
cmd4 = "xdotool windowmove "+procs[0][0][1]+" "+sys.argv[2]+" "+sys.argv[3]
for cmd in [cmd1, cmd2, cmd3, cmd4]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
O que faz
Quando o script é chamado, ele:
- inicia o aplicativo
- fica de olho na lista de janelas (usando
wmctrl -lp
) - se uma nova janela aparecer, ele verifica se a nova janela pertence ao aplicativo chamado (usando
ps -ef ww
, comparando o pid da janela ao pid do aplicativo) - se assim for, define o tamanho e posição, de acordo com seus argumentos. No caso de um aplicativo não "aparecer" dentro de appr. 15 segundos, o script assume que o aplicativo não será executado devido a um erro. O script então termina para evitar a espera pela nova janela infinitamente.
Questão secundária
No Unity, quando você (re) posiciona e (re) dimensiona uma janela com wmctrl
ou xdotool
, a janela sempre manterá uma pequena margem para as bordas da tela, a menos que você a defina para 100%. Você pode ver isso na imagem (3) acima; enquanto a janela inkscape
foi colocada em x
position 0, você ainda pode ver uma pequena diferença entre o Iniciador Unity e a janela inkscape
.