summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@redhat.com>2008-08-14 17:21:28 +0930
committerDaniel Stone <daniel@fooishbar.org>2009-01-20 15:32:18 +1100
commit58a6b5b9eff25b1b9c6de239d6f5a952a31dfd15 (patch)
tree20143ed82fa973439c75bdd77d2f06a422d72b21
parent23862ede59a9ce11a06ec5151bde460fb836c603 (diff)
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>
-rw-r--r--Xi/exevents.c100
1 files changed, 48 insertions, 52 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 6bf9e5689..81bdf0a1f 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -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
-
- dixSetPrivate(&master->devPrivates, CoreDevicePrivateKey, device);
- sendNotify = TRUE;
- } else if (lastMapNotifyDevice != master)
- sendNotify = TRUE;
+ if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
+ FatalError("Couldn't pivot keymap from device to core!\n");
+ }
- 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;
}
/**