dix: hide the sequenceNumber key repeat hack behind two functions.
Just in case we figure out a better way to do it in the future. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
		
							parent
							
								
									bfb219f532
								
							
						
					
					
						commit
						219ae5b628
					
				| 
						 | 
				
			
			@ -55,6 +55,35 @@ static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
 | 
			
		|||
static int eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **dcce);
 | 
			
		||||
static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
 | 
			
		||||
static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
 | 
			
		||||
 | 
			
		||||
/* Do not use, read comments below */
 | 
			
		||||
BOOL EventIsKeyRepeat(xEvent *event);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Hack to allow detectable autorepeat for core and XI1 events.
 | 
			
		||||
 * The sequence number is unused until we send to the client and can be
 | 
			
		||||
 * misused to store data. More or less, anyway.
 | 
			
		||||
 *
 | 
			
		||||
 * Do not use this. It may change any time without warning, eat your babies
 | 
			
		||||
 * and piss on your cat.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
EventSetKeyRepeatFlag(xEvent *event, BOOL on)
 | 
			
		||||
{
 | 
			
		||||
    event->u.u.sequenceNumber = on;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check if the event was marked as a repeat event before.
 | 
			
		||||
 * NOTE: This is a nasty hack and should NOT be used by anyone else but
 | 
			
		||||
 * TryClientEvents.
 | 
			
		||||
 */
 | 
			
		||||
BOOL
 | 
			
		||||
EventIsKeyRepeat(xEvent *event)
 | 
			
		||||
{
 | 
			
		||||
    return !!event->u.u.sequenceNumber;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert the given event to the respective core event.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -90,8 +119,7 @@ EventToCore(InternalEvent *event, xEvent *core)
 | 
			
		|||
                core->u.keyButtonPointer.rootX = e->root_x;
 | 
			
		||||
                core->u.keyButtonPointer.rootY = e->root_y;
 | 
			
		||||
                core->u.keyButtonPointer.state = e->corestate;
 | 
			
		||||
                if (e->type == ET_KeyPress && e->key_repeat)
 | 
			
		||||
                    core->u.u.sequenceNumber = 1;
 | 
			
		||||
                EventSetKeyRepeatFlag(core, (e->type == ET_KeyPress && e->key_repeat));
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case ET_ProximityIn:
 | 
			
		||||
| 
						 | 
				
			
			@ -239,8 +267,8 @@ eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
 | 
			
		|||
    kbp->root_y   = ev->root_y;
 | 
			
		||||
    kbp->deviceid = ev->deviceid;
 | 
			
		||||
    kbp->state    = ev->corestate;
 | 
			
		||||
    if (ev->type == ET_KeyPress && ev->key_repeat)
 | 
			
		||||
        kbp->sequenceNumber = 1;
 | 
			
		||||
    EventSetKeyRepeatFlag((xEvent*)kbp,
 | 
			
		||||
                          (ev->type == ET_KeyPress && ev->key_repeat));
 | 
			
		||||
 | 
			
		||||
    if (num_events > 1)
 | 
			
		||||
        kbp->deviceid |= MORE_EVENTS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -226,6 +226,9 @@ static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
 | 
			
		|||
                                      DeviceEvent *event,
 | 
			
		||||
                                      BOOL checkCore);
 | 
			
		||||
 | 
			
		||||
/** Key repeat hack. Do not use but in TryClientEvents */
 | 
			
		||||
extern BOOL EventIsKeyRepeat(xEvent *event);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Main input device struct.
 | 
			
		||||
 *     inputInfo.pointer
 | 
			
		||||
| 
						 | 
				
			
			@ -1948,8 +1951,7 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
 | 
			
		|||
            return 1;
 | 
			
		||||
    } else if (type == KeyPress)
 | 
			
		||||
    {
 | 
			
		||||
        /* sequenceNumber == 1 if autorepeat is set */
 | 
			
		||||
        if (pEvents->u.u.sequenceNumber)
 | 
			
		||||
        if (EventIsKeyRepeat(pEvents))
 | 
			
		||||
        {
 | 
			
		||||
            if (!_XkbWantsDetectableAutoRepeat(client))
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1970,7 +1972,7 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
 | 
			
		|||
 | 
			
		||||
    } else if (type == DeviceKeyPress)
 | 
			
		||||
    {
 | 
			
		||||
        if (((deviceKeyButtonPointer *)pEvents)->sequenceNumber)
 | 
			
		||||
        if (EventIsKeyRepeat(pEvents))
 | 
			
		||||
        {
 | 
			
		||||
            if (!_XkbWantsDetectableAutoRepeat(client))
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue