summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2008-10-20 09:46:34 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2008-10-21 09:34:28 -0700
commitebb2e1449cfb382a806e04c52d42240670717069 (patch)
tree82f5ccd94ee6ad22b917e686a82f2bee41bc934f
parentf67cd31d2cf1b8ad850bd21dbed5a975d77b4c54 (diff)
XQuartz: Fixed follow-keyboard-layout
≈ (cherry picked from commit a9f9fbf512c9fd5a773fce402182486edc71d5ab)
-rw-r--r--hw/xquartz/quartzKeyboard.c58
1 files changed, 25 insertions, 33 deletions
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index cd46fb2d9..3a70522bb 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -68,8 +68,6 @@
#include "X11/keysym.h"
#include "keysym2ucs.h"
-void QuartzXkbUpdate(DeviceIntPtr pDev);
-
enum {
MOD_COMMAND = 256,
MOD_SHIFT = 512,
@@ -427,16 +425,6 @@ static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) {
pthread_mutex_unlock(&keyInfo_mutex);
}
-void QuartzXkbUpdate(DeviceIntPtr pDev) {
-#ifdef XQUARTZ_USE_XKB
- SendDeviceMappingNotify(serverClient, MappingKeyboard,
- pDev->key->curKeySyms.minKeyCode,
- pDev->key->curKeySyms.maxKeyCode - pDev->key->curKeySyms.minKeyCode, pDev);
- SendDeviceMappingNotify(serverClient, MappingModifier, 0, 0, pDev);
- SwitchCoreKeyboard(pDev);
-#endif
-}
-
/*
* DarwinKeyboardInit
* Get the Darwin keyboard map and compute an equivalent
@@ -466,7 +454,11 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
memcpy(pDev->key->modifierMap, keyInfo.modMap, sizeof(keyInfo.modMap));
pthread_mutex_unlock(&keyInfo_mutex);
- QuartzXkbUpdate(pDev);
+ SendDeviceMappingNotify(serverClient, MappingKeyboard,
+ pDev->key->curKeySyms.minKeyCode,
+ pDev->key->curKeySyms.maxKeyCode - pDev->key->curKeySyms.minKeyCode, pDev);
+ SendDeviceMappingNotify(serverClient, MappingModifier, 0, 0, pDev);
+ SwitchCoreKeyboard(pDev);
#else
pthread_mutex_lock(&keyInfo_mutex);
assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms,
@@ -479,33 +471,33 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, int nevents) {
- if (pDev == NULL) pDev = darwinKeyboard;
+ // Note that pDev is the device that "initiated" the reload event here...
+ // So we change this later on.
DEBUG_LOG("DarwinKeyboardReloadHandler(%p)\n", pDev);
-#ifdef XQUARTZ_USE_XKB
- QuartzXkbUpdate(pDev);
-#else
KeySymsRec keySyms;
DarwinLoadKeyboardMapping(&keySyms);
- if (pDev->key) {
- if (pDev->key->curKeySyms.map) xfree(pDev->key->curKeySyms.map);
- if (pDev->key->modifierKeyMap) xfree(pDev->key->modifierKeyMap);
- xfree(pDev->key);
- }
-
- pthread_mutex_lock(&keyInfo_mutex);
- if (!InitKeyClassDeviceStruct(pDev, &keySyms, keyInfo.modMap)) {
- DEBUG_LOG("InitKeyClassDeviceStruct failed\n");
- pthread_mutex_unlock(&keyInfo_mutex);
- return;
- }
- pthread_mutex_unlock(&keyInfo_mutex);
+ /* From ProcSetModifierMapping */
+ SendMappingNotify(MappingModifier, 0, 0, serverClient);
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ if (pDev->key && pDev->coreEvents)
+ SendDeviceMappingNotify(serverClient, MappingModifier, 0, 0, pDev);
+
+ /* From ProcChangeKeyboardMapping */
+ SendMappingNotify(MappingKeyboard, MIN_KEYCODE, NUM_KEYCODES, serverClient);
- SendMappingNotify(MappingKeyboard, MIN_KEYCODE, NUM_KEYCODES, 0);
- SendMappingNotify(MappingModifier, 0, 0, 0);
-#endif
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
+ if (!SetKeySymsMap(&pDev->key->curKeySyms, &keySyms))
+ ErrorF("Error changing keysyms. SetKeySymsMap failed.");
+
+ SendMappingNotify(MappingKeyboard, MIN_KEYCODE, NUM_KEYCODES, serverClient);
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ if (pDev->key && pDev->coreEvents)
+ SendDeviceMappingNotify(serverClient, MappingKeyboard,
+ MIN_KEYCODE, NUM_KEYCODES, pDev);
}