mieq: Made custom event handlers safer for nevents >1

This commit is contained in:
Jeremy Huddleston 2008-09-21 17:32:24 -07:00
parent 8c46505d7d
commit dac9e91870

View File

@ -318,18 +318,10 @@ mieqProcessInputEvents(void)
e = &miEventQueue.events[miEventQueue.head]; e = &miEventQueue.events[miEventQueue.head];
miEventQueue.head = (miEventQueue.head + 1) % QUEUE_SIZE; miEventQueue.head = (miEventQueue.head + 1) % QUEUE_SIZE;
if ((handler = miEventQueue.handlers[e->events->event->u.u.type])) /* Custom event handler */
{ handler = miEventQueue.handlers[e->events->event->u.u.type];
/* If someone's registered a custom event handler, let them
* steal it. */ if (e->pScreen != DequeueScreen(e->pDev) && !handler) {
handler(DequeueScreen(e->pDev)->myNum, e->events->event,
e->pDev, e->nevents);
if (!e->pDev->isMaster && e->pDev->u.master)
{
handler(DequeueScreen(e->pDev->u.master)->myNum,
e->events->event, e->pDev->u.master, e->nevents);
}
} else if (e->pScreen != DequeueScreen(e->pDev)) {
/* Assumption - screen switching can only occur on motion events. */ /* Assumption - screen switching can only occur on motion events. */
DequeueScreen(e->pDev) = e->pScreen; DequeueScreen(e->pDev) = e->pScreen;
x = e->events[0].event->u.keyButtonPointer.rootX; x = e->events[0].event->u.keyButtonPointer.rootX;
@ -363,6 +355,19 @@ mieqProcessInputEvents(void)
} else } else
master_event = NULL; master_event = NULL;
/* If someone's registered a custom event handler, let them
* steal it. */
if (handler)
{
handler(DequeueScreen(e->pDev)->myNum, e->events->event,
e->pDev, e->nevents);
if (!e->pDev->isMaster && e->pDev->u.master)
{
handler(DequeueScreen(e->pDev->u.master)->myNum,
e->events->event, e->pDev->u.master, e->nevents);
}
} else
{
/* process slave first, then master */ /* process slave first, then master */
e->pDev->public.processInputProc(event, e->pDev, e->nevents); e->pDev->public.processInputProc(event, e->pDev, e->nevents);
@ -371,6 +376,7 @@ mieqProcessInputEvents(void)
e->pDev->u.master->public.processInputProc(master_event, e->pDev->u.master->public.processInputProc(master_event,
e->pDev->u.master, e->nevents); e->pDev->u.master, e->nevents);
} }
}
if (e->nevents > 1) if (e->nevents > 1)
xfree(event); xfree(event);