From 5e08378445488859bef6dae5f36d2833023782c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Mon, 24 Oct 2005 17:27:37 +0000 Subject: [PATCH] add possibility to use scancodes rather than symkeys Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2355 --- src/gui/sdl_mapper.cpp | 149 +++++++++++++++++++++++++++++++++++++---- src/gui/sdlmain.cpp | 4 +- 2 files changed, 140 insertions(+), 13 deletions(-) diff --git a/src/gui/sdl_mapper.cpp b/src/gui/sdl_mapper.cpp index 96b6a5db..6c66fb6b 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.15 2005-10-09 15:17:01 qbix79 Exp $ */ +/* $Id: sdl_mapper.cpp,v 1.16 2005-10-24 17:27:37 c2woody Exp $ */ #define OLD_JOYSTICK 1 @@ -209,6 +209,74 @@ protected: }; + +#define MAX_SDLKEYS 323 +#define MAX_SCANCODES 212 + +static bool usescancodes; +Bit8u scancode_map[MAX_SDLKEYS]; + +#define Z SDLK_UNKNOWN + +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, + SDLK_q,SDLK_w,SDLK_e,SDLK_r,SDLK_t,SDLK_y,SDLK_u,SDLK_i,SDLK_o,SDLK_p, + SDLK_LEFTBRACKET,SDLK_RIGHTBRACKET,SDLK_RETURN,SDLK_LCTRL, + SDLK_a,SDLK_s,SDLK_d,SDLK_f,SDLK_g,SDLK_h,SDLK_j,SDLK_k,SDLK_l, + SDLK_SEMICOLON,SDLK_QUOTE,SDLK_BACKQUOTE,SDLK_LSHIFT,SDLK_BACKSLASH, + SDLK_z,SDLK_x,SDLK_c,SDLK_v,SDLK_b,SDLK_n,SDLK_m, + /* 0x33: */ + SDLK_COMMA,SDLK_PERIOD,SDLK_SLASH,SDLK_RSHIFT,SDLK_KP_MULTIPLY, + SDLK_LALT,SDLK_SPACE,SDLK_CAPSLOCK, + SDLK_F1,SDLK_F2,SDLK_F3,SDLK_F4,SDLK_F5,SDLK_F6,SDLK_F7,SDLK_F8,SDLK_F9,SDLK_F10, + /* 0x45: */ + SDLK_NUMLOCK,SDLK_SCROLLOCK, + SDLK_KP7,SDLK_KP8,SDLK_KP9,SDLK_KP_MINUS,SDLK_KP4,SDLK_KP5,SDLK_KP6,SDLK_KP_PLUS, + SDLK_KP1,SDLK_KP2,SDLK_KP3,SDLK_KP0,SDLK_KP_PERIOD, + SDLK_UNKNOWN,SDLK_UNKNOWN, + SDLK_LESS,SDLK_F11,SDLK_F12, + 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,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,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,Z,Z,Z,Z,Z,Z,Z, + /* 0xb7: */ + 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: ... */ +}; + +#undef Z + + +SDLKey MapSDLCode(Bitu skey) { + if (usescancodes) { + if (skeytype!=SDL_KEYDOWN) return 0; - return CreateKeyBind(event->key.keysym.sym); + return CreateKeyBind((SDLKey)GetKeyCode(event->key.keysym)); }; bool CheckEvent(SDL_Event * event) { if (event->type!=SDL_KEYDOWN && event->type!=SDL_KEYUP) return false; - Bitu key=(Bitu)event->key.keysym.sym; - assert(keykey.keysym); + LOG_MSG("key type %i is %x [%x %x]",event->type,key,event->key.keysym.sym,event->key.keysym.scancode); + assert(Bitu(event->key.keysym.sym)type==SDL_KEYDOWN) ActivateBindList(&lists[key],0x7fff); else DeactivateBindList(&lists[key]); return 0; } CBind * CreateKeyBind(SDLKey _key) { - assert((Bitu)_key(sec); + usescancodes=false; + + if (section->Get_bool("usescancodes")) { + usescancodes=true; + + /* Note: table has to be tested/updated for various OSs */ +#if !defined (WIN32) + sdlkey_map[0x5a]=SDLK_UP; + sdlkey_map[0x60]=SDLK_DOWN; + sdlkey_map[0x5c]=SDLK_LEFT; + sdlkey_map[0x5e]=SDLK_RIGHT; + sdlkey_map[0x59]=SDLK_HOME; + sdlkey_map[0x5f]=SDLK_END; + sdlkey_map[0x5b]=SDLK_PAGEUP; + sdlkey_map[0x61]=SDLK_PAGEDOWN; + sdlkey_map[0x62]=SDLK_INSERT; + sdlkey_map[0x63]=SDLK_DELETE; + sdlkey_map[0x68]=SDLK_KP_DIVIDE; + sdlkey_map[0x64]=SDLK_KP_ENTER; + sdlkey_map[0x65]=SDLK_RCTRL; + sdlkey_map[0x66]=SDLK_PAUSE; + sdlkey_map[0x67]=SDLK_PRINT; + sdlkey_map[0x69]=SDLK_RALT; +#else + sdlkey_map[0xc8]=SDLK_UP; + sdlkey_map[0xd0]=SDLK_DOWN; + sdlkey_map[0xcb]=SDLK_LEFT; + sdlkey_map[0xcd]=SDLK_RIGHT; + sdlkey_map[0xc7]=SDLK_HOME; + sdlkey_map[0xcf]=SDLK_END; + sdlkey_map[0xc9]=SDLK_PAGEUP; + sdlkey_map[0xd1]=SDLK_PAGEDOWN; + sdlkey_map[0xd2]=SDLK_INSERT; + sdlkey_map[0xd3]=SDLK_DELETE; + sdlkey_map[0xb5]=SDLK_KP_DIVIDE; + sdlkey_map[0x9c]=SDLK_KP_ENTER; + sdlkey_map[0x9d]=SDLK_RCTRL; + sdlkey_map[0xc5]=SDLK_PAUSE; + sdlkey_map[0xb7]=SDLK_PRINT; + sdlkey_map[0xb8]=SDLK_RALT; +#endif + + Bitu i; + for (i=0; iGet_string("mapperfile"); MAPPER_AddHandler(&MAPPER_Run,MK_f1,MMOD1,"mapper","Mapper"); } diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index 71bf8811..f38d5597 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: sdlmain.cpp,v 1.88 2005-09-18 19:50:03 c2woody Exp $ */ +/* $Id: sdlmain.cpp,v 1.89 2005-10-24 17:27:37 c2woody Exp $ */ #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -1095,6 +1095,7 @@ int main(int argc, char* argv[]) { sdl_sec->Add_bool("waitonerror",true); sdl_sec->Add_string("priority","higher,normal"); sdl_sec->Add_string("mapperfile","mapper.txt"); + sdl_sec->Add_bool("usescancodes",false); MSG_Add("SDL_CONFIGFILE_HELP", "fullscreen -- Start dosbox directly in fullscreen.\n" @@ -1116,6 +1117,7 @@ int main(int argc, char* argv[]) { "priority -- Priority levels for dosbox: lower,normal,higher,highest.\n" " Second entry behind the comma is for when dosbox is not focused/minimized.\n" "mapperfile -- File used to load/save the key/event mappings from.\n" + "usescancodes -- Avoid usage of symkeys, might not work on all operating systems.\n" ); /* Init all the dosbox subsystems */ DOSBOX_Init();