mi: Clean up CopyGetMasterEvent, re-use the memory.

Alloc an EventList once and then re-use instead of allocing a new event each
time we need a master event.
There's a trick included: because all the event processing handlers only take
an xEvent, init a size 1 EventList and squash the events into this one.

Events that have count > 1 must be squished into an xEvent array anyway before
passing into the event handlers, so we don't lose anything here.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Peter Hutterer 2008-12-01 21:20:48 +10:00 committed by Peter Hutterer
parent 0b4fef6337
commit d281866b74
2 changed files with 40 additions and 35 deletions

View File

@ -80,6 +80,7 @@ typedef struct _EventQueue {
} EventQueueRec, *EventQueuePtr; } EventQueueRec, *EventQueuePtr;
static EventQueueRec miEventQueue; static EventQueueRec miEventQueue;
static EventListPtr masterEvents; /* for use in mieqProcessInputEvents */
Bool Bool
mieqInit(void) mieqInit(void)
@ -98,6 +99,17 @@ mieqInit(void)
FatalError("Could not allocate event queue.\n"); FatalError("Could not allocate event queue.\n");
miEventQueue.events[i].events = evlist; miEventQueue.events[i].events = evlist;
} }
/* XXX: mE is just 1 event long, if we have Motion + Valuator they are
* squashed into the first event to make passing it into the event
* processing handlers easier. This should be fixed when the processing
* handlers switch to EventListPtr instead of xEvent */
masterEvents = InitEventList(1);
if (!masterEvents)
FatalError("Could not allocated MD event queue.\n");
SetMinimumEventSize(masterEvents, 1,
(1 + MAX_VALUATOR_EVENTS) * sizeof(xEvent));
SetInputCheck(&miEventQueue.head, &miEventQueue.tail); SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
return TRUE; return TRUE;
} }
@ -275,28 +287,21 @@ ChangeDeviceID(DeviceIntPtr dev, xEvent* event)
*/ */
void void
CopyGetMasterEvent(DeviceIntPtr mdev, xEvent* original, CopyGetMasterEvent(DeviceIntPtr mdev, xEvent* original,
xEvent** master, int count) EventListPtr master, int count)
{ {
if (count > 1) { int len = count * sizeof(xEvent);
*master = xcalloc(count, sizeof(xEvent));
if (!*master) /* Assumption: GenericEvents always have count 1 */
FatalError("[mi] No memory left for master event.\n");
while(count--) if (GEV(original)->type == GenericEvent)
{ len += GEV(original)->length * 4;
memcpy(&(*master)[count], &original[count], sizeof(xEvent));
ChangeDeviceID(mdev, &(*master)[count]); if (master->evlen < len)
} SetMinimumEventSize(master, 1, len);
} else
{ memcpy(master->event, original, len);
int len = sizeof(xEvent); while (count--)
if (original->u.u.type == GenericEvent) ChangeDeviceID(mdev, &master->event[count]);
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(). */
@ -308,8 +313,7 @@ mieqProcessInputEvents(void)
int x = 0, y = 0; int x = 0, y = 0;
int type, nevents, evlen, i; int type, nevents, evlen, i;
ScreenPtr screen; ScreenPtr screen;
xEvent *event, xEvent *event;
*master_event = NULL;
DeviceIntPtr dev = NULL, DeviceIntPtr dev = NULL,
master = NULL; master = NULL;
@ -358,10 +362,7 @@ mieqProcessInputEvents(void)
} }
else { else {
if (master) if (master)
CopyGetMasterEvent(master, event, CopyGetMasterEvent(master, event, masterEvents, nevents);
&master_event, nevents);
else
master_event = NULL;
/* If someone's registered a custom event handler, let them /* If someone's registered a custom event handler, let them
* steal it. */ * steal it. */
@ -370,19 +371,18 @@ mieqProcessInputEvents(void)
handler(DequeueScreen(dev)->myNum, event, dev, nevents); handler(DequeueScreen(dev)->myNum, event, dev, nevents);
if (master) if (master)
handler(DequeueScreen(master)->myNum, handler(DequeueScreen(master)->myNum,
master_event, master, nevents); masterEvents->event, master, nevents);
} else } else
{ {
/* process slave first, then master */ /* process slave first, then master */
dev->public.processInputProc(event, dev, nevents); dev->public.processInputProc(event, dev, nevents);
if (master) if (master)
master->public.processInputProc(master_event, master, master->public.processInputProc(masterEvents->event, master,
nevents); nevents);
} }
xfree(event); xfree(event);
xfree(master_event);
} }
/* Update the sprite now. Next event may be from different device. */ /* Update the sprite now. Next event may be from different device. */

View File

@ -42,13 +42,14 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern int DeviceValuator; extern int DeviceValuator;
static EventListPtr masterEvents = NULL;
void void
XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
{ {
int * devVal; int * devVal;
INT32 * evVal; INT32 * evVal;
xEvent events[2], xEvent events[2];
*m_events = NULL; /* master dev */
deviceKeyButtonPointer *btn; deviceKeyButtonPointer *btn;
deviceValuator * val; deviceValuator * val;
int x,y; int x,y;
@ -107,18 +108,22 @@ DeviceIntPtr master = NULL;
* cases, unless dev is both a keyboard and a mouse. * cases, unless dev is both a keyboard and a mouse.
*/ */
if (!dev->isMaster && dev->u.master) { if (!dev->isMaster && dev->u.master) {
if (!masterEvents)
{
masterEvents = InitEventList(1);
SetMinimumEventSize(masterEvents, 1, (1 + MAX_VALUATOR_EVENTS) * sizeof(xEvent));
}
master = dev->u.master; master = dev->u.master;
if (!IsPointerDevice(master)) if (!IsPointerDevice(master))
master = GetPairedDevice(dev->u.master); master = GetPairedDevice(dev->u.master);
CopyGetMasterEvent(master, &events, &m_events, count); CopyGetMasterEvent(master, &events, masterEvents, count);
} }
(*dev->public.processInputProc)((xEventPtr)btn, dev, count); (*dev->public.processInputProc)((xEventPtr)btn, dev, count);
if (master) { if (master) {
(*master->public.processInputProc)(m_events, master, count); (*master->public.processInputProc)(masterEvents->event, master, count);
xfree(m_events);
} }
return; return;
} }