diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-10-23 17:28:03 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-10-23 17:28:03 +0930 |
commit | 7ef863720dc79107fc2cd17ce684366c87e001a4 (patch) | |
tree | 3c86ba6c080dae8eb3d9bc872af893a04e151715 | |
parent | d9caa469b9bb4eb6125b890820853062fc2c4441 (diff) |
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)
-rw-r--r-- | dix/devices.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/dix/devices.c b/dix/devices.c index d97133980..7e7e646ad 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -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; } |