xserver: Branch 'mpx' - 7 commits

Peter Hutterer whot at kemper.freedesktop.org
Fri Jan 18 03:24:34 PST 2008


 Xext/xvmain.c               |    8 +--
 Xi/chdevhier.c              |   25 +++++++---
 dix/dispatch.c              |    9 ++-
 dix/events.c                |  106 ++++++++++++++++++++++++++++----------------
 hw/xfree86/common/xf86DGA.c |    4 -
 include/dix.h               |    1 
 include/input.h             |    6 +-
 mi/miexpose.c               |    4 -
 8 files changed, 105 insertions(+), 58 deletions(-)

New commits:
commit 6492d513c0022d70f838d1b2561442c7a41e401f
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 21:44:22 2008 +1030

    dix: if a client has a core grab, return the grab device on QueryPointer.
    
    The correct thing would be to return the ClientPointer. However, if the client
    for some reason has a core grab on another device (e.g. as result of a passive
    grab), return the coordinates of the grabbed device instead.
    
    This makes the use of nautilus a bit saner.

diff --git a/dix/events.c b/dix/events.c
index f4925e4..f955d81 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5595,7 +5595,8 @@ ProcQueryPointer(ClientPtr client)
     xQueryPointerReply rep;
     WindowPtr pWin, t;
     DeviceIntPtr mouse = PickPointer(client);
-    SpritePtr pSprite = mouse->spriteInfo->sprite;
+    DeviceIntPtr dev;
+    SpritePtr pSprite;
     int rc;
     REQUEST(xResourceReq);
     REQUEST_SIZE_MATCH(xResourceReq);
@@ -5607,6 +5608,19 @@ ProcQueryPointer(ClientPtr client)
     if (rc != Success)
 	return rc;
 
+    for (dev = inputInfo.devices; dev; dev = dev->next)
+    {
+        if (dev->isMaster && IsPointerDevice(dev) &&
+                dev->deviceGrab.grab && dev->deviceGrab.grab->coreGrab &&
+                SameClient(dev->deviceGrab.grab, client))
+        {
+            /* special case, we have a grab on the device so we need to return
+             * this one */
+            mouse = dev;
+        }
+    }
+
+    pSprite = mouse->spriteInfo->sprite;
     if (mouse->valuator->motionHintWindow)
 	MaybeStopHint(mouse, client);
     rep.type = X_Reply;
commit cd2ad4c2ed58b49cee085174e77c242048159321
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 20:11:55 2008 +1030

    dix: remove some superfluous lines in ProcChangeActivePointerGrab.

diff --git a/dix/events.c b/dix/events.c
index de68b57..f4925e4 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5265,16 +5265,11 @@ ProcChangeActivePointerGrab(ClientPtr client)
                 if (grab && grab->coreGrab && SameClient(grab, client))
                 {
                     device = grabbed;
+                    grab = device->deviceGrab.grab;
                     break;
                 }
             }
         }
-        /* nope. no grab on any actual device */
-        if (!grabbed)
-        {
-            device = inputInfo.pointer;
-            grab = inputInfo.pointer->deviceGrab.grab;
-        }
     }
 
     if (!grab)
commit 8a925d201efac52ef663ea3ff46acc5046178666
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 20:06:29 2008 +1030

    dix: free the genericMasks when ungrabbing.
    
    This finally plugs a memory hole created by grabs registering for generic
    events.

diff --git a/dix/events.c b/dix/events.c
index c3697da..de68b57 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1627,6 +1627,14 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
     mouse->deviceGrab.grab = NullGrab;
     mouse->deviceGrab.sync.state = NOT_GRABBED;
     mouse->deviceGrab.fromPassiveGrab = FALSE;
+
+    /* make sure the potential XGE event mask is freed too*/
+    if (grab->genericMasks)
+    {
+        xfree(grab->genericMasks);
+        grab->genericMasks = NULL;
+    }
+
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
 	if (dev->deviceGrab.sync.other == grab)
@@ -1704,6 +1712,12 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     keybd->deviceGrab.grab = NullGrab;
     keybd->deviceGrab.sync.state = NOT_GRABBED;
     keybd->deviceGrab.fromPassiveGrab = FALSE;
+    if (grab->genericMasks)
+    {
+        xfree(grab->genericMasks);
+        grab->genericMasks = NULL;
+    }
+
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
 	if (dev->deviceGrab.sync.other == grab)
