dix: Create new sprite for floating devices.

Floating devices get sprites, but still aren't spriteOwners. This prevents
them from getting rendered, and also stops segfaulting.
(not really solving the problems with keyboards though)
This commit is contained in:
Peter Hutterer 2007-10-23 17:28:03 +09:30
parent d9caa469b9
commit 7ef863720d

View File

@ -2205,16 +2205,18 @@ PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
* Client is set to the client that issued the request, or NULL if it comes
* from some internal automatic pairing.
*
* Master may be NULL to set the device floating.
*
* We don't allow multi-layer hierarchies right now. You can't attach a slave
* to another slave.
*/
int
AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
{
if (!dev || !master)
if (!dev || dev->isMaster)
return BadDevice;
if (!master->isMaster) /* can't attach to slave device */
if (master && !master->isMaster) /* can't attach to slaves */
return BadDevice;
if (!pairingClient)
@ -2222,8 +2224,27 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
else if (client && pairingClient != client)
return BadAccess;
/* set from floating to floating? */
if (!dev->u.master && !master)
return Success;
/* free the existing sprite. */
if (!dev->u.master && dev->spriteInfo->sprite)
xfree(dev->spriteInfo->sprite);
dev->u.master = master;
dev->spriteInfo->sprite = master->spriteInfo->sprite;
/* If device is set to floating, we need to create a sprite for it,
* otherwise things go bad. However, we don't want to render the cursor,
* so we reset spriteOwner.
*/
if (!master)
{
/* current root window */
InitializeSprite(dev, dev->spriteInfo->sprite->spriteTrace[0]);
dev->spriteInfo->spriteOwner = FALSE;
} else
dev->spriteInfo->sprite = master->spriteInfo->sprite;
return Success;
}