mi: change the device id to the master devices' when duplicating the event.

Move the event duplication into a CopyGetMasterEvent(), makes the code a bit
better to read.
This commit is contained in:
Peter Hutterer 2007-11-08 11:51:03 +10:30
parent 180220f284
commit 3063f0c667

View File

@ -226,6 +226,68 @@ mieqSetHandler(int event, mieqHandler handler)
miEventQueue.handlers[event] = handler; miEventQueue.handlers[event] = handler;
} }
/**
* Change the device id of the given event to the given device's id.
*/
static void
ChangeDeviceID(DeviceIntPtr dev, xEvent* event)
{
int type = event->u.u.type;
if (type == DeviceKeyPress || type == DeviceKeyRelease ||
type == DeviceButtonPress || type == DeviceButtonRelease ||
type == DeviceMotionNotify)
((deviceKeyButtonPointer*)event)->deviceid = dev->id;
else if (type == DeviceValuator)
((deviceValuator*)event)->deviceid = dev->id;
else if (type == GenericEvent)
{
/* FIXME: need to put something into XGE to make this saner */
xGenericEvent* generic = (xGenericEvent*)event;
if (generic->extension == IReqCode
&& generic->evtype == XI_RawDeviceEvent)
{
rawDeviceEvent* raw = (rawDeviceEvent*)event;
raw->deviceid = dev->id;
} else
ErrorF("[mi] Unknown generic event, cannot change id.\n");
} else
ErrorF("[mi] Unknown event type, cannot change id.\n");
}
/**
* Copy the given event into master.
* @param mdev The master device
* @param original The event as it came from the EQ
* @param master The event after being copied
* @param count Number of events in original.
*/
static void
CopyGetMasterEvent(DeviceIntPtr mdev, xEvent* original,
xEvent** master, int count)
{
if (count > 1) {
*master = xcalloc(count, sizeof(xEvent));
if (!*master)
FatalError("[mi] No memory left for master event.\n");
while(count--)
{
memcpy(&(*master)[count], &original[count], sizeof(xEvent));
ChangeDeviceID(mdev, &(*master)[count]);
}
} else
{
int len = sizeof(xEvent);
if (original->u.u.type == GenericEvent)
len += GEV(original)->length * 4;
*master = xalloc(len);
if (!*master)
FatalError("[mi] No memory left for master event.\n");
memcpy(*master, original, len);
ChangeDeviceID(mdev, *master);
}
}
/* Call this from ProcessInputEvents(). */ /* Call this from ProcessInputEvents(). */
void void
mieqProcessInputEvents(void) mieqProcessInputEvents(void)
@ -233,7 +295,7 @@ mieqProcessInputEvents(void)
EventRec *e = NULL; EventRec *e = NULL;
int x = 0, y = 0; int x = 0, y = 0;
xEvent* event, xEvent* event,
*master_event; *master_event = NULL;
while (miEventQueue.head != miEventQueue.tail) { while (miEventQueue.head != miEventQueue.tail) {
if (screenIsSaved == SCREEN_SAVER_ON) if (screenIsSaved == SCREEN_SAVER_ON)
@ -284,39 +346,32 @@ mieqProcessInputEvents(void)
* copy. Eventually the interface for the processInputProc needs * copy. Eventually the interface for the processInputProc needs
* to be changed. (whot) * 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) if (e->nevents > 1)
{ {
int i; int i;
event = xcalloc(e->nevents, sizeof(xEvent)); event = xcalloc(e->nevents, sizeof(xEvent));
master_event = xcalloc(e->nevents, sizeof(xEvent)); if (!event)
if (!event || !master_event)
FatalError("[mi] No memory left for event processing.\n"); FatalError("[mi] No memory left for event processing.\n");
for (i = 0; i < e->nevents; i++) for (i = 0; i < e->nevents; i++)
{ {
memcpy(&event[i], e->events[i].event, sizeof(xEvent)); memcpy(&event[i], e->events[i].event, sizeof(xEvent));
memcpy(&master_event[i], e->events[i].event, sizeof(xEvent));
} }
} } else
else
{
int len = sizeof(xEvent);
event = e->events->event; event = e->events->event;
if (event->u.u.type == GenericEvent) if (!e->pDev->isMaster && e->pDev->u.master)
len += GEV(event)->length * 4; {
master_event = xalloc(len); CopyGetMasterEvent(e->pDev->u.master, event,
if (!master_event) &master_event, e->nevents);
FatalError("[mi] No memory left for master event.\n");
memcpy(master_event, event, len);
} }
/* process slave first, then master */
e->pDev->public.processInputProc(event, e->pDev, e->nevents); e->pDev->public.processInputProc(event, e->pDev, e->nevents);
if (!e->pDev->isMaster && e->pDev->u.master) if (!e->pDev->isMaster && e->pDev->u.master)
{
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);
@ -331,3 +386,4 @@ mieqProcessInputEvents(void)
} }
} }
} }