1. 22 Dec, 2010 1 commit
  2. 07 Jul, 2010 1 commit
  3. 15 Jan, 2010 1 commit
  4. 12 Jul, 2009 1 commit
    • Peter Hutterer's avatar
      Add generic event cookie handling to libX11. · 554f755e
      Peter Hutterer authored
      Generic events require more bytes than Xlib provides in the standard XEvent.
      Memory allocated by the extension and stored as pointers inside the event is
      prone to leak by simple 'while (1) { XNextEvent(...); }' loops.
      
      This patch adds cookie handling for generic events. Extensions may register
      a cookie handler in addition to the normal event vectors. If an extension
      has registered a cookie handler, _all_ generic events for this extensions
      must be handled through cookies. Otherwise, the default event handler is
      used.
      
      The cookie handler must return an XGenericEventCookie with a pointer to the
      data.The rest of the event (type, serialNumber, etc.) are to be filled as
      normal. When a client retrieves such a cookie event, the data is stored in
      an internal queue (the 'cookiejar'). This data is freed on the next call to
      XNextEvent().
      
      New extension interfaces:
          XESetWireToEventCookie(display, extension_number, cookie_handler)
      
      Where cookie_handler must set cookie->data. The data pointer is of arbitray
      size and type but must be a single memory block. This memory block
      represents the actual extension's event.
      
      New client interfaces:
          XGetEventData(display, *cookie);
          XFreeEventData(display, *cookie);
      
      If the client needs the actual event data, it must call XGetEventData() with
      the cookie. This returns the data pointer (and removes it from the cookie
      jar) and the client is then responsible for freeing the event with
      XFreeEventData(). It is safe to call either function with a non-cookie
      event. Events unclaimed or not handled by the XGetEventData() are cleaned up
      automatically.
      
      Example client code:
          XEvent event;
          XGenericEventCookie *cookie = &ev;
      
          XNextEvent(display, &event);
          if (XGetEventData(display, cookie)) {
              XIEvent *xievent = cookie->data;
              ...
          } else if (cookie->type == GenericEvent) {
              /* handle generic event */
          } else {
              /* handle extension/core event */
          }
          XFreeEventData(display, cookie);
      
      Cookies are not multi-threading safe. Clients that use XGetEventData() must
      lock between XNextEvent and XGetEventData to avoid other threads freeing
      cookies.
      Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
      554f755e
  5. 17 Jun, 2008 1 commit
  6. 01 May, 2007 1 commit
  7. 13 May, 2005 1 commit
  8. 23 Apr, 2004 1 commit
  9. 14 Nov, 2003 1 commit