summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2010-01-12 13:43:08 -0800
committerJeremy Huddleston <jeremyhu@freedesktop.org>2010-01-13 13:08:25 -0800
commit7c22da2dc49ce50b8306ba50c8cca128031591c4 (patch)
treeea6e7da825ddced854adb8eb6377f28170720805
parent91c463edaeb850b744af44eb9789a445dfacaa70 (diff)
XQuartz: Setup the modifier map in the quartz thread
This avoids possible doing it twice which could result in incorrect keycodes for alt due to our loss of information about its side. Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
-rw-r--r--hw/xquartz/quartzKeyboard.c16
-rw-r--r--hw/xquartz/quartzKeyboard.h1
2 files changed, 16 insertions, 1 deletions
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 29ec89d11..0f0215791 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -194,6 +194,17 @@ static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
int i;
KeySym *k;
+ /* This avoids processing the data a second time which will happen
+ * upon the first keypress (since we need to reload our keymap to
+ * clobber XKB). Doing this a second time will result in an
+ * incorrect keycode for left alt because both are changed to
+ * mode_switch here. This is not a good "final" solution, but it
+ * works around the issue for now.
+ */
+ if(info->modMapInitialized)
+ return;
+ info->modMapInitialized = TRUE;
+
memset(info->modMap, NoSymbol, sizeof(info->modMap));
memset(info->modifierKeycodes, 0, sizeof(info->modifierKeycodes));
@@ -251,6 +262,7 @@ static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
break;
case XK_Mode_switch:
+ ErrorF("DarwinBuildModifierMaps: XK_Mode_switch encountered, unable to determine side.\n");
info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
#ifdef NX_MODIFIERKEY_RALTERNATE
info->modifierKeycodes[NX_MODIFIERKEY_RALTERNATE][0] = i;
@@ -395,7 +407,6 @@ void DarwinKeyboardReloadHandler(void) {
pthread_mutex_lock(&keyInfo_mutex); {
/* Initialize our keySyms */
- DarwinBuildModifierMaps(&keyInfo);
keySyms.map = keyInfo.keyMap;
keySyms.mapWidth = GLYPHS_PER_KEY;
keySyms.minKeyCode = MIN_KEYCODE;
@@ -820,5 +831,8 @@ Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
}
}
+ info->modMapInitialized = FALSE;
+ DarwinBuildModifierMaps(info);
+
return TRUE;
}
diff --git a/hw/xquartz/quartzKeyboard.h b/hw/xquartz/quartzKeyboard.h
index 1aaec6ef2..47885b59b 100644
--- a/hw/xquartz/quartzKeyboard.h
+++ b/hw/xquartz/quartzKeyboard.h
@@ -45,6 +45,7 @@ typedef struct darwinKeyboardInfo_struct {
CARD8 modMap[MAP_LENGTH];
KeySym keyMap[MAP_LENGTH * GLYPHS_PER_KEY];
unsigned char modifierKeycodes[32][2];
+ Bool modMapInitialized;
} darwinKeyboardInfo;
/* These functions need to be implemented by Xquartz, XDarwin, etc. */