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 zim
por firefox
o acroread
, esto no logra mover/cambiar el tamaño de la ventana.
Funciona si escribo wmctrl
en la terminal, pero me gustaríadentro del guión. Creo que debe tener algo que ver con la forma en que firefox
recuerda 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 wmctrl
comandos 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.
Tú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 -lp
y posteriormente ejecutar el comando para maximizar la ventana.
En el python
siguiente ejemplo, solía xdotool
cambiar el tamaño de la ventana, un poco más robusto en mi experiencia que wmctrl
hacer 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
El guión necesita ambos
wmctrl
yxdotool
:sudo apt-get install wmctrl xdotool
Copie el script en un archivo vacío, guárdelo como
resize_window.py
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
wmctrl
comando para recuperar la lista de ventanas se ejecute demasiado pronto. Si tiene problemas, debemos agregar untry
/except
para todo el procedimiento. Si es así, por favor hágamelo saber.