xwininfo a xprop umožňují získat, co chcete, ale je to trochu složitější.
xwininfo umožňuje načíst všechna známá okna a xprop dotazovat X na jedno ID okna pro váš parametr _NET_WM_PID.
Zatím by to byl otřesný způsob:
#!/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
Výsledek:
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
Jak uvidíte, jeden proces může mít určitý počet známých oken, i když na obrazovce vidíte pouze jedno.
Možná byste měli získat zdroje těchto nástrojů, abyste vytvořili to, co chcete.
PID můžete vyhledat pomocí wmctrl ve skutečnosti taky a myslím, že je to lepší způsob, jak to udělat. xwininfo vrátí všechny druhy entit, které vypadají jako okna, ale ve skutečnosti je na ploše nenajdete.
Pokud uděláte man wmctrl , zjistíte, že wmctrl -l uvádí všechna okna, která jsou skutečně viditelná na vaší ploše, s (co je nejdůležitější) jejich ID oken a názvy . -p přidá PID a -x přidá třídy oken .
Jak říká manuál (RTFM, že? :D), wmctrl může také prohledat některé z nich a aktivovat okno, které odpovídá vyhledávání. Netuším však, co určuje, která ze všech možných shod bude vrácena. Na druhou stranu můžete použít poskytnutou funkci výpisu k sepsání obálky, která dělá vyhledávání lépe a možná na základě některých dalších vlastností (jako je časové razítko posledního přístupu do okna), které můžete získat dotazem na poskytnuté ID win například xprop.
Tyto řádky kódu níže vrátí poslední instanci okna třídy mate-terminálu:
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
Každopádně pro věc, kterou popisujete, vytváříte – na vašem místě bych zjistil, jakou třídu oken generuje váš požadovaný příkaz, a pak na tom založím své hledání, spíše než na PID. Případně můžete předpokládat, že příkaz CMD možná vygeneruje okna s názvem třídy, který obsahuje CMD.
Po nalezení řádku byste měli použít ID okna
pro aktivaci okna pomocí wmctrl.
Doufám, že to pomůže.
Poznámka na okraj:Zjistil jsem, že xdotool umí vyhledávat i na základě názvů tříd a názvů oken, ale je to extrémně pomalé . Na mém počítači je tento bash skript (který volá několik externích nástrojů) 10krát rychlejší než kompilovaná alternativa, kterou je xdotool :P.
Můžete použít:
xdotool getwindowfocus getwindowname
(Jak je:nemusíte tato pěkně znějící jména ničím nahrazovat.)