Xi: don't care about CoreDevicePrivateKey when copying keys

If we get here, we must copy.

Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Peter Hutterer 2008-08-14 17:21:28 +09:30 committed by Daniel Stone
parent 23862ede59
commit 58a6b5b9ef

View File

@ -203,67 +203,56 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
dk = device->key; dk = device->key;
mk = master->key; mk = master->key;
if (device != dixLookupPrivate(&master->devPrivates, memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
CoreDevicePrivateKey)) {
memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
if (dk->maxKeysPerModifier) if (dk->maxKeysPerModifier)
{ {
mk->modifierKeyMap = xrealloc(mk->modifierKeyMap, mk->modifierKeyMap = xrealloc(mk->modifierKeyMap,
8 * dk->maxKeysPerModifier); 8 * dk->maxKeysPerModifier);
if (!mk->modifierKeyMap) if (!mk->modifierKeyMap)
FatalError("[Xi] no memory for class shift.\n"); FatalError("[Xi] no memory for class shift.\n");
memcpy(mk->modifierKeyMap, dk->modifierKeyMap, memcpy(mk->modifierKeyMap, dk->modifierKeyMap,
(8 * dk->maxKeysPerModifier)); (8 * dk->maxKeysPerModifier));
} else } else
{ {
xfree(mk->modifierKeyMap); xfree(mk->modifierKeyMap);
mk->modifierKeyMap = NULL; mk->modifierKeyMap = NULL;
} }
mk->maxKeysPerModifier = dk->maxKeysPerModifier; mk->maxKeysPerModifier = dk->maxKeysPerModifier;
mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode; mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode; mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms); SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
/* /*
* Copy state from the extended keyboard to core. If you omit this, * Copy state from the extended keyboard to core. If you omit this,
* holding Ctrl on keyboard one, and pressing Q on keyboard two, will * holding Ctrl on keyboard one, and pressing Q on keyboard two, will
* cause your app to quit. This feels wrong to me, hence the below * cause your app to quit. This feels wrong to me, hence the below
* code. * code.
* *
* XXX: If you synthesise core modifier events, the state will get * XXX: If you synthesise core modifier events, the state will get
* clobbered here. You'll have to work out something sensible * clobbered here. You'll have to work out something sensible
* to fix that. Good luck. * to fix that. Good luck.
*/ */
#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \ #define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \
Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask)
mk->state &= ~(KEYBOARD_MASK); mk->state &= ~(KEYBOARD_MASK);
mk->state |= (dk->state & KEYBOARD_MASK); mk->state |= (dk->state & KEYBOARD_MASK);
#undef KEYBOARD_MASK #undef KEYBOARD_MASK
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
mk->modifierKeyCount[i] = dk->modifierKeyCount[i]; mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
#ifdef XKB if (dk->xkbInfo && dk->xkbInfo->desc) {
if (!noXkbExtension && dk->xkbInfo && dk->xkbInfo->desc) { if (!mk->xkbInfo || !mk->xkbInfo->desc) {
if (!mk->xkbInfo || !mk->xkbInfo->desc) XkbInitDevice(master);
{ XkbFinishDeviceInit(master);
XkbInitDevice(master);
XkbFinishDeviceInit(master);
}
if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
FatalError("Couldn't pivot keymap from device to core!\n");
} }
#endif if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
FatalError("Couldn't pivot keymap from device to core!\n");
}
dixSetPrivate(&master->devPrivates, CoreDevicePrivateKey, device); if (lastMapNotifyDevice != master) {
sendNotify = TRUE;
} else if (lastMapNotifyDevice != master)
sendNotify = TRUE;
if (sendNotify)
{
SendMappingNotify(master, MappingKeyboard, SendMappingNotify(master, MappingKeyboard,
mk->curKeySyms.minKeyCode, mk->curKeySyms.minKeyCode,
(mk->curKeySyms.maxKeyCode - (mk->curKeySyms.maxKeyCode -
@ -271,6 +260,13 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
serverClient); serverClient);
lastMapNotifyDevice = master; lastMapNotifyDevice = master;
} }
/* Copy the state here. This means we'll only have consistency
* between state and active keymap, rather than between state and
* keycodes pressed, but there's pretty much no way to win here,
* so might as well go for the one that would seem to give the
* least nonsensical result. */
mk->xkbInfo->state = dk->xkbInfo->state;
} }
/** /**