在事件的主循环中获取X11窗口

时间:2016-12-06 21:36:58

标签: c++ events window x11

我来自Windows,在WndProc内,您可以找到与特定邮件相关的窗口处理程序。 我想知道这是否也适用于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存储您创建的用于表示窗口的类的对象指针,稍后您可以在WndProc回调中获取该对象指针。有没有办法在X11的情况下存储一个对象指针,以便以后可以在处理事件时以相同的方式检索它?

2 个答案:

答案 0 :(得分:1)

对于那些与X窗口相关的事件,它们的“重载”事件结构有一个Window参数。

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

unique

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

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

答案 1 :(得分:0)

您无需从每种事件类型中检索窗口,您可以使用

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;

依旧......