web-dev-qa-db-ja.com

現在アクティブなウィンドウを検出しています

Linuxコマンドラインツールwmctrlを使用すると、すべてのウィンドウまたはすべてのデスクトップを一覧表示できます。デスクトップリストモードでは、現在のデスクトップにアスタリスクが付いています。

現在アクティブなウィンドウのタイトルを把握できるツールが必要です。残念ながら、wmctrlにはこれを行うヘルパーがありません-現在アクティブなウィンドウがわかっているにもかかわらず(:ACTIVE: マーカー)。

現在のウィンドウのウィンドウIDまたはウィンドウタイトル、あるいはその両方を取得できる別のコマンドラインツールはありますか?

54
Dave Vogt

xdotoolをインストールして実行

xdotool getwindowfocus getwindowname

それは例えば与えるでしょうFirefoxで開いている現在のウェブページの場合:

linux - Detecting currently active window - Super User - Mozilla Firefox

これはより直接的で、xpropcutのみを使用します。

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

これらのコマンドは、ルートウィンドウとアプリケーションウィンドウからのプロパティの抽出にすぎませんが、ロレンツォフォンマッターホルンの要求に従って:

  • 最初、

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    ルートから_NET_ACTIVE_WINDOWプロパティを抽出し、アクティブなウィンドウのXIDを提供します。 32x '\t$0'は、xpropが後で簡単に解析できるように出力をフォーマットするようにcutに指示します。

  • 次に、cut -f 2を使用して、出力からXIDのみを抽出します。

  • 次に、XIDをパラメーターとして渡します。

    xprop -id XID _NET_WM_NAME
    

これはそのウィンドウの名前を表示します。

34
Jim Paris

簡単な答えや解決策はありませんが、ありません。

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

結果:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

使用中で:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)
10
tao

これは私のために働いたものです:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

与える:

WM_NAME(STRING) = "~"

だから、おそらくあなたは名前をそれ自体で取得するために少しsedの醜さをするでしょう:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

与える:

_~_

これは、現在フォーカスされているウィンドウ名です。

または、少し醜いものでsedを避ける:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'

5
Greg Bell

比較的短く、引用符を含むウィンドウ名を正しく処理します。

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
3