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:
parent
23862ede59
commit
58a6b5b9ef
|
@ -203,67 +203,56 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
|
|||
dk = device->key;
|
||||
mk = master->key;
|
||||
|
||||
if (device != dixLookupPrivate(&master->devPrivates,
|
||||
CoreDevicePrivateKey)) {
|
||||
memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
|
||||
memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
|
||||
|
||||
if (dk->maxKeysPerModifier)
|
||||
{
|
||||
mk->modifierKeyMap = xrealloc(mk->modifierKeyMap,
|
||||
8 * dk->maxKeysPerModifier);
|
||||
if (!mk->modifierKeyMap)
|
||||
FatalError("[Xi] no memory for class shift.\n");
|
||||
memcpy(mk->modifierKeyMap, dk->modifierKeyMap,
|
||||
(8 * dk->maxKeysPerModifier));
|
||||
} else
|
||||
{
|
||||
xfree(mk->modifierKeyMap);
|
||||
mk->modifierKeyMap = NULL;
|
||||
}
|
||||
if (dk->maxKeysPerModifier)
|
||||
{
|
||||
mk->modifierKeyMap = xrealloc(mk->modifierKeyMap,
|
||||
8 * dk->maxKeysPerModifier);
|
||||
if (!mk->modifierKeyMap)
|
||||
FatalError("[Xi] no memory for class shift.\n");
|
||||
memcpy(mk->modifierKeyMap, dk->modifierKeyMap,
|
||||
(8 * dk->maxKeysPerModifier));
|
||||
} else
|
||||
{
|
||||
xfree(mk->modifierKeyMap);
|
||||
mk->modifierKeyMap = NULL;
|
||||
}
|
||||
|
||||
mk->maxKeysPerModifier = dk->maxKeysPerModifier;
|
||||
mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
|
||||
mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
|
||||
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
|
||||
mk->maxKeysPerModifier = dk->maxKeysPerModifier;
|
||||
mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
|
||||
mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
|
||||
SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
|
||||
|
||||
/*
|
||||
* Copy state from the extended keyboard to core. If you omit this,
|
||||
* 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
|
||||
* code.
|
||||
*
|
||||
* XXX: If you synthesise core modifier events, the state will get
|
||||
* clobbered here. You'll have to work out something sensible
|
||||
* to fix that. Good luck.
|
||||
*/
|
||||
/*
|
||||
* Copy state from the extended keyboard to core. If you omit this,
|
||||
* 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
|
||||
* code.
|
||||
*
|
||||
* XXX: If you synthesise core modifier events, the state will get
|
||||
* clobbered here. You'll have to work out something sensible
|
||||
* to fix that. Good luck.
|
||||
*/
|
||||
|
||||
#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \
|
||||
Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask)
|
||||
mk->state &= ~(KEYBOARD_MASK);
|
||||
mk->state |= (dk->state & KEYBOARD_MASK);
|
||||
mk->state &= ~(KEYBOARD_MASK);
|
||||
mk->state |= (dk->state & KEYBOARD_MASK);
|
||||
#undef KEYBOARD_MASK
|
||||
for (i = 0; i < 8; i++)
|
||||
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
|
||||
for (i = 0; i < 8; i++)
|
||||
mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
|
||||
|
||||
#ifdef XKB
|
||||
if (!noXkbExtension && dk->xkbInfo && dk->xkbInfo->desc) {
|
||||
if (!mk->xkbInfo || !mk->xkbInfo->desc)
|
||||
{
|
||||
XkbInitDevice(master);
|
||||
XkbFinishDeviceInit(master);
|
||||
}
|
||||
if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
|
||||
FatalError("Couldn't pivot keymap from device to core!\n");
|
||||
if (dk->xkbInfo && dk->xkbInfo->desc) {
|
||||
if (!mk->xkbInfo || !mk->xkbInfo->desc) {
|
||||
XkbInitDevice(master);
|
||||
XkbFinishDeviceInit(master);
|
||||
}
|
||||
#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);
|
||||
sendNotify = TRUE;
|
||||
} else if (lastMapNotifyDevice != master)
|
||||
sendNotify = TRUE;
|
||||
|
||||
if (sendNotify)
|
||||
{
|
||||
if (lastMapNotifyDevice != master) {
|
||||
SendMappingNotify(master, MappingKeyboard,
|
||||
mk->curKeySyms.minKeyCode,
|
||||
(mk->curKeySyms.maxKeyCode -
|
||||
|
@ -271,6 +260,13 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
|
|||
serverClient);
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue