summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2008-12-16 14:19:12 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2008-12-18 09:58:42 +1000
commit08a3d6928c87032998b6113d67f69b79b09eecee (patch)
tree0845856fa8b3f50bde55141a32f9c9fac93ff928 /dix
parent689be0cb4b259840208c17f974066a942196793a (diff)
dix: Allocate the space for the DCCE when the last SD is removed.
This still doesn't fix reset the MD's classes (a TODO that's been here for ages), but at least we don't segfault anymore when detaching the last SD. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'dix')
-rw-r--r--dix/devices.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/dix/devices.c b/dix/devices.c
index d1043db27..48b6e7dd4 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2569,21 +2569,28 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
if (!it) /* no dev is paired with old master */
{
/* XXX: reset to defaults */
- EventList event = { NULL, 0};
+ EventListPtr event = NULL;
char* classbuf;
+ int namelen = 0; /* dummy */
+ int len = sizeof(xEvent);
deviceClassesChangedEvent *dcce;
+ event = InitEventList(1);
+ SizeDeviceInfo(oldmaster, &namelen, &len);
+ SetMinimumEventSize(event, 1, len);
+
/* Send event to clients */
- CreateClassesChangedEvent(&event, oldmaster, oldmaster);
- dcce = (deviceClassesChangedEvent*)event.event;
+ CreateClassesChangedEvent(event, oldmaster, oldmaster);
+ dcce = (deviceClassesChangedEvent*)event->event;
dcce->deviceid = oldmaster->id;
dcce->num_classes = 0;
- classbuf = (char*)&event.event[1];
+ dcce->length = (len - sizeof(xEvent))/4;
+ classbuf = (char*)&event->event[1];
CopySwapClasses(NullClient, oldmaster,
&dcce->num_classes, &classbuf);
SendEventToAllWindows(oldmaster, XI_DeviceClassesChangedMask,
- event.event, 1);
- xfree(event.event);
+ event->event, 1);
+ FreeEventList(event, 1);
}
}