xserver: Branch 'master' - 15 commits

Peter Hutterer whot at kemper.freedesktop.org
Sun Mar 15 20:38:54 PDT 2009


 Xi/exevents.c                  |    2 --
 dix/devices.c                  |   39 ++++++++++++++++++++++-----------------
 dix/events.c                   |   29 ++++++++++++++++++-----------
 hw/xfree86/common/xf86Cursor.c |    2 --
 mi/misprite.c                  |   12 ++++++------
 render/animcur.c               |    2 +-
 xfixes/cursor.c                |   10 +++++-----
 xkb/xkb.c                      |   13 ++++---------
 xkb/xkbActions.c               |    6 +++---
 xkb/xkbEvents.c                |    9 ++++-----
 10 files changed, 63 insertions(+), 61 deletions(-)

New commits:
commit be6dc9023b5fb3995a9ce56d607627e247918aef
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:29:36 2009 +1000

    xfree86: remove a superfluous assignment.
    
    If dev is NULL, we don't have a VCP and that means we have other issues
    anyway.

diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 29b690a..6740faf 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -227,8 +227,6 @@ xf86SwitchMode(ScreenPtr pScreen, DisplayModePtr mode)
       if (IsPointerDevice(dev) && dev->spriteInfo->spriteOwner)
           break;
   }
-  if (!dev)
-      dev = inputInfo.pointer;
 
   pCursorScreen = miPointerGetScreen(dev);
   if (pScreen == pCursorScreen)
commit bfab422dcdbb9c009b2a91fe0dba288fac9bc859
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:27:49 2009 +1000

    xfixes: useless (void) typecast removal
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 3f26988..99403e5 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -404,7 +404,7 @@ ProcXFixesGetCursorImage (ClientPtr client)
 	swapl (&rep->cursorSerial, n);
 	SwapLongs (image, npixels);
     }
-    (void) WriteToClient(client, sizeof (xXFixesGetCursorImageReply) +
+    WriteToClient(client, sizeof (xXFixesGetCursorImageReply) +
 			 (npixels << 2), (char *) rep);
     xfree (rep);
     return client->noClientException;
@@ -482,7 +482,7 @@ ProcXFixesGetCursorName (ClientPtr client)
 	swaps (&reply.nbytes, n);
     }
     WriteReplyToClient(client, sizeof(xXFixesGetCursorNameReply), &reply);
-    (void)WriteToClient(client, len, str);
+    WriteToClient(client, len, str);
     
     return(client->noClientException);
 }
@@ -564,7 +564,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client)
 	swaps (&rep->nbytes, n);
 	SwapLongs (image, npixels);
     }
-    (void) WriteToClient(client, sizeof (xXFixesGetCursorImageAndNameReply) +
+    WriteToClient(client, sizeof (xXFixesGetCursorImageAndNameReply) +
 			 (npixels << 2) + nbytesRound, (char *) rep);
     xfree (rep);
     return client->noClientException;
@@ -893,7 +893,7 @@ ProcXFixesHideCursor (ClientPtr client)
     ret = createCursorHideCount(client, pWin->drawable.pScreen);
 
     if (ret == Success) {
-        (void) CursorDisplayCursor(PickPointer(client), pWin->drawable.pScreen, CursorCurrent);
+        CursorDisplayCursor(PickPointer(client), pWin->drawable.pScreen, CursorCurrent);
     }
 
     return ret;
@@ -987,7 +987,7 @@ CursorFreeHideCount (pointer data, XID id)
     ScreenPtr pScreen = pChc->pScreen;
 
     deleteCursorHideCount(pChc, pChc->pScreen);
-    (void) CursorDisplayCursor(inputInfo.pointer, pScreen, CursorCurrent);
+    CursorDisplayCursor(inputInfo.pointer, pScreen, CursorCurrent);
 
     return 1;
 }
commit 4eeaee1e5a05ea973cbeb653abf99f2a352edc70
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:25:12 2009 +1000

    xkb: xkbi has a pointer to the device - use this instead of inputInfo.pointer.

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index f3fcef0..fe58a18 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -812,7 +812,7 @@ ProcessInputProc backupproc;
     if ((filter->keycode!=0)&&(filter->keycode!=keycode))
 	return 1;
 
-    GetSpritePosition(inputInfo.pointer, &x,&y);
+    GetSpritePosition(xkbi->device, &x,&y);
     ev.header = ET_Internal;
     ev.length = sizeof(DeviceEvent);
     ev.time = GetTimeInMillis();
