[PATCH libXi 5/5] Add handler to transform XI2 events to the wire protocol

Carlos Garnacho carlosg at gnome.org
Fri Sep 24 11:29:43 PDT 2010


Use XESetEventCookieToWire() to register a handler to convert XI2 events to the core protocol, at the moment only XI_KeyPress/Release events are handled, althought further XI2 events can be added easily, this is at the moment sufficient for an XEmbed spec extension to use XI2.

Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
 src/XExtInt.c |   80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/src/XExtInt.c b/src/XExtInt.c
index bbd406d..8d5bbbd 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -127,6 +127,11 @@ static Bool XInputWireToCookie(
     XGenericEventCookie*	/* re */,
     xEvent*	        /* event */
 );
+static Bool XInputCookieToWire(
+    Display*	        /* display */,
+    XGenericEventCookie*	/* re */,
+    xGenericEvent**	        /* event */
+);
 
 static Bool XInputCopyCookie(
     Display*	        /* display */,
@@ -244,6 +249,7 @@ XExtDisplayInfo *XInput_find_display (Display *dpy)
       if (dpyinfo->codes) /* NULL if XI doesn't exist on the server */
       {
           XESetWireToEventCookie(dpy, dpyinfo->codes->major_opcode, XInputWireToCookie);
+          XESetEventCookieToWire(dpy, dpyinfo->codes->major_opcode, XInputCookieToWire);
           XESetCopyEventCookie(dpy, dpyinfo->codes->major_opcode, XInputCopyCookie);
       }
     }
@@ -992,6 +998,79 @@ XInputWireToCookie(
     return DONT_ENQUEUE;
 }
 
+static Bool
+XInputCookieToWire(
+    Display	*dpy,
+    XGenericEventCookie *re,
+    xGenericEvent **event)
+{
+    XExtDisplayInfo *info = XInput_find_display(dpy);
+    XGenericEventCookie *xcookie = (XGenericEventCookie *) re;
+
+    switch (((XGenericEvent*)re)->evtype)
+    {
+    case XI_KeyPress:
+    case XI_KeyRelease: {
+        register XIDeviceEvent *xev = (XIDeviceEvent *) xcookie->data;
+        register xXIDeviceEvent *wev = (xXIDeviceEvent *) event;
+        int buttons_len = (xev->buttons.mask_len + 3) >> 2;
+        unsigned char *mask;
+
+        wev = (xXIDeviceEvent *) Xmalloc(sizeof(xXIDeviceEvent) + buttons_len);
+
+        if (!wev)
+            return (_XUnknownEventCookie(dpy, re, event));
+
+        *event = (xGenericEvent *) wev;
+
+        wev->type = GenericEvent;
+        wev->extension = info->codes->major_opcode;
+        wev->sequenceNumber = xev->serial & 0xFFFF;
+        wev->length = (sizeof (xXIDeviceEvent) + (buttons_len * 4) - sizeof (xEvent) + 3) >> 2;
+        wev->evtype = xev->evtype;
+        wev->deviceid = xev->deviceid;
+        wev->time = xev->time;
+        wev->detail = xev->detail;
+        wev->root = xev->root;
+        wev->event = xev->event;
+        wev->child = xev->child;
+
+        if (xev->sourceid != 0)
+            wev->sourceid = xev->sourceid;
+        else
+            wev->sourceid = xev->deviceid;
+
+        wev->flags = xev->flags;
+
+        wev->buttons_len = (xev->buttons.mask_len + 3) << 2;
+        wev->valuators_len = 0;
+
+        wev->root_x = 0;
+        wev->root_y = 0;
+        wev->event_x = 0;
+        wev->event_y = 0;
+
+        wev->mods.base_mods = xev->mods.base;
+        wev->mods.latched_mods = xev->mods.latched;
+        wev->mods.locked_mods = xev->mods.locked;
+        wev->mods.effective_mods = xev->mods.effective;
+
+        wev->group.base_group = xev->group.base;
+        wev->group.latched_group = xev->group.latched;
+        wev->group.locked_group = xev->group.locked;
+        wev->group.effective_group = xev->group.effective;
+
+        /* Fill in trailing button mask */
+        mask = (unsigned char *) &wev[1];
+        memcpy (mask, xev->buttons.mask, xev->buttons.mask_len);
+
+        return True;
+    }
+    }
+
+    return False;
+}
+
 /**
  * Calculate length in bytes needed for the device event with the given
  * button mask length, valuator mask length + valuator mask. All parameters
@@ -1711,3 +1790,4 @@ wireToPropertyEvent(xXIPropertyEvent *in, XGenericEventCookie *cookie)
 
     return 1;
 }
+
-- 
1.7.0.4



More information about the xorg-devel mailing list