xwininfo und xprop erlauben es, abzurufen, was Sie wollen, aber es ist ein wenig knifflig.
xwininfo erlaubt es, alle bekannten Fenster abzurufen, und xprop, X nach einer einzelnen Fenster-ID für Ihren _NET_WM_PID-Parameter abzufragen.
Bisher wäre ein hackiger Weg, es zu tun:
#!/bin/sh
findpid=$1
known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')
for id in ${known_windows}
do
xp=$(xprop -id $id _NET_WM_PID)
if test $? -eq 0; then
pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')
if test "x${pid}" = x${findpid}
then
echo "Windows Id: $id"
fi
fi
done
Ergebnis:
mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e
Wie Sie sehen werden, kann ein einzelner Prozess eine bestimmte Anzahl bekannter Fenster haben, selbst wenn Sie nur eines auf Ihrem Bildschirm sehen.
Vielleicht sollten Sie sich diese Werkzeugquellen besorgen, um zu machen, was Sie wollen.
Sie können PIDs mit wmctrl nachschlagen eigentlich auch, und ich denke, das ist ein besserer Weg, es zu tun. xwininfo gibt alle Arten von Objekten zurück, die wie Fenster aussehen, aber Sie werden sie nicht wirklich auf Ihrem Desktop finden.
Wenn Sie man wmctrl tun , finden Sie das wmctrl -l listet alle Fenster auf, die tatsächlich auf Ihrem Desktop sichtbar sind, mit (am wichtigsten) ihren Fenster-IDs und Titel . -p fügt PIDs hinzu und -x fügt Fensterklassen hinzu .
Wie das Handbuch sagt (RTFM, richtig? :D), kann wmctrl auch einige davon durchsuchen und ein Fenster aktivieren, das der Suche entspricht. Ich habe jedoch keine Ahnung, was bestimmt, welche aller möglichen Übereinstimmungen zurückgegeben werden. Andererseits können Sie die bereitgestellte Auflistungsfunktion verwenden, um einen Wrapper zu schreiben, der die Suche besser macht und möglicherweise auf einigen anderen Eigenschaften basiert (z. B. dem Zeitstempel des letzten Zugriffs auf das Fenster), die Sie durch Abfragen der bereitgestellten
Die folgenden Codezeilen geben die neueste Instanz eines Mate-Terminal-Klassenfensters zurück:
XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm #save tmp files to memory to make it faster
LST=`mktemp` #tmp file to store our listing
wmctrl -lx | awk -F' ' '{printf("%s\t%s \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n") }' > $LST #pretty-print our listing of windows into the tmp file
#To each line of listing, prepend a timestamp acquired via an xprop call
#Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`; TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST #delete tmp file
Wie auch immer, für das, was Sie beschreiben, was Sie bauen – wenn ich Sie wäre, würde ich herausfinden, welche Klasse von Fenstern Ihr gewünschter Befehl generiert, und meine Suche dann darauf basieren, anstatt auf PIDs. Alternativ könnten Sie davon ausgehen, dass der Befehl CMD möglicherweise Fenster mit einem Klassennamen generiert, der CMD enthält.
Nachdem Sie Ihre Zeile gefunden haben, sollten Sie die Fenster-ID verwenden
um das Fenster per wmctrl zu aktivieren.
Hoffe das hilft.
Eine Randbemerkung:Ich habe festgestellt, dass xdotool auch auf der Grundlage von Klassennamen und Fenstertiteln suchen kann, aber es ist extrem langsam . Auf meinem Computer ist dieses Bash-Skript (das eine ganze Reihe externer Dienstprogramme aufruft) zehnmal so schnell wie die kompilierte Alternative xdotool :P.
Sie können Folgendes verwenden:
xdotool getwindowfocus getwindowname
(Auch:Sie müssen diese gut klingenden Namen nicht durch irgendetwas ersetzen.)