Mar*_*ten 13 c linux x11 xorg race-condition
我想监视X11下的所有打开的窗口.目前,我这样做如下:
XSelectInput( display, root_window, SubstructureNotifyMask | PropertyChangeMask )
我主要担心的是第1点.在递归期间,XQueryTree将被多次调用.有没有办法确保树在此期间不会改变?换句话说,要在一个时间点获得整棵树的"快照"?
另外,我注意到在某些X11系统下,并非所有事件都正确到达.例如,在桌面上打开新窗口时,该窗口的MapNotify可能永远不会到达我的监控应用程序.怎么会这样?是否有可能在到达之前扔掉?
更新:
我写了一个小程序,它将监视根窗口上的X事件(见下文).现在,当我运行这个程序并启动并退出xcalc时,我得到以下输出:
Reparented: 0x4a0005b to 0x1001e40
Mapped : 0x1001e40
Destroyed : 0x1001e40
Run Code Online (Sandbox Code Playgroud)
而已.我从未收到过被破坏的真实窗口(0x4a0005b)的通知.甚至没有被映射!谁能告诉我为什么不呢?SubStructureNotifyMask是否仅导致发送直接子窗口的事件而不是整个子树?
顺便说一下,当Compiz运行时,这显然不会发生.然后没有重新完成:
Mapped : 0x4a0005b
Mapped : 0x4e00233
Destroyed : 0x4a0005b
Destroyed : 0x4e00233
Run Code Online (Sandbox Code Playgroud)
监控程序来源:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*lls 16
看看xwininfo
.
你可能还喜欢xprop
和xspy
用于获取更多信息.
更新:是的.尝试使用xwininfo
,并-root
用两种-tree
或-children
涉足所有窗口.
并且可以跟踪变化xprop -spy
.
归档时间: |
|
查看次数: |
9674 次 |
最近记录: |