dix: don't free MDs classes on init.

The device classes aren't deleted anymore on a class change, so there's no
need to store the MD's original classes. We should however restore the MD to
sane defaults when disconnecting the last device, consider this as TODO item.
This commit is contained in:
Peter Hutterer 2008-04-10 19:25:43 +09:30
parent 04dff74ffd
commit b4380d8030

View File

@ -88,8 +88,6 @@ SOFTWARE.
/* The client that is allowed to change pointer-keyboard pairings. */
static ClientPtr pairingClient = NULL;
DevPrivateKey MasterDevClassesPrivateKey = &MasterDevClassesPrivateKey;
DevPrivateKey CoreDevicePrivateKey = &CoreDevicePrivateKey;
/**
@ -409,7 +407,6 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
XkbComponentNamesRec names;
#endif
ClassesPtr classes;
DeviceIntRec dummy;
switch (what) {
case DEVICE_INIT:
@ -419,8 +416,6 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
return BadAlloc;
}
dixSetPrivate(&pDev->devPrivates, MasterDevClassesPrivateKey, NULL);
keySyms.minKeyCode = 8;
keySyms.maxKeyCode = 255;
keySyms.mapWidth = 4;
@ -459,53 +454,9 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
xfree(keySyms.map);
xfree(modMap);
classes->key = pDev->key;
classes->valuator = pDev->valuator;
classes->button = pDev->button;
classes->focus = pDev->focus;
classes->proximity = pDev->proximity;
classes->absolute = pDev->absolute;
classes->kbdfeed = pDev->kbdfeed;
classes->ptrfeed = pDev->ptrfeed;
classes->intfeed = pDev->intfeed;
classes->stringfeed = pDev->stringfeed;
classes->bell = pDev->bell;
classes->leds = pDev->leds;
/* Each time we switch classes we free the MD's classes and copy the
* SD's classes into the MD. We mustn't lose the first set of classes
* though as we need it to restore them when the last SD disconnects.
*
* So we create a fake device, seem to copy from the fake to the real
* one, thus ending up with a copy of the original ones in our MD.
*
* If we don't do that, we're in SIGABRT territory (double-frees, etc)
*/
memcpy(&dummy, pDev, sizeof(DeviceIntRec));
/* Need to set them to NULL. Otherwise, Xkb does some weird stuff and
* the dev->key->xkbInfo->kbdProc starts calling itself. This can
* probably be fixed in a better way, but I don't know how. (whot) */
pDev->key = NULL;
pDev->valuator = NULL;
pDev->button = NULL;
pDev->focus = NULL;
pDev->proximity = NULL;
pDev->absolute = NULL;
pDev->kbdfeed = NULL;
pDev->ptrfeed = NULL;
pDev->intfeed = NULL;
pDev->stringfeed = NULL;
pDev->bell = NULL;
pDev->leds = NULL;
DeepCopyDeviceClasses(&dummy, pDev);
dixSetPrivate(&pDev->devPrivates, MasterDevClassesPrivateKey,
classes);
break;
case DEVICE_CLOSE:
dixSetPrivate(&pDev->devPrivates, CoreDevicePrivateKey, NULL);
break;
default:
@ -526,16 +477,12 @@ CorePointerProc(DeviceIntPtr pDev, int what)
BYTE map[33];
int i = 0;
ClassesPtr classes;
DeviceIntRec dummy;
switch (what) {
case DEVICE_INIT:
if (!(classes = xcalloc(1, sizeof(ClassesRec))))
return BadAlloc;
dixSetPrivate(&pDev->devPrivates, MasterDevClassesPrivateKey, NULL);
for (i = 1; i <= 32; i++)
map[i] = i;
InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
@ -545,43 +492,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
pDev->lastx = pDev->valuator->axisVal[0];
pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
pDev->lasty = pDev->valuator->axisVal[1];
classes->key = pDev->key;
classes->valuator = pDev->valuator;
classes->button = pDev->button;
classes->focus = pDev->focus;
classes->proximity = pDev->proximity;
classes->absolute = pDev->absolute;
classes->kbdfeed = pDev->kbdfeed;
classes->ptrfeed = pDev->ptrfeed;
classes->intfeed = pDev->intfeed;
classes->stringfeed = pDev->stringfeed;
classes->bell = pDev->bell;
classes->leds = pDev->leds;
/* See comment in CoreKeyboardProc. */
memcpy(&dummy, pDev, sizeof(DeviceIntRec));
/* Need to set them to NULL for the VCK (see CoreKeyboardProc). Not
* sure if also necessary for the VCP, but it doesn't seem to hurt */
pDev->key = NULL;
pDev->valuator = NULL;
pDev->button = NULL;
pDev->focus = NULL;
pDev->proximity = NULL;
pDev->absolute = NULL;
pDev->kbdfeed = NULL;
pDev->ptrfeed = NULL;
pDev->intfeed = NULL;
pDev->stringfeed = NULL;
pDev->bell = NULL;
pDev->leds = NULL;
DeepCopyDeviceClasses(&dummy, pDev);
dixSetPrivate(&pDev->devPrivates, MasterDevClassesPrivateKey, classes);
break;
case DEVICE_CLOSE:
dixSetPrivate(&pDev->devPrivates, CoreDevicePrivateKey, NULL);
break;
default:
@ -857,13 +770,6 @@ CloseDevice(DeviceIntPtr dev)
xfree(dev->name);
if (dev->isMaster)
{
classes = (ClassesPtr)dixLookupPrivate(&dev->devPrivates,
MasterDevClassesPrivateKey);
FreeAllDeviceClasses(classes);
}
classes = (ClassesPtr)&dev->key;
FreeAllDeviceClasses(classes);
@ -2543,16 +2449,9 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
if (!it) /* no dev is paired with old master */
{
ClassesPtr classes;
/* XXX: reset to defaults */
EventList event = { NULL, 0};
char* classbuf;
DeviceIntRec dummy;
FreeAllDeviceClasses((ClassesPtr)&oldmaster->key);
classes = (ClassesPtr)dixLookupPrivate(&oldmaster->devPrivates,
MasterDevClassesPrivateKey);
memcpy(&dummy.key, classes, sizeof(ClassesRec));
DeepCopyDeviceClasses(&dummy, oldmaster);
/* Send event to clients */
CreateClassesChangedEvent(&event, oldmaster, oldmaster);