xserver: Branch 'xorg-server-1.2-apple' - 2 commits
Jeremy Huddleston
jeremyhu at kemper.freedesktop.org
Sat Nov 24 02:49:06 PST 2007
hw/darwin/darwin.c | 6
hw/darwin/darwin.h | 1
hw/darwin/darwinKeyboard.c | 247 ++++++++++++++++++++++++--------------
hw/darwin/darwinKeyboard.h | 18 ++
hw/darwin/quartz/X11Application.m | 3
render/glyphstr.h | 1
6 files changed, 179 insertions(+), 97 deletions(-)
New commits:
commit b4097930b3e1c71a63ba4502152df6595e580b0b
Author: Jeremy Huddleston <jeremy at yuffie.local>
Date: Sat Nov 24 02:46:56 2007 -0800
Render: Add Xdefs.h include to compile with newer renderproto
diff --git a/render/glyphstr.h b/render/glyphstr.h
index 64cedfa..e8f83e7 100644
--- a/render/glyphstr.h
+++ b/render/glyphstr.h
@@ -25,6 +25,7 @@
#ifndef _GLYPHSTR_H_
#define _GLYPHSTR_H_
+#include <X11/Xdefs.h>
#include <X11/extensions/renderproto.h>
#include "picture.h"
#include "screenint.h"
commit 61b6dad5ef0f75051ed67691b041648ec7dcaff7
Author: Jeremy Huddleston <jeremy at yuffie.local>
Date: Sat Nov 24 02:46:22 2007 -0800
Darwin: Initial support for keyboard modifier remapping.
diff --git a/hw/darwin/darwin.c b/hw/darwin/darwin.c
index 3eca65f..ae7ef75 100644
--- a/hw/darwin/darwin.c
+++ b/hw/darwin/darwin.c
@@ -100,7 +100,6 @@ int darwinDesiredDepth = -1;
int darwinDesiredRefresh = -1;
char *darwinKeymapFile = "USA.keymapping";
int darwinSyncKeymap = FALSE;
-int darwinSwapAltMeta = FALSE;
// modifier masks for faking mouse buttons
int darwinFakeMouse2Mask = NX_ALTERNATEMASK;
@@ -767,11 +766,6 @@ int ddxProcessArgument( int argc, char *argv[], int i )
return 2;
}
- if ( !strcmp( argv[i], "-swapAltMeta" ) ) {
- darwinSwapAltMeta = 1;
- return 1;
- }
-
if ( !strcmp( argv[i], "-keymap" ) ) {
if ( i == argc-1 ) {
FatalError( "-keymap must be followed by a filename\n" );
diff --git a/hw/darwin/darwin.h b/hw/darwin/darwin.h
index ef0a922..468cb6e 100644
--- a/hw/darwin/darwin.h
+++ b/hw/darwin/darwin.h
@@ -106,7 +106,6 @@ extern int darwinMouseAccelChange;
extern int darwinFakeButtons;
extern int darwinFakeMouse2Mask;
extern int darwinFakeMouse3Mask;
-extern int darwinSwapAltMeta;
extern char *darwinKeymapFile;
extern int darwinSyncKeymap;
extern unsigned int darwinDesiredWidth, darwinDesiredHeight;
diff --git a/hw/darwin/darwinKeyboard.c b/hw/darwin/darwinKeyboard.c
index efa12b7..25ce9d1 100644
--- a/hw/darwin/darwinKeyboard.c
+++ b/hw/darwin/darwinKeyboard.c
@@ -58,10 +58,7 @@
// Define this to get a diagnostic output to stderr which is helpful
// in determining how the X server is interpreting the Darwin keymap.
-#undef DUMP_DARWIN_KEYMAP
-
-/* Define this to use Alt for Mode_switch. */
-//#define ALT_IS_MODE_SWITCH 1
+#define DUMP_DARWIN_KEYMAP
#include <stdio.h>
#include <stdlib.h>
@@ -77,9 +74,6 @@
#define MetaMask Mod2Mask
#define FunctionMask Mod3Mask
-// FIXME: It would be nice to support some of the extra keys in XF86keysym.h,
-// at least the volume controls that now ship on every Apple keyboard.
-
#define UK(a) NoSymbol // unknown symbol
static KeySym const next_to_x[256] = {
@@ -218,6 +212,9 @@ static void DarwinChangeKeyboardControl( DeviceIntPtr device, KeybdCtrl *ctrl )
}
darwinKeyboardInfo keyInfo;
+KeySymRemapList *keySymRemapList = NULL;
+ModMaskRemapList *modMaskRemapList = NULL;
+
static FILE *fref = NULL;
static char *inBuffer = NULL;
@@ -464,6 +461,8 @@ Bool DarwinParseNXKeyMapping(
}
}
+ DEBUG_LOG("DarwinParseNXKeyMapping: Parsing keymap file: %s.", darwinKeymapFile);
+
if (!haveKeymap) {
// get the Darwin keyboard map
keyMap.size = NXKeyMappingLength( darwinParamConnect );
@@ -513,7 +512,7 @@ Bool DarwinParseNXKeyMapping(
break;
case NX_MODIFIERKEY_ALTERNATE:
info->keyMap[keyCode * GLYPHS_PER_KEY] =
- (left ? XK_Mode_switch : XK_Alt_R);
+ (left ? XK_Alt_L : XK_Alt_R);
break;
case NX_MODIFIERKEY_COMMAND:
info->keyMap[keyCode * GLYPHS_PER_KEY] =
@@ -638,6 +637,107 @@ Bool DarwinParseNXKeyMapping(
return TRUE;
}
+/* Return the modifier mask for the given string. If no match, return -1 */
+static CARD8 strToXModMask(const char *str) {
+ if(!strcmp(str, "shift")) {
+ return ShiftMask;
+ } else if(!strcmp(str, "lock")) {
+ return LockMask;
+ } else if(!strcmp(str, "control")) {
+ return ControlMask;
+ } else if(!strcmp(str, "mod1")) {
+ return Mod1Mask;
+ } else if(!strcmp(str, "mod2")) {
+ return Mod2Mask;
+ } else if(!strcmp(str, "mod3")) {
+ return Mod3Mask;
+ } else if(!strcmp(str, "mod4")) {
+ return Mod4Mask;
+ } else if(!strcmp(str, "mod5")) {
+ return Mod5Mask;
+ }
+ DEBUG_LOG("strToXModMask: Invalid str: %s", str);
+ return -1;
+}
+
+/* Return the KeySym for the given string. If no match, return -1 */
+static KeySym strToXKeySym(const char *str) {
+ if(!strcmp(str, "Shift_L")) {
+ return XK_Shift_L;
+ } else if(!strcmp(str, "Shift_R")) {
+ return XK_Shift_R;
+ } else if(!strcmp(str, "Caps_Lock")) {
+ return XK_Caps_Lock;
+ } else if(!strcmp(str, "Control_L")) {
+ return XK_Control_L;
+ } else if(!strcmp(str, "Control_R")) {
+ return XK_Control_R;
+ } else if(!strcmp(str, "Alt_L")) {
+ return XK_Alt_L;
+ } else if(!strcmp(str, "Alt_R")) {
+ return XK_Alt_R;
+ } else if(!strcmp(str, "Meta_L")) {
+ return XK_Meta_L;
+ } else if(!strcmp(str, "Meta_R")) {
+ return XK_Meta_R;
+ } else if(!strcmp(str, "Mode_switch")) {
+ return XK_Mode_switch;
+ } else if(!strcmp(str, "Multi_key")) {
+ return XK_Multi_key;
+ }
+ DEBUG_LOG("strToXKeySym: Invalid str: %s", str);
+ return -1;
+}
+
+Bool DarwinKeyboardModMaskRemapStr(const char *keyS, const char *mask) {
+ KeySym key;
+ KeySym modMask;
+ ModMaskRemapList *m;
+
+ key = strToXKeySym(keyS);
+ modMask = strToXModMask(mask);
+
+ if(key == -1 || modMask == -1)
+ return 0;
+
+ m = (ModMaskRemapList *)xalloc(sizeof(ModMaskRemapList));
+ if(!m) {
+ DEBUG_LOG("DarwinKeyboardModMaskRemapStr: Error allocating memory.");
+ return 0;
+ }
+
+ m->key = key;
+ m->modMask = modMask;
+ m->next = modMaskRemapList;
+ modMaskRemapList = m;
+
+ return 1;
+}
+
+Bool DarwinKeyboardKeySymRemapStr(const char *fromS, const char *toS) {
+ KeySym from;
+ KeySym to;
+ KeySymRemapList *m;
+
+ from = strToXKeySym(fromS);
+ to = strToXKeySym(toS);
+
+ if(from == -1 || to == -1)
+ return 0;
+
+ m = (KeySymRemapList *)xalloc(sizeof(KeySymRemapList));
+ if(!m) {
+ DEBUG_LOG("DarwinKeyboardKeySymRemapStr: Error allocating memory.");
+ return 0;
+ }
+
+ m->from = from;
+ m->to = to;
+ m->next = keySymRemapList;
+ keySymRemapList = m;
+
+ return 1;
+}
/*
* DarwinBuildModifierMaps
@@ -645,20 +745,17 @@ Bool DarwinParseNXKeyMapping(
* the modMap and modifierKeycodes fields.
*/
static void
-DarwinBuildModifierMaps(
- darwinKeyboardInfo *info)
-{
+DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
int i;
KeySym *k;
memset(info->modMap, NoSymbol, sizeof(info->modMap));
memset(info->modifierKeycodes, 0, sizeof(info->modifierKeycodes));
- for (i = 0; i < NUM_KEYCODES; i++)
- {
+ for (i = 0; i < NUM_KEYCODES; i++) {
k = info->keyMap + i * GLYPHS_PER_KEY;
- switch (k[0]) {
+ switch (*k) {
case XK_Shift_L:
info->modifierKeycodes[NX_MODIFIERKEY_SHIFT][0] = i;
info->modMap[MIN_KEYCODE + i] = ShiftMask;
@@ -729,33 +826,14 @@ DarwinBuildModifierMaps(
break;
}
- if (darwinSwapAltMeta)
- {
- switch (k[0])
- {
- case XK_Alt_L:
- k[0] = XK_Meta_L;
- break;
- case XK_Alt_R:
- k[0] = XK_Meta_R;
- break;
- case XK_Meta_L:
- k[0] = XK_Alt_L;
- break;
- case XK_Meta_R:
- k[0] = XK_Alt_R;
- break;
- }
- }
-
-#if ALT_IS_MODE_SWITCH
- if (k[0] == XK_Alt_L)
- k[0] = XK_Mode_switch;
-#endif
+ /* Use modMaskRemapList to overwrite default ModMasks */
+ ModMaskRemapList *m;
+ for(m = modMaskRemapList; m; m = m->next)
+ if(*k == m->key)
+ info->modMap[MIN_KEYCODE + i] = m->modMask;
}
}
-
/*
* DarwinLoadKeyboardMapping
* Load the keyboard map from a file or system and convert
@@ -764,31 +842,52 @@ DarwinBuildModifierMaps(
static void
DarwinLoadKeyboardMapping(KeySymsRec *keySyms)
{
+ int i;
+ KeySym *k;
+
memset(keyInfo.keyMap, 0, sizeof(keyInfo.keyMap));
+ /* TODO: Clean this up
+ * DarwinModeReadSystemKeymap is in quartz/quartzKeyboard.c
+ * DarwinParseNXKeyMapping is here
+ */
if (!DarwinParseNXKeyMapping(&keyInfo)) {
+ DEBUG_LOG("DarwinParseNXKeyMapping returned 0... running DarwinModeReadSystemKeymap().");
if (!DarwinModeReadSystemKeymap(&keyInfo)) {
FatalError("Could not build a valid keymap.");
}
}
+ /* Use keySymRemapList to overwrite default key mappings.
+ * We do this because IOKit doesn't know about Mode_shift, etc and we
+ * want to allow the user to set thisa key to this. We could use
+ * custom keymap files, but this is easier for the user to work with.
+ */
+ for (i = 0; i < NUM_KEYCODES; i++) {
+ k = keyInfo.keyMap + i * GLYPHS_PER_KEY;
+ KeySymRemapList *m;
+ for(m = keySymRemapList; m; m = m->next)
+ if(*k == m->from)
+ *k = m->to;
+ }
+
DarwinBuildModifierMaps(&keyInfo);
#ifdef DUMP_DARWIN_KEYMAP
- ErrorF("Darwin -> X converted keyboard map\n");
- for (i = 0, k = info->keyMap; i < NX_NUMKEYCODES;
+ DEBUG_LOG("Darwin -> X converted keyboard map\n");
+ for (i = 0, k = keyInfo.keyMap; i < NX_NUMKEYCODES;
i++, k += GLYPHS_PER_KEY)
{
int j;
- ErrorF("0x%02x:", i);
+ DEBUG_LOG("0x%02x:", i);
for (j = 0; j < GLYPHS_PER_KEY; j++) {
if (k[j] == NoSymbol) {
- ErrorF("\tNoSym");
+ DEBUG_LOG("\tNoSym");
} else {
- ErrorF("\t0x%x", k[j]);
+ DEBUG_LOG("\t0x%lx", k[j]);
}
}
- ErrorF("\n");
+ DEBUG_LOG("\n");
}
#endif
@@ -937,32 +1036,6 @@ int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide)
}
/*
- * DarwinModifierNXMaskToNXKeyCode
- * Returns 0 if mask is not a known modifier mask.
- */
-int DarwinModifierNXMaskToNXKeyCode(int mask)
-{
- switch (mask) {
- case NX_ALPHASHIFTMASK: return XK_Caps_Lock;
- case NX_SHIFTMASK: ErrorF("Warning: Received NX_SHIFTMASK, treating as NX_DEVICELSHIFTKEYMASK\n");
- case NX_DEVICELSHIFTKEYMASK: return NX_MODIFIERKEY_SHIFT; //XK_Shift_L;
- case NX_DEVICERSHIFTKEYMASK: return NX_MODIFIERKEY_RSHIFT; //XK_Shift_R;
- case NX_CONTROLMASK: ErrorF("Warning: Received NX_CONTROLMASK, treating as NX_DEVICELCTLKEYMASK\n");
- case NX_DEVICELCTLKEYMASK: return XK_Control_L;
- case NX_DEVICERCTLKEYMASK: return XK_Control_R;
- case NX_ALTERNATEMASK: ErrorF("Warning: Received NX_ALTERNATEMASK, treating as NX_DEVICELALTKEYMASK\n");
- case NX_DEVICELALTKEYMASK: return XK_Alt_L;
- case NX_DEVICERALTKEYMASK: return XK_Alt_R;
- case NX_COMMANDMASK: ErrorF("Warning: Received NX_COMMANDMASK, treating as NX_DEVICELCMDKEYMASK\n");
- case NX_DEVICELCMDKEYMASK: return XK_Meta_L;
- case NX_DEVICERCMDKEYMASK: return XK_Meta_R;
- case NX_NUMERICPADMASK: return XK_Num_Lock;
- case NX_HELPMASK: return XK_Help;
- case NX_SECONDARYFNMASK: return XK_Control_L; // this seems very wrong, but is what the old code did
- }
-}
-
-/*
* DarwinModifierNXMaskToNXKey
* Returns -1 if mask is not a known modifier mask.
*/
@@ -997,25 +1070,25 @@ int DarwinModifierNXMaskToNXKey(int mask)
return -1;
}
-char * DarwinModifierNXMaskTostring(int mask)
+const char *DarwinModifierNXMaskTostring(int mask)
{
switch (mask) {
- case NX_ALPHASHIFTMASK: return "NX_ALPHASHIFTMASK";
- case NX_SHIFTMASK: return "NX_SHIFTMASK";
- case NX_DEVICELSHIFTKEYMASK: return "NX_DEVICELSHIFTKEYMASK";
- case NX_DEVICERSHIFTKEYMASK: return "NX_DEVICERSHIFTKEYMASK";
- case NX_CONTROLMASK: return "NX_CONTROLMASK";
- case NX_DEVICELCTLKEYMASK: return "NX_DEVICELCTLKEYMASK";
- case NX_DEVICERCTLKEYMASK: return "NX_DEVICERCTLKEYMASK";
- case NX_ALTERNATEMASK: return "NX_ALTERNATEMASK";
- case NX_DEVICELALTKEYMASK: return "NX_DEVICELALTKEYMASK";
- case NX_DEVICERALTKEYMASK: return "NX_DEVICERALTKEYMASK";
- case NX_COMMANDMASK: return "NX_COMMANDMASK";
- case NX_DEVICELCMDKEYMASK: return "NX_DEVICELCMDKEYMASK";
- case NX_DEVICERCMDKEYMASK: return "NX_DEVICERCMDKEYMASK";
- case NX_NUMERICPADMASK: return "NX_NUMERICPADMASK";
- case NX_HELPMASK: return "NX_HELPMASK";
- case NX_SECONDARYFNMASK: return "NX_SECONDARYFNMASK";
+ case NX_ALPHASHIFTMASK: return "NX_ALPHASHIFTMASK";
+ case NX_SHIFTMASK: return "NX_SHIFTMASK";
+ case NX_DEVICELSHIFTKEYMASK: return "NX_DEVICELSHIFTKEYMASK";
+ case NX_DEVICERSHIFTKEYMASK: return "NX_DEVICERSHIFTKEYMASK";
+ case NX_CONTROLMASK: return "NX_CONTROLMASK";
+ case NX_DEVICELCTLKEYMASK: return "NX_DEVICELCTLKEYMASK";
+ case NX_DEVICERCTLKEYMASK: return "NX_DEVICERCTLKEYMASK";
+ case NX_ALTERNATEMASK: return "NX_ALTERNATEMASK";
+ case NX_DEVICELALTKEYMASK: return "NX_DEVICELALTKEYMASK";
+ case NX_DEVICERALTKEYMASK: return "NX_DEVICERALTKEYMASK";
+ case NX_COMMANDMASK: return "NX_COMMANDMASK";
+ case NX_DEVICELCMDKEYMASK: return "NX_DEVICELCMDKEYMASK";
+ case NX_DEVICERCMDKEYMASK: return "NX_DEVICERCMDKEYMASK";
+ case NX_NUMERICPADMASK: return "NX_NUMERICPADMASK";
+ case NX_HELPMASK: return "NX_HELPMASK";
+ case NX_SECONDARYFNMASK: return "NX_SECONDARYFNMASK";
}
return "unknown mask";
}
diff --git a/hw/darwin/darwinKeyboard.h b/hw/darwin/darwinKeyboard.h
index 368aee9..9237702 100644
--- a/hw/darwin/darwinKeyboard.h
+++ b/hw/darwin/darwinKeyboard.h
@@ -44,6 +44,24 @@ typedef struct darwinKeyboardInfo_struct {
unsigned char modifierKeycodes[32][2];
} darwinKeyboardInfo;
+typedef struct KeySymRemapList_struct {
+ KeySym from;
+ KeySym to;
+ struct KeySymRemapList_struct *next;
+} KeySymRemapList;
+
+typedef struct ModMaskRemapList_struct {
+ KeySym key;
+ CARD8 modMask;
+ struct ModMaskRemapList_struct *next;
+} ModMaskRemapList;
+
+/* Add remappings to our lists.
+ * Return true on success.
+ */
+Bool DarwinKeyboardKeySymRemapStr(const char *from, const char *to);
+Bool DarwinKeyboardModMaskRemapStr(const char *key, const char *mask);
+
void DarwinKeyboardReload(DeviceIntPtr pDev);
unsigned int DarwinModeSystemKeymapSeed(void);
Bool DarwinModeReadSystemKeymap(darwinKeyboardInfo *info);
diff --git a/hw/darwin/quartz/X11Application.m b/hw/darwin/quartz/X11Application.m
index 6705b3c..c6faa2c 100644
--- a/hw/darwin/quartz/X11Application.m
+++ b/hw/darwin/quartz/X11Application.m
@@ -682,9 +682,6 @@ cfarray_to_nsarray (CFArrayRef in)
quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS
default:quartzXpluginOptions];
#endif
-
- darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META
- default:darwinSwapAltMeta];
darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
default:darwinFakeButtons];
if (darwinFakeButtons) {
More information about the xorg-commit
mailing list