From db884adba430eadf14a125de16cf5cdd28e487fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Thu, 16 Feb 2006 20:18:59 +0000 Subject: [PATCH] add scancode mapping of MacOSX for usescancodes=true (thanks to cc_benny for this!) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2506 --- src/gui/sdl_mapper.cpp | 90 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 8 deletions(-) diff --git a/src/gui/sdl_mapper.cpp b/src/gui/sdl_mapper.cpp index f8438d8f..d3e54a3c 100644 --- a/src/gui/sdl_mapper.cpp +++ b/src/gui/sdl_mapper.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: sdl_mapper.cpp,v 1.20 2006-02-12 23:23:52 harekiet Exp $ */ +/* $Id: sdl_mapper.cpp,v 1.21 2006-02-16 20:18:59 c2woody Exp $ */ #define OLD_JOYSTICK 1 @@ -211,14 +211,70 @@ protected: #define MAX_SDLKEYS 323 -#define MAX_SCANCODES 212 static bool usescancodes; -Bit8u scancode_map[MAX_SDLKEYS]; +static Bit8u scancode_map[MAX_SDLKEYS]; #define Z SDLK_UNKNOWN -SDLKey sdlkey_map[MAX_SCANCODES]={SDLK_UNKNOWN,SDLK_ESCAPE, +#if defined (MACOSX) +static SDLKey sdlkey_map[]={ + /* Main block printables */ + /*00-05*/ SDLK_a, SDLK_s, SDLK_d, SDLK_f, SDLK_h, SDLK_g, + /*06-0B*/ SDLK_z, SDLK_x, SDLK_c, SDLK_v, SDLK_WORLD_0, SDLK_b, + /*0C-11*/ SDLK_q, SDLK_w, SDLK_e, SDLK_r, SDLK_y, SDLK_t, + /*12-17*/ SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_6, SDLK_5, + /*18-1D*/ SDLK_EQUALS, SDLK_9, SDLK_7, SDLK_MINUS, SDLK_8, SDLK_0, + /*1E-21*/ SDLK_RIGHTBRACKET, SDLK_o, SDLK_u, SDLK_LEFTBRACKET, + /*22-23*/ SDLK_i, SDLK_p, + /*24-29*/ SDLK_RETURN, SDLK_l, SDLK_j, SDLK_QUOTE, SDLK_k, SDLK_SEMICOLON, + /*2A-29*/ SDLK_BACKSLASH, SDLK_COMMA, SDLK_SLASH, SDLK_n, SDLK_m, + /*2F-2F*/ SDLK_PERIOD, + + /* Spaces, controls, modifiers (dosbox uses LMETA only for + * hotkeys, it's not really mapped to an emulated key) */ + /*30-33*/ SDLK_TAB, SDLK_SPACE, SDLK_BACKQUOTE, SDLK_BACKSPACE, + /*34-37*/ Z, SDLK_ESCAPE, Z, SDLK_LMETA, + /*38-3B*/ SDLK_LSHIFT, SDLK_CAPSLOCK, SDLK_LALT, SDLK_LCTRL, + + /*3C-40*/ Z, Z, Z, Z, Z, + + /* Keypad (KP_EQUALS not supported, NUMLOCK used on what is CLEAR + * in Mac OS X) */ + /*41-46*/ SDLK_KP_PERIOD, Z, SDLK_KP_MULTIPLY, Z, SDLK_PLUS, Z, + /*47-4A*/ SDLK_NUMLOCK /*==SDLK_CLEAR*/, Z, Z, Z, + /*4B-4D*/ SDLK_KP_DIVIDE, SDLK_KP_ENTER, Z, + /*4E-51*/ SDLK_KP_MINUS, Z, Z, SDLK_KP_EQUALS, + /*52-57*/ SDLK_KP0, SDLK_KP1, SDLK_KP2, SDLK_KP3, SDLK_KP4, SDLK_KP5, + /*58-5C*/ SDLK_KP6, SDLK_KP7, Z, SDLK_KP8, SDLK_KP9, + + /*5D-5F*/ Z, Z, Z, + + /* Function keys and cursor blocks (F13-F16 not supported, INSERT + * used on what is HELP in Mac OS X) */ + /*60-64*/ SDLK_F5, SDLK_F6, SDLK_F7, SDLK_F3, SDLK_F8, + /*65-6A*/ SDLK_F9, Z, SDLK_F11, Z, SDLK_F13, (SDLKey)(SDLK_F15+1), + /*6B-71*/ SDLK_F14, Z, SDLK_F10, Z, SDLK_F12, Z, SDLK_F15, + /*72-74*/ SDLK_INSERT /*==SDLK_HELP*/, SDLK_HOME, SDLK_PAGEUP, + /*75-79*/ SDLK_DELETE, SDLK_F4, SDLK_END, SDLK_F2, SDLK_PAGEDOWN, + /*7A-7E*/ SDLK_F1, SDLK_LEFT, SDLK_RIGHT, SDLK_DOWN, SDLK_UP, + + /*7F-7F*/ Z, + + /* 4 extra keys that don't really exist, but are needed for + * round-trip mapping (dosbox uses RMETA only for hotkeys, it's + * not really mapped to an emulated key) */ + SDLK_RMETA, SDLK_RSHIFT, SDLK_RALT, SDLK_RCTRL, +}; +#define MAX_SCANCODES (0x80+4) +/* Make sure that the table above has the expected size. This + expression will raise a compiler error if the condition is false. */ +typedef char assert_right_size [MAX_SCANCODES == (sizeof(sdlkey_map)/sizeof(sdlkey_map[0])) ? 1 : -1]; + +#else // !MACOSX + +#define MAX_SCANCODES 212 +static SDLKey sdlkey_map[MAX_SCANCODES]={SDLK_UNKNOWN,SDLK_ESCAPE, SDLK_1,SDLK_2,SDLK_3,SDLK_4,SDLK_5,SDLK_6,SDLK_7,SDLK_8,SDLK_9,SDLK_0, /* 0x0c: */ SDLK_MINUS,SDLK_EQUALS,SDLK_BACKSPACE,SDLK_TAB, @@ -244,6 +300,7 @@ SDLKey sdlkey_map[MAX_SCANCODES]={SDLK_UNKNOWN,SDLK_ESCAPE, Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z,Z /* 0xd4: ... */ }; +#endif #undef Z @@ -258,11 +315,18 @@ SDLKey MapSDLCode(Bitu skey) { Bitu GetKeyCode(SDL_keysym keysym) { if (usescancodes) { Bitu key=(Bitu)keysym.scancode; - if (key==0) { + if (key==0 +#if defined (MACOSX) + /* On Mac on US keyboards, scancode 0 is actually the 'a' + * key. For good measure exclude all printables from this + * condition. */ + && (keysym.sym < SDLK_SPACE || keysym.sym > SDLK_WORLD_95) +#endif + ) { /* try to retrieve key from symbolic key as scancode is zero */ if (keysym.sym Linux */ sdlkey_map[0x5a]=SDLK_UP; sdlkey_map[0x60]=SDLK_DOWN; sdlkey_map[0x5c]=SDLK_LEFT;