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
- hat eine lineare Struktur anstelle einer Baumstruktur, wie eine anstelle von zwei Dimensionen
- verwendet eine bekanntere Shell-Syntax .
- 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 gvim
Fensters an und gibt Pixelkoordinaten relativ zur oberen linken Ecke des aktuellen (möglicherweise virtuellen) Bildschirms zurück x,y
, wie 42,433
oder vielleicht, -5375,-3809
wenn 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 xdotool
Befehl search
wird 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
, xargs
lä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 sed
Befehl stimmt überein und gibt nur den x,y
Positionswert zurück.
Beispiel: Führen Sie den Befehl oben auf meinem 16. virtuellen Bildschirm (4 x 4) mit einem "TODO" gvim
auf 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!
xdotool
saugt ... das ist so eine einfache Operation und es gibt keine Möglichkeit, es elegant zu machen.