wmctrl kann Fenster im Skript nicht in der Größe ändern/verschieben

wmctrl kann Fenster im Skript nicht in der Größe ändern/verschieben

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 zimdurch firefoxoder ersetze acroread, schlägt das Verschieben/Ändern der Fenstergröße fehl.

Es funktioniert, wenn ich es wmctrlim Terminal eingebe, aber ich möchte esim Skript. Ich denke, es muss etwas mit der Art und Weise zu tun haben, wie es firefoxsich 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 wmctrlBefehle 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 pythonfolgenden Beispiel habe ich xdotooldie Größe des Fensters geändert, was meiner Erfahrung nach etwas robuster ist, als wmctrldie 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

  1. Das Skript benötigt beides wmctrlund xdotool:

    sudo apt-get install wmctrl xdotool
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unterresize_window.py

  3. 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 wmctrlBefehl 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 ein try/ hinzufügen except. Wenn ja, lassen Sie es mich bitte wissen.

verwandte Informationen