Xi: fix XISetClientPointer return values.

If SetClientPointer fails, the only reason may be that the device is not a
pointer or that the device is an SD. Return BadDevice instead of BadAccess.
(BadAccess is a leftover from the early times of the ClientPointer
implementation when only one client was allowed to set it).

If the window parameter doesn't name a valid window or client, return
BadWindow.

Finally, allow both master keyboards and master pointers as deviceid.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2009-06-11 15:40:56 +10:00
parent ae7dab2a13
commit e6a18762ef

View File

@ -79,29 +79,34 @@ ProcXISetClientPointer(ClientPtr client)
rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
if (rc != Success)
{
client->errorValue = stuff->deviceid;
return rc;
}
if (!IsPointerDevice(pDev) || !IsMaster(pDev))
if (!IsMaster(pDev))
{
client->errorValue = stuff->deviceid;
return BadDevice;
}
pDev = GetMaster(pDev, MASTER_POINTER);
if (stuff->win != None)
{
rc = dixLookupClient(&targetClient, stuff->win, client,
DixWriteAccess);
if (rc != Success)
return rc;
return BadWindow;
} else
targetClient = client;
if (!SetClientPointer(targetClient, client, pDev))
{
client->errorValue = stuff->win;
return BadAccess;
client->errorValue = stuff->deviceid;
return BadDevice;
}
return Success;