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