Merge branch 'raw-events' into next
Conflicts: configure.ac dix/events.c
This commit is contained in:
		
						commit
						057cc92ebf
					
				| 
						 | 
					@ -778,7 +778,7 @@ WINDOWSWMPROTO="windowswmproto"
 | 
				
			||||||
APPLEWMPROTO="applewmproto >= 1.4"
 | 
					APPLEWMPROTO="applewmproto >= 1.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl Core modules for most extensions, et al.
 | 
					dnl Core modules for most extensions, et al.
 | 
				
			||||||
SDK_REQUIRED_MODULES="[xproto >= 7.0.22] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
 | 
					SDK_REQUIRED_MODULES="[xproto >= 7.0.22] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 2.0.99.1] [kbproto >= 1.0.3] fontsproto"
 | 
				
			||||||
# Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
 | 
					# Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
 | 
				
			||||||
AC_SUBST(SDK_REQUIRED_MODULES)
 | 
					AC_SUBST(SDK_REQUIRED_MODULES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										92
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										92
									
								
								dix/events.c
								
								
								
								
							| 
						 | 
					@ -2268,33 +2268,93 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 | 
				
			||||||
    return nondeliveries;
 | 
					    return nondeliveries;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Filter out raw events for XI 2.0 and XI 2.1 clients.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If there is a grab on the device, 2.0 clients only get raw events if they
 | 
				
			||||||
 | 
					 * have the grab. 2.1+ clients get raw events in all cases.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return TRUE if the event should be discarded, FALSE otherwise.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static BOOL
 | 
				
			||||||
 | 
					FilterRawEvents(const ClientPtr client, const GrabPtr grab)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    XIClientPtr client_xi_version;
 | 
				
			||||||
 | 
					    int cmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* device not grabbed -> don't filter */
 | 
				
			||||||
 | 
					    if (!grab)
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    client_xi_version = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmp = version_compare(client_xi_version->major_version,
 | 
				
			||||||
 | 
					                          client_xi_version->minor_version, 2, 0);
 | 
				
			||||||
 | 
					    /* XI 2.0: if device is grabbed, skip
 | 
				
			||||||
 | 
					       XI 2.1: if device is grabbed by us, skip, we've already delivered */
 | 
				
			||||||
 | 
					    return (cmp == 0) ? TRUE : SameClient(grab, client);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Deliver a raw event to the grab owner (if any) and to all root windows.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Raw event delivery differs between XI 2.0 and XI 2.1.
 | 
				
			||||||
 | 
					 * XI 2.0: events delivered to the grabbing client (if any) OR to all root
 | 
				
			||||||
 | 
					 * windows
 | 
				
			||||||
 | 
					 * XI 2.1: events delivered to all root windows, regardless of grabbing
 | 
				
			||||||
 | 
					 * state.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
 | 
					DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GrabPtr grab = device->deviceGrab.grab;
 | 
					    GrabPtr grab = device->deviceGrab.grab;
 | 
				
			||||||
 | 
					    xEvent *xi;
 | 
				
			||||||
 | 
					    int i, rc;
 | 
				
			||||||
 | 
					    int filter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rc = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
 | 
				
			||||||
 | 
					    if (rc != Success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
 | 
				
			||||||
 | 
					                __func__, device->name, rc);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (grab)
 | 
					    if (grab)
 | 
				
			||||||
        DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
 | 
					        DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
 | 
				
			||||||
    else { /* deliver to all root windows */
 | 
					 | 
				
			||||||
        xEvent *xi;
 | 
					 | 
				
			||||||
        int i;
 | 
					 | 
				
			||||||
        int filter;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
 | 
					    filter = GetEventFilter(device, xi);
 | 
				
			||||||
        if (i != Success)
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < screenInfo.numScreens; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        WindowPtr root;
 | 
				
			||||||
 | 
					        InputClients *inputclients;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        root = screenInfo.screens[i]->root;
 | 
				
			||||||
 | 
					        if (!GetClientsForDelivery(device, root, xi, filter, &inputclients))
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (; inputclients; inputclients = inputclients->next)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
 | 
					            ClientPtr c; /* unused */
 | 
				
			||||||
                    __func__, device->name, i);
 | 
					            Mask m;      /* unused */
 | 
				
			||||||
            return;
 | 
					            InputClients ic = *inputclients;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Because we run through the list manually, copy the actual
 | 
				
			||||||
 | 
					             * list, shorten the copy to only have one client and then pass
 | 
				
			||||||
 | 
					             * that down to DeliverEventToInputClients. This way we avoid
 | 
				
			||||||
 | 
					             * double events on XI 2.1 clients that have a grab on the
 | 
				
			||||||
 | 
					             * device.
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            ic.next = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!FilterRawEvents(rClient(&ic), grab))
 | 
				
			||||||
 | 
					                DeliverEventToInputClients(device, &ic, root, xi, 1,
 | 
				
			||||||
 | 
					                                           filter, NULL, &c, &m);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        filter = GetEventFilter(device, xi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (i = 0; i < screenInfo.numScreens; i++)
 | 
					 | 
				
			||||||
            DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
 | 
					 | 
				
			||||||
                                  filter, NullGrab);
 | 
					 | 
				
			||||||
        free(xi);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    free(xi);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* If the event goes to dontClient, don't send it and return 0.  if
 | 
					/* If the event goes to dontClient, don't send it and return 0.  if
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* X Input */
 | 
					/* X Input */
 | 
				
			||||||
#define SERVER_XI_MAJOR_VERSION			2
 | 
					#define SERVER_XI_MAJOR_VERSION			2
 | 
				
			||||||
#define SERVER_XI_MINOR_VERSION			0
 | 
					#define SERVER_XI_MINOR_VERSION			1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* XKB */
 | 
					/* XKB */
 | 
				
			||||||
#define SERVER_XKB_MAJOR_VERSION		1
 | 
					#define SERVER_XKB_MAJOR_VERSION		1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue