diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-07-15 23:18:35 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-07-15 23:18:35 -0700 |
commit | 53ae6b63387e04324b23b6f8311cc22a154c1fb8 (patch) | |
tree | 8163a857c862bed5b1f779ff477a9d45dabfb1f9 | |
parent | 6a90c7b93724a2d26eae70b5806ca06c91e7df4c (diff) |
XQuartz: Cleanup keymap locking, fix a possible synchro bug
(cherry picked from commit 33e7437a4984ee7c1b04b87d23dee7d4739d5f12)
-rw-r--r-- | hw/xquartz/quartzKeyboard.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c index 2b8cb13f8..8dfea2797 100644 --- a/hw/xquartz/quartzKeyboard.c +++ b/hw/xquartz/quartzKeyboard.c @@ -277,17 +277,13 @@ static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) { * Load the keyboard map from a file or system and convert * it to an equivalent X keyboard map and modifier map. */ -static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) { - pthread_mutex_lock(&keyInfo_mutex); - +static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) { DarwinBuildModifierMaps(&keyInfo); keySyms->map = keyInfo.keyMap; keySyms->mapWidth = GLYPHS_PER_KEY; keySyms->minKeyCode = MIN_KEYCODE; keySyms->maxKeyCode = MAX_KEYCODE; - - pthread_mutex_unlock(&keyInfo_mutex); } /* @@ -323,12 +319,17 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) { // for a kIOHIDParamConnectType connection. assert(darwinParamConnect = NXOpenEventStatus()); - DarwinLoadKeyboardMapping(&keySyms); - bzero(&names, sizeof(names)); - InitKeyboardDeviceStruct(pDev, NULL, QuartzBell, - DarwinChangeKeyboardControl); + /* We need to really have rules... or something... */ + //XkbSetRulesDflts("base", "pc105", "us", NULL, NULL); + + InitKeyboardDeviceStruct(pDev, NULL, QuartzBell, DarwinChangeKeyboardControl); + + pthread_mutex_lock(&keyInfo_mutex); + DarwinLoadKeyboardMapping(&keySyms); + DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap); + pthread_mutex_unlock(&keyInfo_mutex); /* Get our key repeat settings from GlobalPreferences */ (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences")); @@ -348,8 +349,6 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) { XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn); } - - DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap); } void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, int nevents) { @@ -361,8 +360,11 @@ void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, // xfree(pDev->key); // } + + pthread_mutex_lock(&keyInfo_mutex); DarwinLoadKeyboardMapping(&keySyms); DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap); + pthread_mutex_unlock(&keyInfo_mutex); } //----------------------------------------------------------------------------- @@ -398,21 +400,22 @@ int DarwinModifierNXKeyToNXKeycode(int key, int side) { int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide) { int key, side; - pthread_mutex_lock(&keyInfo_mutex); keycode += MIN_KEYCODE; + // search modifierKeycodes for this keycode+side + pthread_mutex_lock(&keyInfo_mutex); for (key = 0; key < NX_NUMMODIFIERS; key++) { for (side = 0; side <= 1; side++) { if (keyInfo.modifierKeycodes[key][side] == keycode) break; } } + pthread_mutex_unlock(&keyInfo_mutex); + if (key == NX_NUMMODIFIERS) { - pthread_mutex_unlock(&keyInfo_mutex); return -1; } if (outSide) *outSide = side; - pthread_mutex_unlock(&keyInfo_mutex); return key; } |