我来自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的情况下存储一个对象指针,以便以后可以在处理事件时以相同的方式检索它?
答案 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中检索ClassXPointer return_class;
XFindContext( display, w, &return_class );
MyClass myclass = (MyClass *)return_class;
依旧......