Xext: add GEDeviceMaskIsSet (GE mask checking per device)
If a mask was set for the NULL device, then we pretend the mask is set for all devices.
This commit is contained in:
		
							parent
							
								
									91dc8c43d2
								
							
						
					
					
						commit
						379f057646
					
				
							
								
								
									
										34
									
								
								Xext/geext.c
								
								
								
								
							
							
						
						
									
										34
									
								
								Xext/geext.c
								
								
								
								
							| 
						 | 
				
			
			@ -378,4 +378,38 @@ void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
 | 
			
		|||
    GERecalculateWinMask(pWin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return TRUE if the mask for the given device is set.
 | 
			
		||||
 * @param pWin Window the event may be delivered to.
 | 
			
		||||
 * @param pDev Device the device originating the event. May be NULL.
 | 
			
		||||
 * @param extension Extension ID
 | 
			
		||||
 * @param mask Event mask
 | 
			
		||||
 */
 | 
			
		||||
BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
 | 
			
		||||
                       int extension, Mask mask)
 | 
			
		||||
{
 | 
			
		||||
    GenericMaskPtr gemask;
 | 
			
		||||
 | 
			
		||||
    if (!pWin->optional || !pWin->optional->geMasks)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    extension &= 0x7F;
 | 
			
		||||
 | 
			
		||||
    if (!pWin->optional->geMasks->eventMasks[extension] & mask)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    gemask = pWin->optional->geMasks->geClients;
 | 
			
		||||
 | 
			
		||||
    while(gemask)
 | 
			
		||||
    {
 | 
			
		||||
        if ((!gemask->dev || gemask->dev == pDev) && 
 | 
			
		||||
                (gemask->eventMask[extension] & mask))
 | 
			
		||||
            return TRUE;
 | 
			
		||||
 | 
			
		||||
        gemask = gemask->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,8 @@ void GERegisterExtension(
 | 
			
		|||
        );
 | 
			
		||||
 | 
			
		||||
void GEInitEvent(xGenericEvent* ev, int extension);
 | 
			
		||||
 | 
			
		||||
BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev, 
 | 
			
		||||
                       int extension, Mask mask);
 | 
			
		||||
 | 
			
		||||
void GEExtensionInit(void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2151,7 +2151,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 | 
			
		|||
 | 
			
		||||
            /* if we get here, filter should be set to the GE specific mask.
 | 
			
		||||
               check if any client wants it */
 | 
			
		||||
            if (!GEMaskIsSet(pWin, GEEXT(pEvents), filter))
 | 
			
		||||
            if (!GEDeviceMaskIsSet(pWin, pDev, GEEXT(pEvents), filter))
 | 
			
		||||
                return 0;
 | 
			
		||||
 | 
			
		||||
            /* run through all clients, deliver event */
 | 
			
		||||
| 
						 | 
				
			
			@ -2471,7 +2471,7 @@ DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab,
 | 
			
		|||
 | 
			
		||||
        while(win)
 | 
			
		||||
        {
 | 
			
		||||
            if (GEMaskIsSet(win, GEEXT(xE), filter))
 | 
			
		||||
            if (GEDeviceMaskIsSet(win, dev, GEEXT(xE), filter))
 | 
			
		||||
            {
 | 
			
		||||
                if (GEExtensions[GEEXTIDX(xE)].evfill)
 | 
			
		||||
                    GEExtensions[GEEXTIDX(xE)].evfill(ge, dev, win, grab);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue