wmctrl no puede cambiar el tamaño/mover ventanas dentro del script

wmctrl no puede cambiar el tamaño/mover ventanas dentro del script

Estoy intentando escribir un script que abra un montón de programas y mueva/cambie el tamaño de las ventanas en la pantalla.

Por ejemplo,

#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1

Ejecuto este script, la ventana está maximizada y movida un poco hacia la derecha. Pero, si reemplazo zimpor firefoxo acroread, esto no logra mover/cambiar el tamaño de la ventana.

Funciona si escribo wmctrlen la terminal, pero me gustaríadentro del guión. Creo que debe tener algo que ver con la forma en que firefoxrecuerda su lugar en la pantalla.

Editar:Coloqué

firefox
wmctrl -lG

dentro del script y obtengo el siguiente resultado:

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

Esto significa que el script no sabe que se ha iniciado Firefox.

Respuesta1

La cuestión

El problema es que en la combinación de comandos que utilices, debes tener "suerte" de que la ventana de la aplicación aparezca a tiempo, para que los wmctrlcomandos tengan éxito.
Es posible que sus comandos funcionen la mayor parte del tiempo para aplicaciones ligeras y se inicien rápidamente, pero fallarán en otras, como Inkscape, Firefox o Thunderbird.

podercree un descanso de 5 o diez segundos, como lo hizo usted (mencionado en los comentarios), pero tiene que esperar más de lo necesario o, después de todo, se romperá si su procesador está ocupado y la ventana es "más tarde de lo habitual". .

La solución

La solución entonces es incluir un procedimiento en su script, esperar a que aparezca la ventana en la salida de wmctrl -lpy posteriormente ejecutar el comando para maximizar la ventana.

En el pythonsiguiente ejemplo, solía xdotoolcambiar el tamaño de la ventana, un poco más robusto en mi experiencia que wmctrlhacer el trabajo:

#!/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

Cómo utilizar

  1. El guión necesita ambos wmctrly xdotool:

    sudo apt-get install wmctrl xdotool
    
  2. Copie el script en un archivo vacío, guárdelo comoresize_window.py

  3. Pruebe: ejecute el script con la aplicación como argumento, por ejemplo:

    python3 /path/to/resize_window.py firefox
    

Notas

  • Si lo usa como script en Aplicaciones de inicio, existe una pequeña posibilidad de que el wmctrlcomando para recuperar la lista de ventanas se ejecute demasiado pronto. Si tiene problemas, debemos agregar un try/ exceptpara todo el procedimiento. Si es así, por favor hágamelo saber.

información relacionada