@@ -2226,9 +2240,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
         inputMasks = wOtherInputMasks(pWin);
         tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[pDev->id]: 0;
 
-        /* get the XGE event mask.
-         * FIXME: needs to be freed somewhere too.
-         */
+        /* get the XGE event mask. */
         tempGrab.genericMasks = NULL;
         if (pWin->optional && pWin->optional->geMasks)
         {
commit 8949d81a3c79eef351d7c018c76692dcca74b63e
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 19:45:54 2008 +1030

    include: mark CoreProcessPointerEvent, CoreProcessKeyboardEvent as deprecated.
    
    ProcessOtherEvent does all the work now.

diff --git a/include/input.h b/include/input.h
index 6384716..da02aea 100644
--- a/include/input.h
+++ b/include/input.h
@@ -375,12 +375,12 @@ extern void ProcessKeyboardEvent(
 extern void CoreProcessPointerEvent(
     xEventPtr /*xE*/,
     DeviceIntPtr /*mouse*/,
-    int /*count*/);
+    int /*count*/) _X_DEPRECATED;
 
-extern void CoreProcessKeyboardEvent(
+extern _X_DEPRECATED void CoreProcessKeyboardEvent(
     xEventPtr /*xE*/,
     DeviceIntPtr /*keybd*/,
-    int /*count*/);
+    int /*count*/) _X_DEPRECATED;
 #endif
 
 extern Bool LegalModifier(
commit d323fd64206ddb4221daa7cf7504daf62c5e7d90
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 19:17:42 2008 +1030

    dix: remove inputInfo.pointer refernce in EventSelectForWindow
    
    If the window being changed is set as the motion hint window for any device,
    the device's motion hint window is set to NULL. Which is kinda what the old
    code did, except that it did it with only the VCP.

diff --git a/dix/events.c b/dix/events.c
index c91e73b..c3697da 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4202,6 +4202,7 @@ EventSelectForWindow(WindowPtr pWin, ClientPtr client, Mask mask)
 {
     Mask check;
     OtherClients * others;
+    DeviceIntPtr dev;
     int rc;
 
     if (mask & ~AllEventMasks)
@@ -4268,11 +4269,14 @@ EventSelectForWindow(WindowPtr pWin, ClientPtr client, Mask mask)
 	    return BadAlloc;
     }
 maskSet:
-    if ((inputInfo.pointer->valuator->motionHintWindow == pWin) &&
-	(mask & PointerMotionHintMask) &&
-	!(check & PointerMotionHintMask) &&
-	!inputInfo.pointer->deviceGrab.grab) /* VCP shouldn't have deviceGrab */
-	inputInfo.pointer->valuator->motionHintWindow = NullWindow;
+    if ((mask & PointerMotionHintMask) && !(check & PointerMotionHintMask))
+    {
+        for (dev = inputInfo.devices; dev; dev = dev->next)
+        {
+            if (dev->valuator && dev->valuator->motionHintWindow == pWin)
+                dev->valuator->motionHintWindow = NullWindow;
+        }
+    }
     RecalculateDeliverableEvents(pWin);
     return Success;
 }
commit 883811c2bed9c6fcb706effbf83ddc97518b6f0c
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 18:48:46 2008 +1030

    dix: remove inputInfo.pointer reference in TryClientEvents.
    
    Unfortunately, this requires a change in the TCE API, and thus a change in all
    callers. Tough luck.

diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index 9834fcf..e92a248 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -541,8 +541,8 @@ int reason;
 	  event.u.videoNotify.drawable = pDraw->id;
 	  event.u.videoNotify.port = pPort->id;
 	  event.u.videoNotify.reason = reason;
-	  (void) TryClientEvents(pn->client, (xEventPtr)&event, 1, NoEventMask,
-				 NoEventMask, NullGrab);
+	  TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
+                          NoEventMask, NoEventMask, NullGrab);
 	}
       pn = pn->next;
     }
@@ -573,8 +573,8 @@ XvdiSendPortNotify(
 	  event.u.portNotify.port = pPort->id;
 	  event.u.portNotify.attribute = attribute;
 	  event.u.portNotify.value = value;
-	  (void) TryClientEvents(pn->client, (xEventPtr)&event, 1, NoEventMask,
-				 NoEventMask, NullGrab);
+	  TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
+                          NoEventMask, NoEventMask, NullGrab);
 	}
       pn = pn->next;
     }
diff --git a/dix/dispatch.c b/dix/dispatch.c
index b3816a5..a555aa1 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -1023,7 +1023,8 @@ ProcSetSelectionOwner(ClientPtr client)
 		event.u.selectionClear.time = time.milliseconds;
 		event.u.selectionClear.window = CurrentSelections[i].window;
 		event.u.selectionClear.atom = CurrentSelections[i].selection;
-		(void) TryClientEvents (CurrentSelections[i].client, &event, 1,
+		TryClientEvents (CurrentSelections[i].client, NULL,
+                                &event, 1,
 				NoEventMask, NoEventMask /* CantBeFiltered */,
 				NullGrab);
 	    }
@@ -1158,7 +1159,7 @@ ProcConvertSelection(ClientPtr client)
 	    event.u.selectionRequest.target = stuff->target;
 	    event.u.selectionRequest.property = stuff->property;
 	    if (TryClientEvents(
-		CurrentSelections[i].client, &event, 1, NoEventMask,
+		CurrentSelections[i].client, NULL, &event, 1, NoEventMask,
 		NoEventMask /* CantBeFiltered */, NullGrab))
 		return (client->noClientException);
 	}
@@ -1168,8 +1169,8 @@ ProcConvertSelection(ClientPtr client)
 	event.u.selectionNotify.selection = stuff->selection;
 	event.u.selectionNotify.target = stuff->target;
 	event.u.selectionNotify.property = None;
-	(void) TryClientEvents(client, &event, 1, NoEventMask,
-			       NoEventMask /* CantBeFiltered */, NullGrab);
+	TryClientEvents(client, NULL, &event, 1, NoEventMask,
+			NoEventMask /* CantBeFiltered */, NullGrab);
 	return (client->noClientException);
     }
     else 
diff --git a/dix/events.c b/dix/events.c
index 59688c7..c91e73b 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1968,6 +1968,7 @@ ReleaseActiveGrabs(ClientPtr client)
  *
  *
  * @param client The target client to deliver to.
+ * @param dev The device the event came from. May be NULL.
  * @param pEvents The events to be delivered.
  * @param count Number of elements in pEvents.
  * @param mask Event mask as set by the window.
@@ -1978,8 +1979,8 @@ ReleaseActiveGrabs(ClientPtr client)
  * client.
  */
 _X_EXPORT int
