xwininfo e xprop permettono di recuperare quello che vuoi, ma è un po' complicato.
xwininfo consente di recuperare tutte le finestre conosciute e xprop di interrogare X su un singolo ID finestra per il tuo parametro _NET_WM_PID.
Finora, un modo complicato per farlo sarebbe:
#!/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
Risultato:
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
Come vedrai, un singolo processo può avere un certo numero di finestre conosciute, anche se ne vedi solo una sullo schermo.
Forse dovresti ottenere queste fonti di strumenti per fare quello che vuoi.
puoi cercare i PID con wmctrl anche, in effetti, e penso che sia un modo migliore per farlo. xwininfo restituirà tutti i tipi di entità che sembrano finestre, ma in realtà non le troverai sul tuo desktop.
Se esegui man wmctrl , troverai che wmctrl -l elenca tutte le finestre che sono effettivamente visibili sul tuo desktop con (soprattutto) i loro ID finestra e titoli . -p aggiunge PID e -x aggiungerà classi finestra .
Come dice il manuale ( RTFM, giusto? :D), wmctrl può anche cercare tra alcuni di questi e attivare una finestra che corrisponde alla ricerca. Tuttavia, non ho idea di cosa determini quale di tutte le possibili corrispondenze verrà restituita. D'altra parte, puoi utilizzare la funzione di elenco fornita per scrivere un wrapper che esegua meglio la ricerca e possibilmente basato su alcune altre proprietà (come il timestamp dell'ultimo accesso alla finestra) che puoi ottenere interrogando il
Queste righe di codice riportate di seguito restituiscono l'istanza più recente di una finestra di classe mate-terminal:
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
Ad ogni modo, per la cosa che descrivi che stai costruendo, se fossi in te, scoprirei quale classe di finestre genera il tuo comando desiderato e quindi baserei la mia ricerca su quello, piuttosto che sui PID. In alternativa, puoi presumere che il comando CMD possa generare finestre con un nome di classe che include CMD.
Dopo aver trovato la tua linea, dovresti usare l'ID finestra
per attivare la finestra tramite wmctrl.
Spero che questo aiuti.
Una nota a margine:ho scoperto che xdotool può eseguire ricerche anche in base ai nomi delle classi e ai titoli delle finestre, ma è estremamente lento . Sul mio computer, questo script bash (che chiama un bel paio di utilità esterne) è 10 volte più veloce dell'alternativa compilata che è xdotool :P.
Puoi usare:
xdotool getwindowfocus getwindowname
(Così com'è:non è necessario sostituire quei nomi dal bel suono con niente.)