From 15944b8f02752eedd61be34a6a29dd6b82a0ac97 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 7 Nov 2007 11:33:24 +1030 Subject: [PATCH] mi: duplicate event before processing it, so master has original values Event values may get changed in the event processing stage, so we need to duplicate it to pump different events through for slave and master device. --- mi/mieq.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/mi/mieq.c b/mi/mieq.c index 7d6d110b8..20004f3de 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -232,7 +232,8 @@ mieqProcessInputEvents(void) { EventRec *e = NULL; int x = 0, y = 0; - xEvent* event; + xEvent* event, + *master_event; while (miEventQueue.head != miEventQueue.tail) { if (screenIsSaved == SCREEN_SAVER_ON) @@ -283,25 +284,43 @@ mieqProcessInputEvents(void) * copy. Eventually the interface for the processInputProc needs * to be changed. (whot) */ + + /* The event is changed during event processing, so we need to + * memcpy the event we have and pass the copy through for master + */ if (e->nevents > 1) { int i; event = xcalloc(e->nevents, sizeof(xEvent)); + master_event = xcalloc(e->nevents, sizeof(xEvent)); + if (!event || !master_event) + FatalError("[mi] No memory left for event processing.\n"); for (i = 0; i < e->nevents; i++) + { memcpy(&event[i], e->events[i].event, sizeof(xEvent)); + memcpy(&master_event[i], e->events[i].event, sizeof(xEvent)); + } } else { + int len = sizeof(xEvent); event = e->events->event; + if (event->u.u.type == GenericEvent) + len += GEV(event)->length * 4; + master_event = xalloc(len); + if (!master_event) + FatalError("[mi] No memory left for master event.\n"); + memcpy(master_event, event, len); } e->pDev->public.processInputProc(event, e->pDev, e->nevents); if (!e->pDev->isMaster && e->pDev->u.master) - e->pDev->u.master->public.processInputProc(event, + e->pDev->u.master->public.processInputProc(master_event, e->pDev->u.master, e->nevents); if (e->nevents > 1) xfree(event); + xfree(master_event); } /* Update the sprite now. Next event may be from different device. */