-TryClientEvents (ClientPtr client, xEvent *pEvents, int count, Mask mask,
-                 Mask filter, GrabPtr grab)
+TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
+                 int count, Mask mask, Mask filter, GrabPtr grab)
 {
     int i;
     int type;
@@ -1998,7 +1999,7 @@ TryClientEvents (ClientPtr client, xEvent *pEvents, int count, Mask mask,
 	{
 	    if (mask & PointerMotionHintMask)
 	    {
-		if (WID(inputInfo.pointer->valuator->motionHintWindow) ==
+		if (WID(dev->valuator->motionHintWindow) ==
 		    pEvents->u.keyButtonPointer.event)
 		{
 #ifdef DEBUG_EVENTS
@@ -2108,8 +2109,9 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 
 	if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
 	    /* do nothing */;
-        else if ( (attempt = TryClientEvents(wClient(pWin), pEvents, count,
-				      pWin->eventMask, filter, grab)) )
+        else if ( (attempt = TryClientEvents(wClient(pWin), pDev, pEvents,
+                                             count, pWin->eventMask,
+                                             filter, grab)) )
 	{
 	    if (attempt > 0)
 	    {
@@ -2146,8 +2148,10 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
                     if (XaceHook(XACE_RECEIVE_ACCESS, pClient->client, pWin,
                                 pEvents, count))
                         /* do nothing */;
-                    else if (TryClientEvents(pClient->client, pEvents, count,
-                            pClient->eventMask[GEEXTIDX(pEvents)], filter, grab) > 0)
+                    else if (TryClientEvents(pClient->client, pDev,
+                             pEvents, count,
+                             pClient->eventMask[GEEXTIDX(pEvents)],
+                             filter, grab) > 0)
                     {
                         deliveries++;
                     } else
@@ -2179,8 +2183,10 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
                 if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin,
                              pEvents, count))
                     /* do nothing */;
-                else if ( (attempt = TryClientEvents(rClient(other), pEvents, count,
-                                other->mask[mskidx], filter, grab)) )
+                else if ( (attempt = TryClientEvents(rClient(other), pDev,
+                                                     pEvents, count,
+                                                     other->mask[mskidx],
+                                                     filter, grab)) )
                 {
                     if (attempt > 0)
                     {
@@ -2308,7 +2314,7 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
 #endif
 	if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
 	    return 1; /* don't send, but pretend we did */
-	return TryClientEvents(wClient(pWin), pEvents, count,
+	return TryClientEvents(wClient(pWin), NULL, pEvents, count,
 			       pWin->eventMask, filter, NullGrab);
     }
     for (other = wOtherClients(pWin); other; other = other->next)
@@ -2325,7 +2331,7 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
 	    if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin, pEvents,
 			 count))
 		return 1; /* don't send, but pretend we did */
-	    return TryClientEvents(rClient(other), pEvents, count,
+	    return TryClientEvents(rClient(other), NULL, pEvents, count,
 				   other->mask, filter, NullGrab);
 	}
     }
@@ -3469,7 +3475,7 @@ CheckPassiveGrabsOnWindow(
 
 	    FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
 
-	    (void) TryClientEvents(rClient(grab), xE, count,
+	    (void) TryClientEvents(rClient(grab), device, xE, count,
 				   filters[device->id][xE->u.u.type],
 				   filters[device->id][xE->u.u.type],  grab);
 
@@ -3704,8 +3710,8 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
 
                 if (GEEventFill(xE))
                     GEEventFill(xE)(ge, thisDev, grab->window, grab);
-                deliveries = TryClientEvents(rClient(grab), xE, count,
-                        gemask->eventMask[GEEXTIDX(ge)],
+                deliveries = TryClientEvents(rClient(grab), thisDev, xE,
+                        count, gemask->eventMask[GEEXTIDX(ge)],
                         generic_filters[GEEXTIDX(ge)][ge->evtype],
                         grab);
             } else
@@ -3728,8 +3734,8 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
                     else if (!IsInterferingGrab(rClient(grab), thisDev,
                                 &core))
                     {
-                        deliveries = TryClientEvents(rClient(grab), &core, 1,
-                                                     mask,
+                        deliveries = TryClientEvents(rClient(grab), thisDev,
+                                                     &core, 1, mask,
                                                      filters[thisDev->id][core.u.u.type],
                                                      grab);
                     }
@@ -3754,7 +3760,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
                     else
                     {
                         deliveries =
-                            TryClientEvents(rClient(grab),
+                            TryClientEvents(rClient(grab), thisDev,
                                            xE, count,
                                            mask,
                                            filters[thisDev->id][xE->u.u.type],
@@ -4452,10 +4458,10 @@ EnterLeaveEvent(
     if ((mask & filters[mouse->id][type]) && sendevent)
     {
         if (grab)
-            (void)TryClientEvents(rClient(grab), &event, 1, mask,
+            TryClientEvents(rClient(grab), mouse, &event, 1, mask,
                                   filters[mouse->id][type], grab);
         else
-            (void)DeliverEventsToWindow(mouse, pWin, &event, 1,
+            DeliverEventsToWindow(mouse, pWin, &event, 1,
                                   filters[mouse->id][type], NullGrab, 0);
     }
 
@@ -4475,7 +4481,8 @@ EnterLeaveEvent(
             inputMasks->deliverableEvents[mskidx]))
     {
         if (devgrab)
-            (void)TryClientEvents(rClient(devgrab), (xEvent*)devEnterLeave, 1,
+            (void)TryClientEvents(rClient(devgrab), mouse,
+                                (xEvent*)devEnterLeave, 1,
                                 mask, filters[mouse->id][devEnterLeave->type],
                                 devgrab);
 	else
@@ -4496,8 +4503,8 @@ EnterLeaveEvent(
 
 	ke.type = KeymapNotify;
 	if (grab)
-	    (void)TryClientEvents(rClient(grab), (xEvent *)&ke, 1, mask,
-				  KeymapStateMask, grab);
+	    (void)TryClientEvents(rClient(grab), keybd, (xEvent *)&ke, 1,
+                                  mask, KeymapStateMask, grab);
 	else
 	    (void)DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
 					KeymapStateMask, NullGrab, 0);
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index dfec4b1..89fdec6 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1105,7 +1105,7 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
     if (pScreenPriv->client)
     {
 	/* If the DGA client has selected input, then deliver based on the usual filter */
-	TryClientEvents (pScreenPriv->client, (xEvent *) de, 1, 
+	TryClientEvents (pScreenPriv->client, keybd, (xEvent *) de, 1,
 			 filters[coreEquiv], pScreenPriv->input, 0);
     }
     else
@@ -1186,7 +1186,7 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
     if (pScreenPriv->client)
     {
 	/* If the DGA client has selected input, then deliver based on the usual filter */
-	TryClientEvents (pScreenPriv->client, (xEvent *) de, 1, 
+	TryClientEvents (pScreenPriv->client, mouse, (xEvent *) de, 1,
 			 filters[coreEquiv], pScreenPriv->input, 0);
     }
     else
diff --git a/include/dix.h b/include/dix.h
index fc862df..079645d 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -502,6 +502,7 @@ extern void WriteEventsToClient(
 
 extern int TryClientEvents(
     ClientPtr /*client*/,
+    DeviceIntPtr /* device */,
     xEventPtr /*pEvents*/,
     int /*count*/,
     Mask /*mask*/,
diff --git a/mi/miexpose.c b/mi/miexpose.c
index 2d3b0d5..ebf73e7 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -385,7 +385,7 @@ miSendGraphicsExpose (client, pRgn, drawable, major, minor)
 	    pe->u.graphicsExposure.majorEvent = major;
 	    pe->u.graphicsExposure.minorEvent = minor;
 	}
-	TryClientEvents(client, pEvent, numRects,
+	TryClientEvents(client, NULL, pEvent, numRects,
 			    (Mask)0, NoEventMask, NullGrab);
 	xfree(pEvent);
     }
@@ -396,7 +396,7 @@ miSendGraphicsExpose (client, pRgn, drawable, major, minor)
 	event.u.noExposure.drawable = drawable;
 	event.u.noExposure.majorEvent = major;
 	event.u.noExposure.minorEvent = minor;
-	TryClientEvents(client, &event, 1,
+	TryClientEvents(client, NULL, &event, 1,
 	    (Mask)0, NoEventMask, NullGrab);
     }
 }
commit 6e17184486c4309ec8b47c7cfd11fef60bb360ac
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Jan 18 17:52:38 2008 +1030

    Xi: Check for DestroyAccess when trying to delete a master device.

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 0b2e3f1..65ff387 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -88,9 +88,6 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
     REQUEST(xChangeDeviceHierarchyReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceHierarchyReq);
 
-    /* XXX: check if client is allowed to change hierarch */
-
-
     any = (xAnyHierarchyChangeInfo*)&stuff[1];
     while(stuff->num_changes--)
     {
@@ -109,10 +106,13 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                     char* name;
                     int ret;
 
+                    /* XXX: check for creation permission */
+
                     SWAPIF(swaps(&c->namelen, n));
                     name = xcalloc(c->namelen + 1, sizeof(char));
                     strncpy(name, (char*)&c[1], c->namelen);
 
+
                     ret = AllocMasterDevice(name, &ptr, &keybd);
                     if (ret != Success)
                     {
@@ -143,7 +143,7 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                         return BadValue;
 
                     rc = dixLookupDevice(&ptr, r->deviceid, client,
-                                         DixWriteAccess);
+                                         DixDestroyAccess);
                     if (rc != Success)
                         return rc;
 
@@ -160,13 +160,26 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
 
                     /* disable keyboards first */
                     if (IsPointerDevice(ptr))
-                        keybd = ptr->spriteInfo->paired;
+                    {
+                        rc = dixLookupDevice(&keybd,
+                                             ptr->spriteInfo->paired->id,
+                                             client,
+                                             DixDestroyAccess);
+                        if (rc != Success)
+                            return rc;
+                    }
                     else
                     {
                         keybd = ptr;
-                        ptr = keybd->spriteInfo->paired;
+                        rc = dixLookupDevice(&ptr,
+                                             keybd->spriteInfo->paired->id,
+                                             client,
+                                             DixDestroyAccess);
+                        if (rc != Success)
+                            return rc;
                     }
 
+
                     /* Disabling sends the devices floating, reattach them if
                      * desired. */
                     if (r->returnMode == AttachToMaster)


More information about the xorg-commit mailing list