https://bugs.gentoo.org/689538

diff -ruN hatari-2.1.0.old/src/gui-sdl/sdlgui.c hatari-2.1.0/src/gui-sdl/sdlgui.c
--- hatari-2.1.0.old/src/gui-sdl/sdlgui.c	2018-02-07 18:33:56.000000000 +0000
+++ hatari-2.1.0/src/gui-sdl/sdlgui.c	2019-07-08 23:55:50.481270799 +0100
@@ -1329,12 +1329,28 @@
 				}
 				break;
 
+			 case SDL_JOYHATMOTION:
+				if (sdlEvent.jhat.value & SDL_HAT_LEFT)
+					retbutton = SDLGui_HandleShortcut(dlg, SG_SHORTCUT_LEFT);
+				else if (sdlEvent.jhat.value & SDL_HAT_RIGHT)
+					retbutton = SDLGui_HandleShortcut(dlg, SG_SHORTCUT_RIGHT);
+				if (sdlEvent.jhat.value & SDL_HAT_UP)
+				{
+					SDLGui_RemoveFocus(dlg, focused);
+					focused = SDLGui_FocusNext(dlg, focused, -1);
+				}
+				else if (sdlEvent.jhat.value & SDL_HAT_DOWN)
+				{
+					SDLGui_RemoveFocus(dlg, focused);
+					focused = SDLGui_FocusNext(dlg, focused, +1);
+				}
+				break;
+
 			 case SDL_JOYBUTTONDOWN:
 				retbutton = SDLGui_HandleSelection(dlg, focused, focused);
 				break;
 
 			 case SDL_JOYBALLMOTION:
-			 case SDL_JOYHATMOTION:
 			 case SDL_MOUSEMOTION:
 				break;
 
diff -ruN hatari-2.1.0.old/src/joy.c hatari-2.1.0/src/joy.c
--- hatari-2.1.0.old/src/joy.c	2018-02-07 18:33:56.000000000 +0000
+++ hatari-2.1.0/src/joy.c	2019-07-09 14:46:36.502410790 +0100
@@ -199,9 +199,20 @@
  */
 static bool Joy_ReadJoystick(int nSdlJoyID, JOYREADING *pJoyReading)
 {
+	unsigned hat = SDL_JoystickGetHat(sdlJoystick[nSdlJoyID], 0);
+
 	/* Joystick is OK, read position from the configured joystick axis */
 	pJoyReading->XPos = SDL_JoystickGetAxis(sdlJoystick[nSdlJoyID], pJoyReading->XAxisID);
 	pJoyReading->YPos = SDL_JoystickGetAxis(sdlJoystick[nSdlJoyID], pJoyReading->YAxisID);
+	/* Similarly to other emulators that support hats, override axis readings with hats */
+	if (hat & SDL_HAT_LEFT)
+		pJoyReading->XPos = -32768;
+	if (hat & SDL_HAT_RIGHT)
+		pJoyReading->XPos = 32767;
+	if (hat & SDL_HAT_UP)
+		pJoyReading->YPos = -32768;
+	if (hat & SDL_HAT_DOWN)
+		pJoyReading->YPos = 32767;
 	/* Sets bit #0 if button #1 is pressed: */
 	pJoyReading->Buttons = SDL_JoystickGetButton(sdlJoystick[nSdlJoyID], 0);
 	/* Sets bit #1 if button #2 is pressed: */
