Ich versuche, ein Skript zu schreiben, das eine Reihe von Programmen öffnet und die Fenster auf dem Bildschirm verschiebt/ihre Größe ändert.
Zum Beispiel,
#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1
Ich führe dieses Skript aus, das Fenster wird maximiert und etwas nach rechts verschoben. Wenn ich jedoch zim
durch firefox
oder ersetze acroread
, schlägt das Verschieben/Ändern der Fenstergröße fehl.
Es funktioniert, wenn ich es wmctrl
im Terminal eingebe, aber ich möchte esim Skript. Ich denke, es muss etwas mit der Art und Weise zu tun haben, wie es firefox
sich seinen Platz auf dem Bildschirm merkt.
Bearbeiten:Ich platzierte
firefox
wmctrl -lG
im Skript und ich erhalte die folgende Ausgabe:
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
Das bedeutet, dass das Skript nicht weiß, dass Firefox gestartet wurde.
Antwort1
Das Thema
Das Problem besteht darin, dass Sie bei der Kombination der von Ihnen verwendeten Befehle „Glück“ haben müssen, damit das Anwendungsfenster rechtzeitig angezeigt wird, damit die wmctrl
Befehle erfolgreich sind.
Ihre Befehle funktionieren möglicherweise die meiste Zeit bei leichten Anwendungen, die schnell starten, aber bei anderen, wie Inkscape, Firefox oder Thunderbird, funktionieren sie nicht.
DudürfenBauen Sie eine Pause von 5 oder 10 Sekunden ein, wie Sie es getan haben (in den Kommentaren erwähnt), aber entweder müssen Sie länger als nötig warten, oder es bricht schließlich ab, wenn Ihr Prozessor beschäftigt ist und das Fenster „später als üblich“ ist.
Die Lösung
Die Lösung besteht dann darin, eine Prozedur in Ihr Skript einzufügen, zu warten, bis das Fenster in der Ausgabe von erscheint wmctrl -lp
, und anschließend den Befehl auszuführen, um das Fenster zu maximieren.
Im python
folgenden Beispiel habe ich xdotool
die Größe des Fensters geändert, was meiner Erfahrung nach etwas robuster ist, als wmctrl
die Arbeit zu erledigen:
#!/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
Wie benutzt man
Das Skript benötigt beides
wmctrl
undxdotool
:sudo apt-get install wmctrl xdotool
Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
resize_window.py
Testen Sie das Skript. Führen Sie es mit der Anwendung als Argument aus, zum Beispiel:
python3 /path/to/resize_window.py firefox
Anmerkungen
- Wenn Sie es als Skript in Startanwendungen verwenden, besteht eine geringe Chance, dass der
wmctrl
Befehl zum Abrufen der Fensterliste zu früh ausgeführt wird. Wenn Sie auf ein Problem stoßen, müssen wir für das gesamte Verfahren eintry
/ hinzufügenexcept
. Wenn ja, lassen Sie es mich bitte wissen.