createNotify 事件调用过于频繁

标签 c event-handling xlib xserver window-management

我编写了以下代码来检测另一个应用程序(而不是我的代码)何时在屏幕上创建窗口:

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 只会被触发一次。我必须如何修改代码才能实现此目的?

最佳答案

这些事件适用于子窗口。每the Xlib Programming Manual ,“创建任何子项......都会生成一个事件。”典型的 X 应用程序包含许多子窗口,您会看到每个子窗口。

当您获取事件时,请检查 event.xcreatewindow.parent (XEvent 是每个 the reference 的 union )。如果这是 win(根窗口),那么您就有了一个顶级窗口。否则,您将有一个子窗口。尝试:

if ( (event.type == CreateNotify) && (event.xcreatewindow.parent == win) )
    puts("top-level create Notify event occured\n");

关于createNotify 事件调用过于频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40269723/

相关文章:

c++ - 在 SPOJ INCSEQ 中获取 WA - 增加子序列

c - 网络 write() 是否可能失败但 poll() 未检测到

objective-c - 创建全局 "null"结构以在 C 程序中重用?

c++ - 如何在 Linux 中做一个假的鼠标滚轮移动

c - C中函数返回值类型错误

c# - 向 ASP 控件添加自定义事件

javascript - Facebook FB.Event.subscribe 不起作用

c# - 在 C# 中将事件从一个窗体传播到另一个窗体

c++ - 如何释放 XopenDisplay 分配的资源

linux - Linux 上 dlopen() 的有效相对路径?