xserver: Branch 'master'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Thu Apr 17 17:26:01 PDT 2008


 hw/xquartz/quartzKeyboard.c |   57 ++++++++++++++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 15 deletions(-)

New commits:
commit 22bb7608a025a4ec0f442637810b20e2cb0b0820
Author: Ben Byer <bbyer at apple.com>
Date:   Thu Apr 17 17:04:08 2008 -0700

    Added XKB support for Xquartz
    (cherry picked from commit 56dc1215202746590dbe8758411f47e8876e1317)

diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 30eec1d..e8d9968 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
 }
 
 


More information about the xorg-commit mailing list