summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-10-23 17:28:03 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-10-23 17:28:03 +0930
commit7ef863720dc79107fc2cd17ce684366c87e001a4 (patch)
tree3c86ba6c080dae8eb3d9bc872af893a04e151715
parentd9caa469b9bb4eb6125b890820853062fc2c4441 (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.c27
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;
}