commit 3f801ba62ac493d4aeb664a5ae638e3fb0c9a262
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:23:50 2009 +1000

    xkb: the VCP can post device events, don't stop xkb filtering on it.

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 7d17ad4..f3fcef0 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -964,7 +964,7 @@ int		button;
     if (filter->keycode==0) {		/* initial press */
 	_XkbLookupButtonDevice(&dev, pAction->devbtn.device, serverClient,
 			       DixUnknownAccess, &button);
-	if (!dev || !dev->public.on || dev == inputInfo.pointer)
+	if (!dev || !dev->public.on)
 	    return 1;
 
 	button= pAction->devbtn.button;
@@ -1005,7 +1005,7 @@ int		button;
 	filter->active= 0;
 	_XkbLookupButtonDevice(&dev, filter->upAction.devbtn.device,
 			       serverClient, DixUnknownAccess, &button);
-	if (!dev || !dev->public.on || dev == inputInfo.pointer)
+	if (!dev || !dev->public.on)
 	    return 1;
 
 	button= filter->upAction.btn.button;
commit 23686e5680d565c36e0b6320ce62c38c7830d06b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:20:56 2009 +1000

    xkb: Fix a mis-use of inputInfo.keyboard.

diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index a2b99a2..9293c60 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -918,15 +918,14 @@ Bool
 XkbFilterEvents(ClientPtr pClient,int nEvents,xEvent *xE)
 {
 int	i, button_mask;
-DeviceIntPtr pXDev = inputInfo.keyboard;
+DeviceIntPtr pXDev = NULL;
 XkbSrvInfoPtr	xkbi;
 
     if (xE->u.u.type & EXTENSION_EVENT_BASE)
-    {
         pXDev = XIGetDevice(xE);
-        if (!pXDev)
-            pXDev = inputInfo.keyboard;
-    }
+
+    if (!pXDev)
+        pXDev = PickKeyboard(pClient);
 
     xkbi= (pXDev->key) ? pXDev->key->xkbInfo : NULL;
 
commit c97c6c3de337f247406eaffd5845a847630ee6c1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:17:20 2009 +1000

    xkb: fix a couple of device checks when looping through all devices.
    
    Generally, we want to apply stuff to the device and to all attached slave
    devices.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 7e756d1..ba1a4f6 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -604,8 +604,7 @@ ProcXkbLatchLockState(ClientPtr client)
     status = Success;
 
     for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-        if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
-            tmpd == dev) {
+        if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
             if (!tmpd->key->xkbInfo)
                 continue;
 
@@ -744,10 +743,8 @@ ProcXkbSetControls(ClientPtr client)
     CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
     CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask);
 
-    for (tmpd = inputInfo.keyboard; tmpd; tmpd = tmpd->next) {
-        if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
-            tmpd == dev) {
-
+    for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+        if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
             xkbi = tmpd->key->xkbInfo;
             ctrl = xkbi->desc->ctrls;
             new = *ctrl;
@@ -5834,9 +5831,7 @@ ProcXkbGetKbdByName(ClientPtr client)
 	xkb->ctrls->num_groups= nTG;
 
         for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-            if (tmpd == dev ||
-                (dev->id == inputInfo.keyboard->id && tmpd->key &&
-                 tmpd->coreEvents)) {
+            if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
                 if (tmpd != dev)
                     XkbCopyDeviceKeymap(tmpd, dev);
 
commit d21a546e9604ce2d3c914900f6e6ff2df9f5ca8b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 16:02:22 2009 +1000

    Xi: VCP and VCK may register for ext. events, so delete them if necessary.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 90005f4..670d509 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1717,8 +1717,6 @@ DeleteWindowFromAnyExtEvents(WindowPtr pWin, Bool freeResources)
     struct _OtherInputMasks *inputMasks;
 
     for (dev = inputInfo.devices; dev; dev = dev->next) {
-	if (dev == inputInfo.pointer || dev == inputInfo.keyboard)
-	    continue;
 	DeleteDeviceFromAnyExtEvents(pWin, dev);
     }
 
commit 6ec49098f7ef259b43870139511006627b308bb6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:57:27 2009 +1000

    render: replace a wrong inputInfo.pointer with pDev
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/render/animcur.c b/render/animcur.c
index d80094d..e7bc4e5 100644
--- a/render/animcur.c
+++ b/render/animcur.c
@@ -157,7 +157,7 @@ AnimCurCursorLimits (DeviceIntPtr pDev,
     }
     else
     {
-        (*pScreen->CursorLimits) (inputInfo.pointer, pScreen, pCursor,
+        (*pScreen->CursorLimits) (pDev, pScreen, pCursor,
                                   pHotBox, pTopLeftBox); 
     }
     Wrap (as, pScreen, CursorLimits, AnimCurCursorLimits);
commit 0b2b330f6fbf8633ae682a17fbd95f6b5db2c112
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:54:27 2009 +1000

    mi: remove a bunch of useless inputInfo.pointer assignments.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/misprite.c b/mi/misprite.c
index f4b281a..1cf643a 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -327,7 +327,7 @@ miSpriteGetImage (DrawablePtr pDrawable, int sx, int sy, int w, int h,
 {
     ScreenPtr	    pScreen = pDrawable->pScreen;
     miSpriteScreenPtr    pScreenPriv;
-    DeviceIntPtr    pDev = inputInfo.pointer;
+    DeviceIntPtr    pDev;
     miCursorInfoPtr pCursorInfo;
 
     SCREEN_PROLOGUE (pScreen, GetImage);
@@ -363,7 +363,7 @@ miSpriteGetSpans (DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
 {
     ScreenPtr		    pScreen = pDrawable->pScreen;
     miSpriteScreenPtr	    pScreenPriv;
-    DeviceIntPtr            pDev = inputInfo.pointer;
+    DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
     SCREEN_PROLOGUE (pScreen, GetSpans);
@@ -417,7 +417,7 @@ miSpriteSourceValidate (DrawablePtr pDrawable, int x, int y, int width,
 {
     ScreenPtr		    pScreen = pDrawable->pScreen;
     miSpriteScreenPtr	    pScreenPriv;
-    DeviceIntPtr            pDev = inputInfo.pointer;
+    DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
     SCREEN_PROLOGUE (pScreen, SourceValidate);
@@ -452,7 +452,7 @@ miSpriteCopyWindow (WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 {
     ScreenPtr	pScreen = pWindow->drawable.pScreen;
     miSpriteScreenPtr	    pScreenPriv;
-    DeviceIntPtr            pDev = inputInfo.pointer;
+    DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
     SCREEN_PROLOGUE (pScreen, CopyWindow);
@@ -487,7 +487,7 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
 {
     ScreenPtr		pScreen = screenInfo.screens[i];
     miSpriteScreenPtr	pPriv;
-    DeviceIntPtr            pDev = inputInfo.pointer;
+    DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
     pPriv = (miSpriteScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
@@ -570,7 +570,7 @@ miSpriteStoreColors (ColormapPtr pMap, int ndef, xColorItem *pdef)
     int			i;
     int			updated;
     VisualPtr		pVisual;
-    DeviceIntPtr        pDev = inputInfo.pointer;
+    DeviceIntPtr        pDev;
     miCursorInfoPtr     pCursorInfo;
 
     pPriv = (miSpriteScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
commit 31301861c1dd87a2f55c5c4300ac7c8f54154bf8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:49:22 2009 +1000

    dix: remove wrong InputInfo.pointer usage - should be pDev instead.

diff --git a/dix/events.c b/dix/events.c
index 11a8fa5..12a3122 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5233,7 +5233,7 @@ CheckCursorConfinement(WindowPtr pWin)
             if (grab && (confineTo = grab->confineTo))
             {
                 if (!BorderSizeNotEmpty(pDev, confineTo))
-                    (*inputInfo.pointer->deviceGrab.DeactivateGrab)(pDev);
+                    (*pDev->deviceGrab.DeactivateGrab)(pDev);
                 else if ((pWin == confineTo) || IsParent(pWin, confineTo))
                     ConfineCursorToWindow(pDev, confineTo, TRUE, TRUE);
             }
commit 639658b2eab480a5bfb943dff51e4bdfc1e16e3b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:34:29 2009 +1000

    dix: use GetPairedDevice in ProcQueryPointer rather than inputInfo.keyboard.

diff --git a/dix/events.c b/dix/events.c
index 8b30706..11a8fa5 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4626,6 +4626,7 @@ ProcQueryPointer(ClientPtr client)
     xQueryPointerReply rep;
     WindowPtr pWin, t;
     DeviceIntPtr mouse = PickPointer(client);
+    DeviceIntPtr keyboard;
     SpritePtr pSprite;
     int rc;
     REQUEST(xResourceReq);
@@ -4638,6 +4639,8 @@ ProcQueryPointer(ClientPtr client)
     if (rc != Success)
 	return rc;
 
+    keyboard = GetPairedDevice(mouse);
+
     pSprite = mouse->spriteInfo->sprite;
     if (mouse->valuator->motionHintWindow)
 	MaybeStopHint(mouse, client);
@@ -4645,7 +4648,7 @@ ProcQueryPointer(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.mask = mouse->button->state;
-    rep.mask |= XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
+    rep.mask |= XkbStateFieldFromRec(&keyboard->key->xkbInfo->state);
     rep.length = 0;
     rep.root = (RootWindow(mouse))->drawable.id;
     rep.rootX = pSprite->hot.x;
commit f01ee198ff0cbd7ca418217a84248d1c6131a0c6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:22:23 2009 +1000

    dix: don't use inputInfo.keyboard to get the focus window in ActivateKbdGrab
    
    I'm not sure if that's the right solution, but the other one is wronger.

diff --git a/dix/events.c b/dix/events.c
index 14f5a99..8b30706 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1517,7 +1517,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
     else
 	oldWin = keybd->spriteInfo->sprite->win;
     if (oldWin == FollowKeyboardWin)
-	oldWin = inputInfo.keyboard->focus->win;
+	oldWin = keybd->focus->win;
     if (keybd->valuator)
 	keybd->valuator->motionHintWindow = NullWindow;
     DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
commit de415743f4c1878df2de79f84f5fe087a88d5241
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:19:23 2009 +1000

    dix: fix XACE checks in ProcWarpPointer

diff --git a/dix/events.c b/dix/events.c
index d8d8ec5..14f5a99 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3044,22 +3044,22 @@ ProcWarpPointer(ClientPtr client)
     WindowPtr	dest = NULL;
     int		x, y, rc;
     ScreenPtr	newScreen;
-    DeviceIntPtr dev;
+    DeviceIntPtr dev, tmp;
     SpritePtr   pSprite;
 
     REQUEST(xWarpPointerReq);
     REQUEST_SIZE_MATCH(xWarpPointerReq);
 
-    /* XXX XACE ??*/
-    for (dev = inputInfo.devices; dev; dev = dev->next) {
-        if ((dev->coreEvents || dev == inputInfo.pointer) && dev->button) {
+    dev = PickPointer(client);
+
+    for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+        if ((tmp == dev) || (!tmp->isMaster && tmp->u.master == dev)) {
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
 	    if (rc != Success)
 		return rc;
 	}
     }
 
-    dev = PickPointer(client);
     if (dev->u.lastSlave)
         dev = dev->u.lastSlave;
     pSprite = dev->spriteInfo->sprite;
commit 18430616cfd5d0bc5a3efe61fcc2982b1726b0de
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 14:59:18 2009 +1000

    dix: use PickPointer() and PickKeyboard instead of inputInfo.pointer/keyboard.
    
    Affected calls:
     ProcChangeKeyboardControl
     ProcBell
     ProcUngrabKey
     ProcUngrabButton

diff --git a/dix/devices.c b/dix/devices.c
index 4406fcd..a79d04e 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1824,13 +1824,16 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
 #undef DO_ALL
 }
 
+/**
+ * Changes kbd control on the ClientPointer and all attached SDs.
+ */
 int
 ProcChangeKeyboardControl (ClientPtr client)
 {
     XID *vlist;
     BITS32 vmask;
     int ret = Success, error = Success;
-    DeviceIntPtr pDev = NULL;
+    DeviceIntPtr pDev = NULL, keyboard;
     REQUEST(xChangeKeyboardControlReq);
 
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
@@ -1841,8 +1844,10 @@ ProcChangeKeyboardControl (ClientPtr client)
     if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
 	return BadLength;
 
+    keyboard = PickKeyboard(client);
+
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
+        if ((pDev == keyboard || (!pDev->isMaster && pDev->u.master == keyboard)) &&
             pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
             ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
 	    if (ret != Success)
@@ -1851,7 +1856,7 @@ ProcChangeKeyboardControl (ClientPtr client)
     }
 
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
+        if ((pDev == keyboard || (!pDev->isMaster && pDev->u.master == keyboard)) &&
             pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
             ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
             if (ret != Success)
@@ -1893,7 +1898,7 @@ ProcGetKeyboardControl (ClientPtr client)
 int
 ProcBell(ClientPtr client)
 {
-    DeviceIntPtr keybd = PickKeyboard(client);
+    DeviceIntPtr dev, keybd = PickKeyboard(client);
     int base = keybd->kbdfeed->ctrl.bell;
     int newpercent;
     int rc;
@@ -1920,14 +1925,14 @@ ProcBell(ClientPtr client)
 	newpercent = base - newpercent + stuff->percent;
 
     for (keybd = inputInfo.devices; keybd; keybd = keybd->next) {
-        if ((keybd->coreEvents || keybd == inputInfo.keyboard) &&
+        if ((dev == keybd || (!dev->isMaster && dev->u.master == keybd)) &&
             keybd->kbdfeed && keybd->kbdfeed->BellProc) {
 
-	    rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixBellAccess);
+	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
 	    if (rc != Success)
 		return rc;
             XkbHandleBell(FALSE, FALSE, keybd, newpercent,
-                          &keybd->kbdfeed->ctrl, 0, None, NULL, client);
+                          &dev->kbdfeed->ctrl, 0, None, NULL, client);
         }
     }
 
diff --git a/dix/events.c b/dix/events.c
index 68826c2..d8d8ec5 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4880,7 +4880,7 @@ ProcUngrabKey(ClientPtr client)
     tempGrab.window = pWin;
     tempGrab.modifiersDetail.exact = stuff->modifiers;
     tempGrab.modifiersDetail.pMask = NULL;
-    tempGrab.modifierDevice = inputInfo.keyboard;
+    tempGrab.modifierDevice = GetPairedDevice(keybd);
     tempGrab.type = KeyPress;
     tempGrab.detail.exact = stuff->key;
     tempGrab.detail.pMask = NULL;
@@ -5055,6 +5055,7 @@ ProcUngrabButton(ClientPtr client)
     WindowPtr pWin;
     GrabRec tempGrab;
     int rc;
+    DeviceIntPtr ptr;
 
     REQUEST_SIZE_MATCH(xUngrabButtonReq);
     if ((stuff->modifiers != AnyModifier) &&
@@ -5066,12 +5067,15 @@ ProcUngrabButton(ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixReadAccess);
     if (rc != Success)
 	return rc;
+
+    ptr = PickPointer(client);
+
     tempGrab.resource = client->clientAsMask;
-    tempGrab.device = PickPointer(client);
+    tempGrab.device = ptr;
     tempGrab.window = pWin;
     tempGrab.modifiersDetail.exact = stuff->modifiers;
     tempGrab.modifiersDetail.pMask = NULL;
-    tempGrab.modifierDevice = inputInfo.keyboard;
+    tempGrab.modifierDevice = GetPairedDevice(ptr);
     tempGrab.type = ButtonPress;
     tempGrab.detail.exact = stuff->button;
     tempGrab.detail.pMask = NULL;
commit e31727158cda7729283233cfdc9bc5bcb59a52c1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 14:51:55 2009 +1000

    dix: fix ProcChangePointerControl's wrong inputInfo.pointer usage.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index f89e8e7..4406fcd 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1937,7 +1937,7 @@ ProcBell(ClientPtr client)
 int
 ProcChangePointerControl(ClientPtr client)
 {
-    DeviceIntPtr mouse = PickPointer(client);
+    DeviceIntPtr dev, mouse = PickPointer(client);
     PtrCtrl ctrl;		/* might get BadValue part way through */
     int rc;
     REQUEST(xChangePointerControlReq);
@@ -1991,20 +1991,20 @@ ProcChangePointerControl(ClientPtr client)
         }
     }
 
-    for (mouse = inputInfo.devices; mouse; mouse = mouse->next) {
-        if ((mouse->coreEvents || mouse == inputInfo.pointer) &&
-            mouse->ptrfeed && mouse->ptrfeed->CtrlProc) {
-	    rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixManageAccess);
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
+        if ((dev == mouse || (!dev->isMaster && dev->u.master == mouse)) &&
+            dev->ptrfeed && dev->ptrfeed->CtrlProc) {
+	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
 	    if (rc != Success)
 		return rc;
 	}
     }
 
-    for (mouse = inputInfo.devices; mouse; mouse = mouse->next) {
-        if ((mouse->coreEvents || mouse == PickPointer(client)) &&
-            mouse->ptrfeed && mouse->ptrfeed->CtrlProc) {
-            mouse->ptrfeed->ctrl = ctrl;
-            (*mouse->ptrfeed->CtrlProc)(mouse, &mouse->ptrfeed->ctrl);
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
+        if ((dev == mouse || (!dev->isMaster && dev->u.master == mouse)) &&
+            dev->ptrfeed && dev->ptrfeed->CtrlProc) {
+            dev->ptrfeed->ctrl = ctrl;
+            (*dev->ptrfeed->CtrlProc)(dev, &mouse->ptrfeed->ctrl);
         }
     }
 


More information about the xorg-commit mailing list