è possibile cercare PID con wmctrl troppo, in effetti, e penso che sia un modo migliore per farlo. xwininfo restituirà tutti i tipi di entità che sembrano essere Windows, ma non li troverai sul tuo desktop.
Se fai uomo wmctrl , troverete che wmctrl -l elenca tutte le finestre che sono in realtà visibile sul desktop con (soprattutto) i loro finestra ids e titoli. -p aggiunge PID e -x aggiungerà classi di finestre.
Come dice il manuale (RTFM, a destra?: 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 delle possibili corrispondenze sarà restituita. D'altra parte, è possibile utilizzare la funzione di elenco fornita per scrivere un wrapper che ricerca meglio e possibilmente basato su alcune altre proprietà (come il timestamp dell'ultimo accesso alla finestra) che è possibile ottenere interrogando l'fornito. vincere l'id su xprop, ad esempio.
Queste righe di codice sotto restituire il più recente esempio di una finestra di classe compagno-terminale:
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
In ogni caso, per la cosa che descrivi si stanno costruendo, se fossi in te, vorrei sapere quale classe di Windows il comando desiderato genera e quindi basa la mia ricerca su quello, piuttosto che su PID. In alternativa, è possibile presumere che CMD genererà probabilmente finestre con un nome di classe che include CMD.
Dopo aver trovato la vostra linea, è necessario utilizzare la finestra di id
per attivare la finestra tramite wmctrl.
Spero che questo aiuti.
Una nota a margine: ho trovato che xdotool può eseguire ricerche in base ai nomi di classi e titoli di finestre, ma è estremamente lento. Sul mio computer, questo script bash (che chiama un paio di programmi esterni) è 10 volte più veloce dell'alternativa compilata che è xdotool: P.
Grazie. Ho iniziato a hackerare con questo codice quando lo hai originariamente pubblicato, ma sono stato ostacolato e poi sviato (da qui l'accettazione purtroppo spiacevolmente) ... tuttavia, sembrava che mi stesse dando solo quello che volevo. –
Un solo liner che lo farebbe (rubando da Patrick) quando potresti facilmente selezionare la finestra che ti interessa è 'xwininfo | sed -e 's/^ * //' | grep -E "ID finestra" | awk '{print $ 4}' '. L'esecuzione di xwininfo senza argomenti o opzioni consente di selezionare con il mouse la finestra che si desidera conoscere. NOTA: ho dovuto modificare un po 'il comando grep per RHEL6. – MrMas