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:
parent
ae7dab2a13
commit
e6a18762ef
13
Xi/setcptr.c
13
Xi/setcptr.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user