使用しているウィンドウマネージャとは別に、開いているアクティブなウィンドウの数をカウントしたいのですが、マウスコントロールただし、次の操作を行うと、これが実行できます。
wmctrl -l
ウィンドウ マネージャーとして Unity を使用している Ubuntu 14.04 64 ビット デスクトップでは、出力は次のようになります。
0x03c00002 0 stepup XdndCollectionWindowImp
0x03c00005 0 stepup unity-launcher
0x03c00008 0 stepup unity-panel
0x03c0000b 0 stepup unity-dash
0x03c0000c 0 stepup Hud
0x02c0000a 0 stepup Desktop
0x02e000b3 0 stepup How to count the number of active windows open irrespective of window manager? - Unix & Linux Stack Exchange - Mozilla Firefox
0x0340000c 0 stepup Terminal
ただし、Unity/gnome/KDE などが使用するウィンドウを無視し、ユーザーが独自に開いたウィンドウだけをカウントしたいのですが、どうすればよいでしょうか?
答え1
ウィンドウ マネージャーに属するウィンドウや「独自に開かれるウィンドウ」の正式な定義はありません。技術的には、ウィンドウ マネージャーの役割はウィンドウを必要としません。ウィンドウを持つのはデスクトップ環境の他の部分 (通常はウィジェットと呼ばれます) です。ウィンドウやアプリケーションに「これはデスクトップ環境の一部です」という属性はありません。
wmctrl -lx
実行して、クラス別に不要なウィンドウを識別することができます。さまざまな一般的なデスクトップ環境がどのクラスを使用するかは確認していないので、必要に応じてリストを入力してください。
wmctrl -lx | awk '$3 !~ /^(Unity-.*|Kwin|Boringstuff)$/'
あるいは、非スティッキー ウィンドウを検出すると、目的にかなうかもしれません。スティッキー ウィンドウとは、すべてのワークスペースに表示されるウィンドウです。これがすべてのウィンドウ マネージャーで機能するかどうかはわかりません。
for w in $(wmctrl -l | awk '{print $1}'); do
if ! xprop -id $w _NET_WM_STATE | grep -q _NET_WM_STATE_STICKY; then
wmctrl -l -i $w
fi
done