Group :: Emulators
RPM: dosbox
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: dosbox-0.72-rh-evdev.patch
Download
Download
Fix support for evdev (#473875)
Following upstream commits:
Author: c2woody <c2woody>
Date: Wed Dec 31 16:33:46 2008 +0000
add evdev-kbd compatible scancode remapping (disabled atm)
Author: qbix79 <qbix79>
Date: Thu Jan 22 13:14:33 2009 +0000
Add experimental evdev detection.
Author: qbix79 <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 <X11/XKBlib.h>
+#endif
void MAPPER_StartUp(Section * sec) {
Section_prop * section=static_cast<Section_prop *>(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;