summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-11-08 11:51:03 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-11-08 11:51:03 +1030
commit3063f0c6679bdbea13f360cff8d09a88b9871da9 (patch)
treed8739621f20f52e49b00a53824605c2aef711b41
parent180220f284823c486e7001ef00f1279dc548c9c7 (diff)
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.
-rw-r--r--mi/mieq.c92
1 files changed, 74 insertions, 18 deletions
diff --git a/mi/mieq.c b/mi/mieq.c
index 20004f3de..26eab6f44 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -226,6 +226,68 @@ mieqSetHandler(int event, mieqHandler 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(). */
void
mieqProcessInputEvents(void)
@@ -233,7 +295,7 @@ mieqProcessInputEvents(void)
EventRec *e = NULL;
int x = 0, y = 0;
xEvent* event,
- *master_event;
+ *master_event = NULL;
while (miEventQueue.head != miEventQueue.tail) {
if (screenIsSaved == SCREEN_SAVER_ON)
@@ -284,39 +346,32 @@ 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)
+ if (!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);
+ } else
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);
+ if (!e->pDev->isMaster && e->pDev->u.master)
+ {
+ CopyGetMasterEvent(e->pDev->u.master, event,
+ &master_event, e->nevents);
}
+ /* process slave first, then master */
e->pDev->public.processInputProc(event, e->pDev, e->nevents);
+
if (!e->pDev->isMaster && e->pDev->u.master)
+ {
e->pDev->u.master->public.processInputProc(master_event,
e->pDev->u.master, e->nevents);
+ }
if (e->nevents > 1)
xfree(event);
@@ -331,3 +386,4 @@ mieqProcessInputEvents(void)
}
}
}
+