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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue