在事件的主循环中获取 X11 Window

Get X11 Window inside the main loop for an event

我来自 Windows,在 WndProc 中,您可以找到与特定消息相关的 window 处理程序。 我想知道这是否也适用于 X11

while (!done) {
    XNextEvent(dis, &xev);

    if(xev.type == Expose) {
        // I want to know what window is being exposed here
    }

    if (xev.type == KeyPress) {
        // I want to know what window has received a key press here
    }
}

我该如何实现?目前真的找不到任何东西

此外,在 Win32 中,您可以使用 SetWindowLong 为您创建的 class 存储一个对象指针,以表示您的 window,稍后您可以在 WndProc回调。有没有办法在 X11 的情况下存储一个对象指针,以便以后在处理事件时可以用同样的方式检索它?

对于那些与 X windows 相关的事件,它们的 'overloaded' 事件结构有一个 Window 参数。

XEvent 是一个联合,是映射到一个结构中的消息特定结构的集合。因此,要获得正确的事件结构,您可以使用:

   if (xev.type == KeyPress)
   {
      Window w = xev.xkey.window;
   }
   if (xev.type == Expose)
   {
      Window w = xev.xexpose.window;
   }

等等。每个事件结构只有它需要的参数。

我不知道 X 的对象指针 window;但是,您可以使用 std::map 来保存 Window ID 映射到指针、结构或 class 的列表,并在全局范围内跟踪它。

您不需要从每个事件类型中检索 Window,您可以使用

Window w = event.xany.window;

在你的事件循环的顶部,甚至在你检测到它是什么类型的事件之前。 您可以使用

XContext ClassID = XUniqueContext();

作为与 XSaveContext 函数一起使用的全局变量。 然后你可以使用

XSaveContext( display, w, ClassID, (XPointer)myclass );

将 Class 指针存储在 X Window 本身上。因此,一旦您从事件中获得 Window,就可以使用

从 Window 中检索 Class
XPointer return_class;
XFindContext( display, w, &return_class );
MyClass myclass = (MyClass *)return_class;

等等...