xwininfo と xprop を使用すると、必要なものを取得できますが、少し注意が必要です。
xwininfo を使用すると、既知のすべてのウィンドウを取得できます。xprop を使用すると、_NET_WM_PID パラメーターの単一のウィンドウ ID について X にクエリを実行できます。
これまでのところ、ハックな方法は次のようになります:
#!/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
結果:
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
後でわかるように、画面に 1 つしか表示されていなくても、1 つのプロセスに一定数の既知のウィンドウがある場合があります。
必要なものを作成するには、これらのツール ソースを入手する必要があるかもしれません。
wmctrl で PID を調べることができます 実際のところ、それがより良い方法だと思います。 xwininfo ウィンドウのように見えるあらゆる種類のエンティティが返されますが、実際にはデスクトップ上では見つかりません。
man wmctrl を実行した場合 、wmctrl -l が見つかります。 デスクトップに実際に表示されているすべてのウィンドウを (最も重要な) ウィンドウ ID とともに一覧表示します とタイトル . -p PID を追加します および -x ウィンドウ クラスを追加します .
マニュアルにあるように (RTFM ですよね? :D)、wmctrl はこれらのいくつかを検索して、検索に一致するウィンドウをアクティブにすることもできます。ただし、考えられるすべての一致のどれが返されるかを決定するものはわかりません。一方、提供されたリスト関数を使用して、提供された 勝利ID たとえば、xprop に。
以下のコード行は、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
とにかく、あなたが構築しているとあなたが説明したものについて、私があなただったら、あなたの希望するコマンドが生成するウィンドウのクラスを見つけて、PID ではなくそれを基に検索します。あるいは、コマンド CMD は、CMD を含むクラス名を持つウィンドウを生成する可能性があると推測できます。
行を見つけたら、window id を使用する必要があります。
wmctrl でウィンドウをアクティブにします。
これがお役に立てば幸いです。
補足:xdotool はクラス名とウィンドウ タイトルにも基づいて検索できることがわかりましたが、非常に遅い .私のコンピューターでは、この bash スクリプト (かなりの数の外部ユーティリティを呼び出す) は、xdotool :P であるコンパイル済みの代替スクリプトよりも 10 倍高速です。
以下を使用できます:
xdotool getwindowfocus getwindowname
(そのまま:これらの響きの良い名前を何かに置き換える必要はありません。)