在事件的主循环中获取 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;
等等...
我来自 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 中检索 ClassXPointer return_class;
XFindContext( display, w, &return_class );
MyClass myclass = (MyClass *)return_class;
等等...