我编写了以下代码来检测另一个应用程序(而不是我的代码)在屏幕上创建窗口的时间:
Display* display = XOpenDisplay(":0");
XSetWindowAttributes attributes;
attributes.event_mask = SubstructureNotifyMask | StructureNotifyMask;
Window win = XDefaultRootWindow(display);
XChangeWindowAttributes(display, win, CWEventMask, &attributes);
while (1) {
XEvent event;
XNextEvent(display, &event);
if (event.type == CreateNotify)
puts("create Notify event occured\n");
}
代码基本上有效,但是,我注意到,当我启动应用程序(例如终端)时,CreateNotify
事件似乎被多次触发。谁能解释为什么?我原以为CreateNotify
只会针对每个已启动的应用程序/窗口触发一次。我如何修改代码来实现这一目标?
答案 0 :(得分:0)
这些事件适用于子窗口。每the Xlib Programming Manual,"创建任何子项......生成一个事件。"典型的X应用程序包含许多子窗口,您可以看到它们中的每一个。
当您收到活动时,请检查event.xcreatewindow.parent
(XEvent
是每the reference的联盟)。如果是win
,根窗口,则您有一个顶级窗口。否则,您有一个子窗口。尝试:
if ( (event.type == CreateNotify) && (event.xcreatewindow.parent == win) )
puts("top-level create Notify event occured\n");