dix: abstract event filters through GetEventFilters.
Don't let everyone acces the filters[] array directly. This is necessary once we start dealing with GenericEvents, where the filters are a bit more complicated. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
		
							parent
							
								
									8a8763f150
								
							
						
					
					
						commit
						70896f6127
					
				
							
								
								
									
										56
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										56
									
								
								dix/events.c
								
								
								
								
							| 
						 | 
				
			
			@ -399,6 +399,24 @@ static Mask filters[MAXDEVICES][128] = {
 | 
			
		|||
	CantBeFiltered		       /* MappingNotify */
 | 
			
		||||
}};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * For the given event, return the matching event filter. This filter may then
 | 
			
		||||
 * be AND'ed with the selected event mask.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] dev The device the event belongs to, may be NULL.
 | 
			
		||||
 * @param[in] event The event to get the filter for. Only the type of the
 | 
			
		||||
 *                  event matters, or the extension + evtype for GenericEvents.
 | 
			
		||||
 * @return The filter mask for the given event.
 | 
			
		||||
 */
 | 
			
		||||
static Mask
 | 
			
		||||
GetEventFilter(DeviceIntPtr dev, xEvent *event)
 | 
			
		||||
{
 | 
			
		||||
    if (event->u.u.type != GenericEvent)
 | 
			
		||||
        return filters[dev ? dev->id : 0][event->u.u.type];
 | 
			
		||||
    ErrorF("[dix] Unknown device type %d. No filter\n", event->u.u.type);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static CARD8 criticalEvents[32] =
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -2176,9 +2194,11 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
 | 
			
		|||
    int filter = 0;
 | 
			
		||||
    int type;
 | 
			
		||||
    OtherInputMasks *inputMasks;
 | 
			
		||||
    xEvent ev;
 | 
			
		||||
 | 
			
		||||
    type = GetXIType(event);
 | 
			
		||||
    filter = filters[dev->id][type];
 | 
			
		||||
    ev.u.u.type = type; /* GetEventFilter only cares about type */
 | 
			
		||||
    filter = GetEventFilter(dev, &ev);
 | 
			
		||||
 | 
			
		||||
    /* Check for XI mask */
 | 
			
		||||
    if (type && (inputMasks = wOtherInputMasks(win)) &&
 | 
			
		||||
| 
						 | 
				
			
			@ -2337,7 +2357,7 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
 | 
			
		|||
	return 0;
 | 
			
		||||
    /* We don't know a device here. However, this should only ever be called
 | 
			
		||||
       for a non-device event so we are safe to use 0*/
 | 
			
		||||
    filter = filters[0][xE->u.u.type];
 | 
			
		||||
    filter = GetEventFilter(NULL, xE);
 | 
			
		||||
    if ((filter & SubstructureNotifyMask) && (xE->u.u.type != CreateNotify))
 | 
			
		||||
	xE->u.destroyNotify.event = pWin->drawable.id;
 | 
			
		||||
    if (filter != StructureAndSubMask)
 | 
			
		||||
| 
						 | 
				
			
			@ -3249,8 +3269,8 @@ CheckPassiveGrabsOnWindow(
 | 
			
		|||
	    FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
 | 
			
		||||
 | 
			
		||||
	    TryClientEvents(rClient(grab), device, xE, count,
 | 
			
		||||
				   filters[device->id][xE->u.u.type],
 | 
			
		||||
				   filters[device->id][xE->u.u.type],  grab);
 | 
			
		||||
                                   GetEventFilter(device, xE),
 | 
			
		||||
                                   GetEventFilter(device, xE), grab);
 | 
			
		||||
 | 
			
		||||
	    if (grabinfo->sync.state == FROZEN_NO_EVENT)
 | 
			
		||||
	    {
 | 
			
		||||
| 
						 | 
				
			
			@ -3396,7 +3416,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 | 
			
		|||
    /* just deliver it to the focus window */
 | 
			
		||||
    FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
 | 
			
		||||
    deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
 | 
			
		||||
                                       filters[keybd->id][xE->u.u.type],
 | 
			
		||||
                                       GetEventFilter(keybd, xE),
 | 
			
		||||
                                       NullGrab, keybd->id);
 | 
			
		||||
 | 
			
		||||
    if (deliveries > 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -3414,7 +3434,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 | 
			
		|||
 | 
			
		||||
        FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
 | 
			
		||||
        deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
 | 
			
		||||
                                           filters[keybd->id][core.u.u.type],
 | 
			
		||||
                                           GetEventFilter(keybd, &core),
 | 
			
		||||
                                           NullGrab, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3520,7 +3540,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 | 
			
		|||
            {
 | 
			
		||||
                deliveries = TryClientEvents(rClient(grab), thisDev,
 | 
			
		||||
                        &core, 1, mask,
 | 
			
		||||
                        filters[thisDev->id][core.u.u.type],
 | 
			
		||||
                        GetEventFilter(thisDev, &core),
 | 
			
		||||
                        grab);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -3545,7 +3565,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 | 
			
		|||
                    TryClientEvents(rClient(grab), thisDev,
 | 
			
		||||
                            xi, count,
 | 
			
		||||
                            mask,
 | 
			
		||||
                            filters[thisDev->id][xi->u.u.type],
 | 
			
		||||
                            GetEventFilter(thisDev, xi),
 | 
			
		||||
                            grab);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3899,14 +3919,15 @@ CoreEnterLeaveEvent(
 | 
			
		|||
             IsParent(focus, pWin)))
 | 
			
		||||
        event.u.enterLeave.flags |= ELFlagFocus;
 | 
			
		||||
 | 
			
		||||
    if ((mask & filters[mouse->id][type]))
 | 
			
		||||
    if ((mask & GetEventFilter(mouse, &event)))
 | 
			
		||||
    {
 | 
			
		||||
        if (grab)
 | 
			
		||||
            TryClientEvents(rClient(grab), mouse, &event, 1, mask,
 | 
			
		||||
                                  filters[mouse->id][type], grab);
 | 
			
		||||
                            GetEventFilter(mouse, &event), grab);
 | 
			
		||||
        else
 | 
			
		||||
            DeliverEventsToWindow(mouse, pWin, &event, 1,
 | 
			
		||||
                                  filters[mouse->id][type], NullGrab, 0);
 | 
			
		||||
                                  GetEventFilter(mouse, &event),
 | 
			
		||||
                                  NullGrab, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((type == EnterNotify) && (mask & KeymapStateMask))
 | 
			
		||||
| 
						 | 
				
			
			@ -3979,16 +4000,17 @@ DeviceEnterLeaveEvent(
 | 
			
		|||
    mskidx = mouse->id;
 | 
			
		||||
    inputMasks = wOtherInputMasks(pWin);
 | 
			
		||||
    if (inputMasks &&
 | 
			
		||||
       (filters[mouse->id][devEnterLeave->type] &
 | 
			
		||||
       (GetEventFilter(mouse, (xEvent*)devEnterLeave) &
 | 
			
		||||
            inputMasks->deliverableEvents[mskidx]))
 | 
			
		||||
    {
 | 
			
		||||
        if (grab)
 | 
			
		||||
            TryClientEvents(rClient(grab), mouse,
 | 
			
		||||
                            (xEvent*)devEnterLeave, 1, mask,
 | 
			
		||||
                            filters[mouse->id][devEnterLeave->type], grab);
 | 
			
		||||
                            GetEventFilter(mouse, (xEvent*)devEnterLeave),
 | 
			
		||||
                            grab);
 | 
			
		||||
        else
 | 
			
		||||
            DeliverEventsToWindow(mouse, pWin, (xEvent*)devEnterLeave, 1,
 | 
			
		||||
                                  filters[mouse->id][devEnterLeave->type],
 | 
			
		||||
                                  GetEventFilter(mouse, (xEvent*)devEnterLeave),
 | 
			
		||||
                                  NullGrab, mouse->id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4004,8 +4026,9 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
 | 
			
		|||
    event.u.u.type = type;
 | 
			
		||||
    event.u.u.detail = detail;
 | 
			
		||||
    event.u.focus.window = pWin->drawable.id;
 | 
			
		||||
    (void)DeliverEventsToWindow(dev, pWin, &event, 1,
 | 
			
		||||
            filters[dev->id][type], NullGrab, 0);
 | 
			
		||||
 | 
			
		||||
    DeliverEventsToWindow(dev, pWin, &event, 1,
 | 
			
		||||
                          GetEventFilter(dev, &event), NullGrab, 0);
 | 
			
		||||
    if ((type == FocusIn) &&
 | 
			
		||||
            ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -5492,3 +5515,4 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
 | 
			
		|||
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue