Allow XI2 event selection for AllDevices and AllMasterDevices.
This commit is contained in:
		
							parent
							
								
									808a158182
								
							
						
					
					
						commit
						97e89a5957
					
				| 
						 | 
					@ -67,6 +67,7 @@ ProcXISelectEvent(ClientPtr client)
 | 
				
			||||||
    int rc, num_masks, i;
 | 
					    int rc, num_masks, i;
 | 
				
			||||||
    WindowPtr win;
 | 
					    WindowPtr win;
 | 
				
			||||||
    DeviceIntPtr dev;
 | 
					    DeviceIntPtr dev;
 | 
				
			||||||
 | 
					    DeviceIntRec dummy;
 | 
				
			||||||
    xXIDeviceEventMask *evmask;
 | 
					    xXIDeviceEventMask *evmask;
 | 
				
			||||||
    int *types = NULL;
 | 
					    int *types = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,7 +110,13 @@ ProcXISelectEvent(ClientPtr client)
 | 
				
			||||||
    num_masks = stuff->num_masks;
 | 
					    num_masks = stuff->num_masks;
 | 
				
			||||||
    while(num_masks--)
 | 
					    while(num_masks--)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
 | 
					        if (evmask->deviceid == AllDevices ||
 | 
				
			||||||
 | 
					            evmask->deviceid == AllMasterDevices)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            dummy.id = evmask->deviceid;
 | 
				
			||||||
 | 
					            dev = &dummy;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					            dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
 | 
				
			||||||
        XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
 | 
					        XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
 | 
				
			||||||
        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
 | 
					        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										12
									
								
								dix/events.c
								
								
								
								
							| 
						 | 
					@ -459,7 +459,9 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
 | 
				
			||||||
    if (XI2_EVENT(event))
 | 
					    if (XI2_EVENT(event))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        int byte = ((xGenericEvent*)event)->evtype / 8;
 | 
					        int byte = ((xGenericEvent*)event)->evtype / 8;
 | 
				
			||||||
        return other->xi2mask[dev->id][byte];
 | 
					        return (other->xi2mask[dev->id][byte] |
 | 
				
			||||||
 | 
					                other->xi2mask[AllDevices][byte] |
 | 
				
			||||||
 | 
					                (dev->isMaster? other->xi2mask[AllMasterDevices][byte] : 0));
 | 
				
			||||||
    } else if (CORE_EVENT(event))
 | 
					    } else if (CORE_EVENT(event))
 | 
				
			||||||
        return other->mask[AllDevices];
 | 
					        return other->mask[AllDevices];
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					@ -1995,10 +1997,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 | 
				
			||||||
        else if (XI2_EVENT(pEvents))
 | 
					        else if (XI2_EVENT(pEvents))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
 | 
					            OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
 | 
				
			||||||
            int evtype = ((xGenericEvent*)pEvents)->evtype;
 | 
					 | 
				
			||||||
            /* Has any client selected for the event? */
 | 
					            /* Has any client selected for the event? */
 | 
				
			||||||
            if (!inputMasks ||
 | 
					            if (!GetWindowXI2Mask(pDev, pWin, pEvents))
 | 
				
			||||||
                !(inputMasks->xi2mask[mskidx][evtype/8] & filter))
 | 
					 | 
				
			||||||
                return 0;
 | 
					                return 0;
 | 
				
			||||||
            other = inputMasks->inputClients;
 | 
					            other = inputMasks->inputClients;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
| 
						 | 
					@ -2291,7 +2291,9 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
 | 
				
			||||||
    ((xGenericEvent*)&ev)->evtype = type;
 | 
					    ((xGenericEvent*)&ev)->evtype = type;
 | 
				
			||||||
    filter = GetEventFilter(dev, &ev);
 | 
					    filter = GetEventFilter(dev, &ev);
 | 
				
			||||||
    if (type && (inputMasks = wOtherInputMasks(win)) &&
 | 
					    if (type && (inputMasks = wOtherInputMasks(win)) &&
 | 
				
			||||||
        inputMasks->xi2mask[dev->id][type / 8] & filter)
 | 
					        ((inputMasks->xi2mask[AllDevices][type/8] & filter) ||
 | 
				
			||||||
 | 
					         ((inputMasks->xi2mask[AllMasterDevices][type/8] & filter) && dev->isMaster) ||
 | 
				
			||||||
 | 
					         (inputMasks->xi2mask[dev->id][type/8] & filter)))
 | 
				
			||||||
        rc |= XI2_MASK;
 | 
					        rc |= XI2_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type = GetXIType(event);
 | 
					    type = GetXIType(event);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue