私はX11で開いているすべてのウィンドウを監視したいと思います。次のように現在、私はこれをやっている:すべてのX11ウィンドウの完全なリストを取得して同期するにはどうすればよいですか?
- は、最初は再帰的に全体のデスクトップ上の部分構造変化のリスニングルートウィンドウ
- からXQueryTreeを呼び出すことによって、ツリー全体を歩いて:すべてのMapNotify、UnmapNotifyの取り扱い
XSelectInput(display, root_window, SubstructureNotifyMask | PropertyChangeMask)
- DestroyNotifyイベントを使用して、プロセス内のウィンドウのリストを更新します。
私は主にポイント1が気になります。再帰中に、XQueryTreeが複数回呼び出されます。その間に木が変わらないようにする方法はありますか?言い換えれば、ある時点でツリー全体の「スナップショット」を取得することですか?
また、私はいくつかのX11システムの下で、すべてのイベントが正しく到着していないことに気付きました。たとえば、デスクトップ上で新しいウィンドウを開くと、そのウィンドウのMapNotifyが自分の監視アプリケーションに届かないことがあります。どうすればいいの?到着する前に捨てられる可能性はありますか?
更新:
私は(下記参照)ルートウィンドウ上でXのイベントを監視する小さなプログラムを書いています。
Reparented: 0x4a0005b to 0x1001e40
Mapped : 0x1001e40
Destroyed : 0x1001e40
ことだ:私はこのプログラムを実行し、xcalcを開始し、終了時に今、私は次の出力を取得します。 本当のウィンドウ(0x4a0005b)が破棄されることはありません。マップされていなくても!誰も私になぜそう言わないのですか? SubStructureNotifyMaskは、全体サブツリーの代わりに直接サブウィンドウのイベントのみを送信しますか? Compizのが動作しているときところで
、これは明らかに起こりません。そして、何の親設定が行われません:
Mapped : 0x4a0005b
Mapped : 0x4e00233
Destroyed : 0x4a0005b
Destroyed : 0x4e00233
監視プログラムソース:
#include <X11/Xlib.h>
#include <cstdio>
int main()
{
Display *display;
Window rootwin;
display = XOpenDisplay(NULL);
rootwin = DefaultRootWindow(display);
XSelectInput(display, rootwin, SubstructureNotifyMask);
XEvent event;
while (1) {
XNextEvent(display, &event);
if (event.type == MapNotify) {
XMapEvent *mapevent = (XMapEvent *)&event;
printf("Mapped : 0x%x\n", (unsigned int)(mapevent->window));
}
if (event.type == DestroyNotify) {
XDestroyWindowEvent *destroywindowevent = (XDestroyWindowEvent *)&event;
printf("Destroyed : 0x%x\n", (unsigned int)(destroywindowevent->window));
}
if (event.type == ReparentNotify) {
XReparentEvent *reparentevent = (XReparentEvent *)&event;
printf("Reparented: 0x%x to 0x%x\n", (unsigned int)(reparentevent->window), (unsigned int)(reparentevent->parent));
}
}
return 0;
}
ありがとうございます!私はxwininfoのソースコードを見て、それと同じように木を横断するように見えます。 XQueryTreeの呼び出しの間にツリーが変更される可能性がある場合、xwininfoも影響を受けて、私が推測する正しい結果は得られません。 – Marten
@Marten、はい。 xwininfoはスナップショットですが、それはあなたに階層を与えます。次に、いくつかのウィンドウを開き、それらを使ってxprop -spyを実行して更新をチェックすることができます。これらのツールのかなりの数があります。 http://www.x.org/archive/X11R6.9.0/doc/html/manindex1.html –