Fix support for evdev (#473875) Following upstream commits: Author: c2woody Date: Wed Dec 31 16:33:46 2008 +0000 add evdev-kbd compatible scancode remapping (disabled atm) Author: qbix79 Date: Thu Jan 22 13:14:33 2009 +0000 Add experimental evdev detection. Author: qbix79 Date: Thu Jan 22 21:44:14 2009 +0000 counting is hard diff -up dosbox-0.72/src/gui/sdl_mapper.cpp.evdev dosbox-0.72/src/gui/sdl_mapper.cpp --- dosbox-0.72/src/gui/sdl_mapper.cpp.evdev 2007-08-17 14:49:56.000000000 -0400 +++ dosbox-0.72/src/gui/sdl_mapper.cpp 2009-03-08 21:41:46.000000000 -0400 @@ -1614,7 +1614,7 @@ static struct { static void change_action_text(const char* text,Bit8u col) { - bind_but.action->Change(text); + bind_but.action->Change(text,""); bind_but.action->SetColor(col); } @@ -2172,7 +2172,7 @@ static void CreateBindGroups(void) { if (mapper.sticks.num) SDL_JoystickEventState(SDL_DISABLE); #else // enable joystick event handling - if (numsticks) SDL_JoystickEventState(SDL_ENABLE); + if (mapper.sticks.num) SDL_JoystickEventState(SDL_ENABLE); else return; #endif Bit8u joyno=0; @@ -2276,6 +2276,11 @@ void MAPPER_Init(void) { if (!MAPPER_LoadBinds()) CreateDefaultBinds(); } +//Somehow including them at the top conflicts with something in setup.h +#ifdef LINUX +#include "SDL_syswm.h" +#include +#endif void MAPPER_StartUp(Section * sec) { Section_prop * section=static_cast(sec); mapper.sticks.num=0; @@ -2292,7 +2297,7 @@ void MAPPER_StartUp(Section * sec) { virtual_joysticks[0].axis_pos[i]=0; } - usescancodes=false; + usescancodes = false; if (section->Get_bool("usescancodes")) { usescancodes=true; @@ -2319,23 +2324,63 @@ void MAPPER_StartUp(Section * sec) { sdlkey_map[0x5E]=SDLK_RALT; sdlkey_map[0x40]=SDLK_KP5; sdlkey_map[0x41]=SDLK_KP6; -#elif !defined (WIN32) /* => Linux */ - 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; +#elif !defined (WIN32) /* => Linux & BSDs */ + //bool evdev_input = false; + bool evdev_input = true; +#ifdef LINUX + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + if (SDL_GetWMInfo(&info)) { + XkbDescPtr desc = NULL; + if((desc = XkbGetMap(info.info.x11.display,XkbAllComponentsMask,XkbUseCoreKbd))) { + if(XkbGetNames(info.info.x11.display,XkbAllNamesMask,desc) == 0) { + const char* keycodes = XGetAtomName(info.info.x11.display, desc->names->keycodes); +// const char* geom = XGetAtomName(info.info.x11.display, desc->names->geometry); + if(keycodes) { + LOG(LOG_MISC,LOG_NORMAL)("keyboard type %s",keycodes); + if (strncmp(keycodes,"evdev",5) == 0) evdev_input = true; + } + XkbFreeNames(desc,XkbAllNamesMask,True); + } + XkbFreeClientMap(desc,0,True); + } + } +#endif + if (evdev_input) { + sdlkey_map[0x67]=SDLK_UP; + sdlkey_map[0x6c]=SDLK_DOWN; + sdlkey_map[0x69]=SDLK_LEFT; + sdlkey_map[0x6a]=SDLK_RIGHT; + sdlkey_map[0x66]=SDLK_HOME; + sdlkey_map[0x6b]=SDLK_END; + sdlkey_map[0x68]=SDLK_PAGEUP; + sdlkey_map[0x6d]=SDLK_PAGEDOWN; + sdlkey_map[0x6e]=SDLK_INSERT; + sdlkey_map[0x6f]=SDLK_DELETE; + sdlkey_map[0x62]=SDLK_KP_DIVIDE; + sdlkey_map[0x60]=SDLK_KP_ENTER; + sdlkey_map[0x61]=SDLK_RCTRL; + sdlkey_map[0x77]=SDLK_PAUSE; + sdlkey_map[0x63]=SDLK_PRINT; + sdlkey_map[0x64]=SDLK_RALT; + } else { + 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;