xdotool:タイトルとクラスが異なるパターンでウィンドウを検索する方法(AutoHotkeyと同様)


10

xdotoolでは、searchサブコマンドを使用してウィンドウを検索できます。「gvim」クラスと「TODO」という単語を含むタイトルを持つウィンドウを見つける必要があります。どうすればよいですか?

私が試したこと:

  • できますがxdotool search --name --class、名前とタイトルの両方に1つのパターンしか使用できません。
  • xdotoolはコマンドチェーンをサポートしますが、2つの検索呼び出しをチェーンする方法が見つかりませんでした。2番目の呼び出しは最初の呼び出しをオーバーライドするだけです。

xdotoolこれはとても簡単な操作であり、エレガントに行う方法はありません。
Yan King Yin

回答:


13

xdotoolのヘルプで、2つのスイッチが同じであることがわかります(xdotoolバージョン3.20150503.1)。

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

そのため、何もしません。私のxdotoolはウィンドウスタックを置き換えることであなたと同じことをするので、シェルスクリプトでそれを行いました。あなたが望むことをするシェルスクリプトは以下に提供されます:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

ifステートメントのアスタリスクは、の部分文字列照合を行うためにありTODO、タイトルのどこにでも出現することができます。


ええ、申し訳ありませんが、誤植です。--nameと--classを意味しました。今すぐ修正します。
t7ko 2016年

@DSは、なぜxdotool search --class "gedit"がgeditのみで機能するようになったのか、他のウィンドウでは機能するのか教えてもらえますか?xpropユーティリティについても同じことが言えます。
Gonki

6

unix-wayの短いソリューションを特定できました。

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)

3

これは、UNIXの方法に準拠した別のソリューションです。

一見すると、あなたのものほど美しくありません、@ t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

でも我慢して!その中にいくつかの隠された美しさがあります。

つまり、それ

  1. 有する線状構造の代わりに二次元のような、代わりのツリー構造を、
  2. よりよく知られているシェル構文を使用します
  3. 実際にあなたの質問に答えます:それは窓を見つけます。

(これらの点が利点であるかどうかは状況に依存します-この側面を無視しましょう*)。

ステップごとに理解しやすくするために、同じコードをより構造化されたレイアウトで以下に示します。
ただし、インデントはコマンドを説明するためのものであることに注意してください。これはネストなどを示すものではなく、すべて線形のUNIXパイプラインです。

同じコマンド、パイプの後に分割する(|):

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
    sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

完全なコマンドは、上記のように、画素の位置が得られるgvim電流(おそらく仮想)画面の左上隅のように相対画素座標戻り、ウィンドウx,yなど42,433、または多分を-5375,-3809、それが4×4の仮想画面の最初の上にある場合、そして現在のものは右側のどこか下にあります。

とりあえず、コマンドを短くしてX11ウィンドウIDのみを見つけるようにします-多分それがOPに実際に必要なもののすべてです。

短縮されたコマンドパイプライン、各行に個別のシェルコマンド:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO'

これで、読みやすくなりました。

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool search --all --pid {} --name 'TODO' 

このxdotoolコマンドsearchは、「class」を持つウィンドウを検索するために使用されgvim、一部の「内部」ウィンドウは除外されます。結果はPIDの(プロセスID)としてリストされます。
それぞれについてPIDxargs別のを実行xdotool searchし、サンプルパターンの「名前」をTODO確認しますPID

(念のため:で終わる\行-継続行と呼ばれる-は実際にはで終わり\、改行の前に空白がない必要があります。)

元のコマンドに戻ります。

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool \
        search --all --pid {} --name 'TODO' \
        getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

残りの部分には、位置を含むウィンドウに関するいくつかの詳細がリストされています。sedコマンドのみが一致し、リターンx,y位置の値。

例として、16番目の仮想画面(4 x 4)の上部でコマンドを実行し、gvim画面1に"TODO"を指定します。

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*)免責事項:私は@ t7koのコードを好みます。たくさん!


使用--onlyvisibleはいいです。同様の問題で私を助けました。Thunderbirdは14のウィンドウで開始でき、デスクトップには1つまたは2つしかありません。他の目的は何なのかわかりません。ちなみに、現在のデスクトップにすぐに表示されるだけでなく、表示可能な手段のみを表示できます。
Joe、

1

短くてエレガントな答え(これはを使用しますwmctrl):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

結果のウィンドウIDは16進数であるため、10進数に変換する必要があります(で使用xdotool)。

printf "%d\n" $result

その後、で何でもできますxdotool


1
wmctrlマニュアルは-lウィンドウクラスを印刷せず、タイトルのみを印刷すると言っています。したがって、コードスニペットでは、「タイトルとクラスによる検索」という私の問題は解決されません。
t7ko 2018年

1
wmctrl -lxクラスを提供します。
david.perez 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.