summaryrefslogtreecommitdiff
path: root/dix/events.c
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2006-08-08 14:54:10 +0300
committerDaniel Stone <daniels@endtroducing.fooishbar.org>2006-08-08 14:54:10 +0300
commitfe351a711ef55c3ae1e784d4551147c080eda109 (patch)
tree1ab858bea0882c727aeee251c9c85006c1088342 /dix/events.c
parent31089816317f27c668b12a15c74fdd226a8df9f7 (diff)
GKVE: send XkbMapNotify, not XkbNewKeyboardNotify
Sending MapNotify is more correct in this case than NKN, so do that.
Diffstat (limited to 'dix/events.c')
-rw-r--r--dix/events.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/dix/events.c b/dix/events.c
index f6524a329..f0b9e165d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4675,6 +4675,10 @@ GetKeyboardEvents(xEvent **xE, DeviceIntPtr pDev, int type, int key_code) {
* the return value is the number of events in xE, which is not
* NULL-terminated.
*
+ * If pDev is set to send core events, then the keymap on the core
+ * keyboard will be pivoted to that of the new keyboard and the appropriate
+ * MapNotify events (both core and XKB) will be sent.
+ *
* Note that this function recurses! If called for non-XKB, a repeating
* key press will trigger a matching KeyRelease, as well as the
* KeyPresses.
@@ -4688,7 +4692,7 @@ int GetKeyboardValuatorEvents(xEvent **xE, DeviceIntPtr pDev, int type,
xEvent *ev = NULL, *repeatEvents = NULL;
KeyClassPtr ckeyc;
#ifdef XKB
- xkbNewKeyboardNotify nkn;
+ xkbMapNotify mn;
#endif
if (type != KeyPress && type != KeyRelease)
@@ -4798,27 +4802,36 @@ int GetKeyboardValuatorEvents(xEvent **xE, DeviceIntPtr pDev, int type,
ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
#ifdef XKB
- if (!noXkbExtension) {
- nkn.oldMinKeyCode = ckeyc->xkbInfo->desc->min_key_code;
- nkn.oldMaxKeyCode = ckeyc->xkbInfo->desc->max_key_code;
- nkn.deviceID = nkn.oldDeviceID = inputInfo.keyboard->id;
- nkn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
- nkn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
- nkn.requestMajor = XkbReqCode;
- nkn.requestMinor = X_kbSetMap; /* XXX bare-faced lie */
- nkn.changed = XkbAllNewKeyboardEventsMask;
- /* Free the map we set up at DEVICE_INIT time, since it's
- * going to just quietly disappear. Shameful hack. */
- if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr
- && ckeyc->xkbInfo)
+ if (!noXkbExtension && pDev->key->xkbInfo &&
+ pDev->key->xkbInfo->desc) {
+ mn.deviceID = inputInfo.keyboard->id;
+ mn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
+ mn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
+ mn.firstType = 0;
+ mn.nTypes = pDev->key->xkbInfo->desc->map->num_types;
+ mn.firstKeySym = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nKeySyms = XkbNumKeys(pDev->key->xkbInfo->desc);
+ mn.firstKeyAct = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nKeyActs = XkbNumKeys(pDev->key->xkbInfo->desc);
+ /* Cargo-culted from ProcXkbGetMap. */
+ mn.firstKeyBehavior = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nKeyBehaviors = XkbNumKeys(pDev->key->xkbInfo->desc);
+ mn.firstKeyExplicit = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nKeyExplicit = XkbNumKeys(pDev->key->xkbInfo->desc);
+ mn.firstModMapKey = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
+ mn.firstVModMapKey = pDev->key->xkbInfo->desc->min_key_code;
+ mn.nVModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
+ mn.virtualMods = ~0; /* ??? */
+ mn.changed = XkbAllMapComponentsMask;
+
+ /* If this is still the map we set at DEVICE_INIT, free it so
+ * it doesn't just get lost. (Shameful hack, sorry.) */
+ if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr &&
+ ckeyc->xkbInfo)
XkbFreeInfo(ckeyc->xkbInfo);
ckeyc->xkbInfo = pDev->key->xkbInfo;
- /* FIXME OH MY GOD SO AWFUL let's hope nobody notices */
- if (nkn.oldMinKeyCode == nkn.minKeyCode)
- nkn.oldMinKeyCode--;
- if (nkn.oldMaxKeyCode == nkn.maxKeyCode)
- nkn.oldMaxKeyCode++;
- XkbSendNewKeyboardNotify(inputInfo.keyboard, &nkn);
+ XkbSendMapNotify(inputInfo.keyboard, &mn);
}
#endif
SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,