xdotool: So suchen Sie nach Fenstern nach Titel und Klasse mit unterschiedlichen Mustern (ähnlich wie bei AutoHotkey)

10

Mit xdotool können Sie mit dem Unterbefehl search nach Windows suchen. Ich muss ein Fenster suchen, das die Klasse 'gvim' und den Titel mit dem Wort 'TODO' enthält. Wie mache ich das?

Was ich versucht habe:

  • Sie können dies tun xdotool search --name --class, es wird jedoch nur ein Muster für Name und Titel akzeptiert .
  • xdotool unterstützt die Befehlsverkettung, aber ich konnte keine Möglichkeit finden, zwei Suchaufrufe zu verketten - der zweite überschreibt einfach den ersten.
t7ko
quelle
xdotoolsaugt ... das ist so eine einfache Operation und es gibt keine Möglichkeit, es elegant zu machen.
Yan King Yin

Antworten:

13

Meine xdotool-Hilfe informiert mich darüber, dass Ihre beiden Switches identisch sind (xdotool Version 3.20150503.1).

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

und als solche macht nichts. Mein xdotool macht dasselbe wie deins mit dem Ersetzen des Fensterstapels, also habe ich es mit einem Shell-Skript gemacht. Ein Shell-Skript, das das tut, was Sie wollen, wird unten geliefert:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

Die Sternchen in der if-Anweisung sind vorhanden, um eine Teilstring-Übereinstimmung für durchzuführen TODO, damit sie überall im Titel auftreten kann.

DS
quelle
Ja, sorry, ein Druckfehler, ich meinte - Name und - Klasse. Wird jetzt behoben.
t7ko
@DS können Sie sagen, warum xdotool search --class "gedit" jetzt nur für gedit funktioniert, aber für jedes andere Fenster? Gleiche Geschichte mit dem Dienstprogramm xprop.
Gonki
6

Ich konnte eine Kurz- und Unix-Lösung identifizieren:

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)
t7ko
quelle
3

Hier ist eine weitere Lösung, die dem UNIX-Weg entspricht!

Auf den ersten Blick ist es nicht so schön wie deins, @ t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

Aber ertrage es mit mir! Es ist eine verborgene Schönheit darin.

Kurz gesagt, es

  1. hat eine lineare Struktur anstelle einer Baumstruktur, wie eine anstelle von zwei Dimensionen
  2. verwendet eine bekanntere Shell-Syntax .
  3. beantwortet tatsächlich Ihre Frage: Es findet das Fenster.

(Ob diese Punkte Vorteile sind, hängt vom Kontext ab - ignorieren wir diesen Aspekt einfach * .)

Ich werde den gleichen Code in einem strukturierteren Layout unten zeigen, um das Verständnis Schritt für Schritt zu erleichtern.
Beachten Sie jedoch, dass der Einzug den Befehl erklären soll - er zeigt keine Verschachtelung an oder so, alles ist immer noch eine lineare UNIX-Pipeline.

Der gleiche Befehl, nur nach den pipes ( |) geteilt:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
    sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

Der vollständige Befehl gibt, wie oben gezeigt, die Pixelposition des gvimFensters an und gibt Pixelkoordinaten relativ zur oberen linken Ecke des aktuellen (möglicherweise virtuellen) Bildschirms zurück x,y, wie 42,433oder vielleicht, -5375,-3809wenn er sich auf dem ersten von vier mal vier virtuellen Bildschirmen befindet und der aktuelle ist irgendwo unten auf der rechten Seite.

Im Moment werde ich den Befehl verkürzen, um nur eine X11-Fenster-ID zu finden - vielleicht ist das alles, was das OP tatsächlich benötigt, nicht sicher:

Die verkürzte Befehlspipeline, ein separater Shell-Befehl in jeder Zeile:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO'

Jetzt beginnt es lesbar zu werden:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool search --all --pid {} --name 'TODO' 

Der xdotoolBefehl searchwird verwendet, um Fenster mit der " Klasse " zu finden gvim, wobei einige "interne" Fenster weggelassen werden. Das Ergebnis wird als PID's (Prozesskennungen) aufgeführt.
Für jeden PID, xargsläuft eine andere xdotool search, den „Namen“ für unser Beispiel - Pattern - Prüfung TODO- nach für die Überprüfung PID.

(Nur für den Fall: Die Zeilen, die mit \- als Fortsetzungszeilen bezeichnet - enden, müssen tatsächlich mit \und ohne Leerzeichen vor der neuen Zeile enden.)

Nun zurück zum ursprünglichen Befehl:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool \
        search --all --pid {} --name 'TODO' \
        getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

Der verbleibende Teil listet einige Details zum Fenster auf, einschließlich der Position. Der sedBefehl stimmt überein und gibt nur den x,yPositionswert zurück.

Beispiel: Führen Sie den Befehl oben auf meinem 16. virtuellen Bildschirm (4 x 4) mit einem "TODO" gvimauf Bildschirm 1 aus:

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*) Haftungsausschluss: Ich bevorzuge den Code von @ t7ko. Viel!

Volker Siegel
quelle
Verwenden --onlyvisibleist schön. Hat mir bei einem ähnlichen Problem geholfen. Thunderbird kann mit 14 Fenstern beginnen und nur ein oder zwei befinden sich auf dem Desktop. Ich habe keine Ahnung, wofür die anderen sind. Übrigens können nur sichtbare Mittel angezeigt werden - nicht nur sofort auf dem aktuellen Desktop.
Joe
1

Kurze und elegante Antwort (die verwendet wmctrl):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

Die resultierende Fenster-ID ist hexadezimal, daher müssen Sie sie in eine Dezimalzahl konvertieren (verwendet von xdotool):

printf "%d\n" $result

Dann kannst du was auch immer machen xdotool.

Yan König Yin
quelle
1
wmctrlHandbuch sagt, dass -lnicht Fensterklasse druckt, nur Titel; Ihr Code-Snippet löst also nicht mein Problem "Suche nach Titel UND Klasse".
t7ko
1
wmctrl -lxbietet die Klasse.
David.perez