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:
parent
0b4fef6337
commit
d281866b74
58
mi/mieq.c
58
mi/mieq.c
|
@ -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)
|
||||||
{
|
|
||||||
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;
|
len += GEV(original)->length * 4;
|
||||||
*master = xalloc(len);
|
|
||||||
if (!*master)
|
if (master->evlen < len)
|
||||||
FatalError("[mi] No memory left for master event.\n");
|
SetMinimumEventSize(master, 1, len);
|
||||||
memcpy(*master, original, len);
|
|
||||||
ChangeDeviceID(mdev, *master);
|
memcpy(master->event, original, len);
|
||||||
}
|
while (count--)
|
||||||
|
ChangeDeviceID(mdev, &master->event[count]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user