Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37708677
en ru br
ALT Linux repos
S:0.74.3-alt3
5.0: 0.72-alt7
4.1: 0.72-alt3
4.0: 0.72-alt4
3.0: 0.63-alt1.1

Group :: Emulators
RPM: dosbox

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: dosbox-0.72-rh-evdev.patch
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;
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin