summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Byer <bbyer@apple.com>2008-04-17 17:04:08 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2008-04-17 17:25:55 -0700
commit22bb7608a025a4ec0f442637810b20e2cb0b0820 (patch)
tree232b119d4fecc5ca72d646bb190eaf7a344f1856
parent652479dba38470273313dc46f17e3bcb1bc5e383 (diff)
Added XKB support for Xquartz
(cherry picked from commit 56dc1215202746590dbe8758411f47e8876e1317)
-rw-r--r--hw/xquartz/quartzKeyboard.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 30eec1d55..e8d99682e 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -41,7 +41,7 @@
// Define this to get a diagnostic output to stderr which is helpful
// in determining how the X server is interpreting the Darwin keymap.
#define DUMP_DARWIN_KEYMAP
-
+#define XQUARTZ_USE_XKB
#define HACK_MISSING 1
#define HACK_KEYPAD 1
@@ -70,12 +70,12 @@
#include <assert.h>
#endif
-
-
-
+#include "xkbsrv.h"
+#include "exevents.h"
#include "X11/keysym.h"
#include "keysym2ucs.h"
+void QuartzXkbUpdate(DeviceIntPtr pDev);
enum {
MOD_COMMAND = 256,
@@ -863,6 +863,15 @@ static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) {
keySyms->maxKeyCode = MAX_KEYCODE;
}
+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
@@ -879,38 +888,56 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
assert( darwinParamConnect = NXOpenEventStatus() );
DarwinLoadKeyboardMapping(&keySyms);
- // DarwinKeyboardReload(pDev);
/* Initialize the seed, so we don't reload the keymap unnecessarily
(and possibly overwrite xinitrc changes) */
QuartzSystemKeymapSeed();
+#ifdef XQUARTZ_USE_XKB
+ XkbComponentNamesRec names;
+ bzero(&names, sizeof(names));
+ XkbSetRulesDflts("base", "pc105", "us", NULL, NULL);
+ assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, keyInfo.modMap,
+ QuartzBell, DarwinChangeKeyboardControl));
+ assert(SetKeySymsMap(&pDev->key->curKeySyms, &keySyms));
+ assert(keyInfo.modMap!=NULL);
+ assert(pDev->key->modifierMap!=NULL);
+ memcpy(pDev->key->modifierMap, keyInfo.modMap, sizeof(keyInfo.modMap));
+
+ QuartzXkbUpdate(pDev);
+#else
+#error FAIL
assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms,
keyInfo.modMap, QuartzBell,
DarwinChangeKeyboardControl ));
SwitchCoreKeyboard(pDev);
+#endif
}
-void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents) {
- KeySymsRec keySyms;
- if (dev == NULL) dev = darwinKeyboard;
+void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, int nevents) {
+ if (pDev == NULL) pDev = darwinKeyboard;
- DEBUG_LOG("DarwinKeyboardReloadHandler(%p)\n", dev);
- DarwinLoadKeyboardMapping(&keySyms);
+ DEBUG_LOG("DarwinKeyboardReloadHandler(%p)\n", pDev);
- if (dev->key) {
- if (dev->key->curKeySyms.map) xfree(dev->key->curKeySyms.map);
- if (dev->key->modifierKeyMap) xfree(dev->key->modifierKeyMap);
- xfree(dev->key);
+#ifdef XQUARTZ_USE_XKB
+ QuartzXkbUpdate(pDev);
+#else
+#error FAIL
+ if (pDev->key) {
+ if (pDev->key->curKeySyms.map) xfree(pDev->key->curKeySyms.map);
+ if (pDev->key->modifierKeyMap) xfree(pDev->key->modifierKeyMap);
+ xfree(pDev->key);
}
- if (!InitKeyClassDeviceStruct(dev, &keySyms, keyInfo.modMap)) {
+ KeySymsRec keySyms;
+ if (!InitKeyClassDeviceStruct(pDev, &keySyms, keyInfo.modMap)) {
DEBUG_LOG("InitKeyClassDeviceStruct failed\n");
return;
}
SendMappingNotify(MappingKeyboard, MIN_KEYCODE, NUM_KEYCODES, 0);
SendMappingNotify(MappingModifier, 0, 0, 0);
+#endif
}