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