[PATCH libXi 5/8 v2] Add handler to transform XI2 events to the wire protocol
carlos at lanedo.com
carlos at lanedo.com
Tue Oct 5 09:06:03 PDT 2010
From: Carlos Garnacho <carlosg at gnome.org>
This is a second version of the libXi patch, which handles motion, button
press/release, key press/release and its raw variants.
Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
src/XExtInt.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 170 insertions(+), 3 deletions(-)
diff --git a/src/XExtInt.c b/src/XExtInt.c
index bbd406d..4909ab6 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -68,6 +68,11 @@ SOFTWARE.
#define ENQUEUE_EVENT True
#define DONT_ENQUEUE False
#define FP1616toDBL(x) ((x) * 1.0 / (1 << 16))
+#define DBLtoFP1616(x) ((FP1616) ((x) * ((1 << 16) + 0.5)))
+
+#define DBLtoFP3232(x) ((int64_t) ((x) * (1 << 16) * (1 << 16) + 0.5))
+#define DBLtoFP3232frac(x) (DBLtoFP3232(x) & 0xffffffff);
+#define DBLtoFP3232integral(x) (DBLtoFP3232(x) >> 32);
extern void _xibaddevice(
Display * /* dpy */,
@@ -127,6 +132,11 @@ static Bool XInputWireToCookie(
XGenericEventCookie* /* re */,
xEvent* /* event */
);
+static Bool XInputCookieToWire(
+ Display* /* display */,
+ XGenericEventCookie* /* re */,
+ xGenericEvent** /* event */
+);
static Bool XInputCopyCookie(
Display* /* display */,
@@ -244,6 +254,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);
}
}
@@ -888,7 +899,7 @@ XInputWireToEvent(
static void xge_copy_to_cookie(xGenericEvent* ev,
XGenericEventCookie *cookie)
{
- cookie->type = ev->type;
+ cookie->type = ev->type & 0x7f;
cookie->evtype = ev->evtype;
cookie->extension = ev->extension;
}
@@ -911,12 +922,11 @@ XInputWireToCookie(
}
*save = emptyevent;
- save->type = event->u.u.type;
+ xge_copy_to_cookie((xGenericEvent*)event, (XGenericEventCookie*)save);
((XAnyEvent*)save)->serial = _XSetLastRequestRead(dpy, (xGenericReply *) event);
((XAnyEvent*)save)->send_event = ((event->u.u.type & 0x80) != 0);
((XAnyEvent*)save)->display = dpy;
- xge_copy_to_cookie((xGenericEvent*)event, (XGenericEventCookie*)save);
switch(ge->evtype)
{
case XI_Motion:
@@ -992,6 +1002,162 @@ 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_Motion:
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ 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;
+ int valuators_len = (xev->valuators.mask_len + 3) >> 2;
+ int i, n_valuators, len;
+ unsigned char *ptr;
+ FP3232 *values;
+
+ n_valuators = count_bits (xev->valuators.mask, xev->valuators.mask_len);
+
+ len = sizeof (xXIDeviceEvent);
+ len += buttons_len << 2;
+ len += valuators_len << 2;
+ len += n_valuators * sizeof (FP3232);
+
+ wev = (xXIDeviceEvent *) Xmalloc(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 = (len - 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->root_x = DBLtoFP1616(xev->root_x);
+ wev->root_y = DBLtoFP1616(xev->root_y);
+ wev->event_x = DBLtoFP1616(xev->event_x);
+ wev->event_y = DBLtoFP1616(xev->event_y);
+
+ 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;
+
+ wev->buttons_len = (xev->buttons.mask_len + 3) >> 2;
+ wev->valuators_len = (xev->valuators.mask_len + 3) >> 2;
+
+ /* Fill in trailing button mask */
+ ptr = (unsigned char *) &wev[1];
+ memcpy (ptr, xev->buttons.mask, xev->buttons.mask_len);
+ ptr += wev->buttons_len << 2;
+
+ /* Fill in valuator mask and values */
+ memcpy (ptr, xev->valuators.mask, xev->valuators.mask_len);
+ ptr += wev->valuators_len << 2;
+
+ values = (FP3232 *) ptr;
+
+ for (i = 0; i < n_valuators; i++, values++) {
+ values->frac = DBLtoFP3232frac(xev->valuators.values[i]);
+ values->integral = DBLtoFP3232integral(xev->valuators.values[i]);
+ }
+
+ return True;
+ }
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ case XI_RawMotion: {
+ register XIRawEvent *rev = (XIRawEvent *) xcookie->data;
+ register xXIRawEvent *wev = (xXIRawEvent *) event;
+ int valuators_len = (rev->valuators.mask_len + 3) >> 2;
+ int i, n_valuators, len;
+ unsigned char *ptr;
+ FP3232 *values;
+
+ n_valuators = count_bits (rev->valuators.mask, rev->valuators.mask_len);
+
+ len = sizeof (xXIRawEvent);
+ len += valuators_len << 2;
+ len += n_valuators * sizeof (FP3232) * 2; /* raw + normal */
+
+ wev = (xXIRawEvent *) Xmalloc(len);
+
+ if (!wev)
+ return (_XUnknownEventCookie(dpy, re, event));
+
+ *event = (xGenericEvent *) wev;
+
+ wev->type = GenericEvent;
+ wev->extension = info->codes->major_opcode;
+ wev->sequenceNumber = rev->serial & 0xFFFF;
+ wev->length = (len - sizeof (xEvent) + 3) >> 2;
+ wev->evtype = rev->evtype;
+ wev->deviceid = rev->deviceid;
+ wev->time = rev->time;
+ wev->detail = rev->detail;
+ wev->flags = rev->flags;
+
+ wev->valuators_len = (rev->valuators.mask_len + 3) >> 2;
+
+ /* Fill in trailing valuator mask and values */
+ ptr = (unsigned char *) &wev[1];
+ memcpy (ptr, rev->valuators.mask, rev->valuators.mask_len);
+ ptr += wev->valuators_len << 2;
+
+ values = (FP3232 *) ptr;
+
+ /* Normal values */
+ for (i = 0; i < n_valuators; i++, values++) {
+ values->frac = DBLtoFP3232frac(rev->valuators.values[i]);
+ values->integral = DBLtoFP3232integral(rev->valuators.values[i]);
+ }
+
+ /* Raw values */
+ for (i = 0; i < n_valuators; i++, values++) {
+ values->frac = DBLtoFP3232frac(rev->raw_values[i]);
+ values->integral = DBLtoFP3232integral(rev->raw_values[i]);
+ }
+
+ 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 +1877,4 @@ wireToPropertyEvent(xXIPropertyEvent *in, XGenericEventCookie *cookie)
return 1;
}
+
--
1.7.0.4
More information about the xorg-devel
mailing list