puede buscar PIDs con wmctrl también, de hecho, y creo que esa es una mejor manera de hacerlo. xwininfo devolverá todo tipo de entidades que parecen ser Windows, pero no las encontrará realmente en su escritorio.
Si lo hace hombre wmctrl , usted encontrará que wmctrl -l listas de todas las ventanas que son realmente visibles en su escritorio con (lo más importante) sus identificadores de ventana y títulos. -p añade PID y -x agregará clases de ventana.
Como dice el manual (RTFM, ¿no?: D), wmctrl también puede buscar a través de algunos de ellos y activar una ventana que coincida con la búsqueda. Sin embargo, no tengo idea de qué determina cuál de todas las posibles coincidencias se devolverá. Por otro lado, puede usar la función de listado proporcionada para escribir un contenedor que hace la búsqueda mejor y posiblemente basado en otras propiedades (como la marca de tiempo del último acceso a la ventana) que puede obtener consultando el proporcionado. Win ID a xprop, por ejemplo.
Estas líneas de código a continuación devuelven el más reciente ejemplo de una ventana de clase compañero-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
De todos modos, por lo que describes se está construyendo, si yo fuera usted, me gustaría saber qué clase de Windows genera el comando deseado y luego basa mi búsqueda en eso, en lugar de en PID. Alternativamente, podría suponer que el comando CMD posiblemente generará ventanas con un nombre de clase que incluya CMD.
Después de haber encontrado su línea, se debe utilizar el identificador de ventana
para activar la ventana a través de wmctrl.
Espero que esto ayude.
Una nota al margen: he encontrado que xdotool puede hacer búsquedas basadas en nombres de clases y títulos de ventanas también, pero es extremadamente lento. En mi computadora, este script bash (que llama bastantes utilidades externas) es 10 veces más rápido que la alternativa compilada que es xdotool: P.
Gracias. Comencé a piratear este código cuando originalmente lo publicaste, pero me quedé boquiabierto y luego desviado (de ahí la aceptación lamentablemente retrasada) ... aún así, esto parecía darme lo que yo deseaba. –
Un trazador de líneas que lo haría (robando a Patrick) cuando podría seleccionar fácilmente la ventana que le interesa es 'xwininfo | sed -e 's/^ * //' | grep -E "Identificación de la ventana" | awk '{print $ 4}' '. La ejecución de xwininfo sin argumentos o conmutadores le permite seleccionar con el mouse la ventana que desea conocer. NOTA: tuve que cambiar el comando grep un poco para RHEL6. – MrMas