wmctrl falha ao redimensionar / mover janelas dentro do script

2

Estou tentando escrever um script que abre vários programas e move / redimensiona 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 corro 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á nem redimensionará a janela.

Funciona se eu digitar wmctrl no terminal, mas gostaria que o estivesse dentro do script . Eu acho que deve ter algo a ver com a maneira como firefox se lembra de seu lugar na tela.

Editar: 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 lançado.

    
por Magicsowon 07.09.2016 / 20:58

1 resposta

3

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

  1. O script precisa dos dois wmctrl e xdotool :

    sudo apt-get install wmctrl xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como resize_window.py

  3. 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 um try / except para todo o procedimento. Se sim, por favor me avise.
por Jacob Vlijm 07.09.2016 / 22:11