简体   繁体   中英

Get X11 Window inside the main loop for an event

I come from Windows, where, inside WndProc you can find out what window handler is related to a specific message. I want to know if this is also possible with 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
    }
}

How could I achieve it? Really couldn't find anything so far

Also, in Win32, you can store an object pointer for a class you create to represent your window, using SetWindowLong , which you can later get in the WndProc callback. Is there a way to store an object pointer in the X11 case, so that it can be later retrieved in the same way, when processing the events?

For those events that are related to X windows, their 'overloaded' event structure has a Window parameter.

XEvent is a union, a collection of message specific structures mapped into one structure. So, to get to the proper event structure, you use this:

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

Et cetera. Each event structure has only the parameters it needs.

I don't know about an object pointer for an X window; however, you could use a std::map to keep a list from Window ID that maps to a pointer, struct or class and keep track of it globally.

You don't need to retrieve the Window from each event type, you can use

Window w = event.xany.window;

at the top of your event loop, before you even detect what kind of event it is. You can use

XContext ClassID = XUniqueContext();

as a global variable to use with the XSaveContext function. Then you can use

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

to store the Class pointer on the X Window itself. So once you have the Window from the event, you can retrieve the Class from the Window using

XPointer return_class;
XFindContext( display, w, &return_class );
MyClass myclass = (MyClass *)return_class;

and so on...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM