diff --git a/CMakeLists.txt b/CMakeLists.txt
index cacf1aaa4..ae39fbccf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -131,7 +131,6 @@ option(RTMIDI "RtMidi"
option(FLUIDSYNTH "FluidSynth" ON)
option(MUNT "MUNT" ON)
option(VNC "VNC renderer" OFF)
-option(DINPUT "DirectInput" OFF)
option(CPPTHREADS "C++11 threads" ON)
option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF)
option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF)
diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt
index 4f073cf4a..5dc6f8a07 100644
--- a/src/qt/CMakeLists.txt
+++ b/src/qt/CMakeLists.txt
@@ -191,13 +191,6 @@ if(WIN32)
enable_language(RC)
target_sources(86Box PUBLIC ../win/86Box-qt.rc)
target_sources(plat PRIVATE win_dynld.c)
- if(DINPUT)
- target_sources(plat PRIVATE win_joystick.cpp)
- target_link_libraries(86Box dinput8)
- else()
- target_sources(plat PRIVATE win_joystick_rawinput.c)
- endif()
- target_link_libraries(86Box hid)
# CMake 3.22 messed this up for clang/clang++
# See https://gitlab.kitware.com/cmake/cmake/-/issues/22611
@@ -212,8 +205,15 @@ if(WIN32)
if (MINGW)
add_compile_definitions(NTDDI_VERSION=0x06010000)
endif()
+
+ option(SDL_JOYSTICK "Use SDL2 joystick backend instead of raw input" OFF)
+endif()
+
+if(WIN32 AND NOT SDL_JOYSTICK)
+ target_sources(plat PRIVATE win_joystick_rawinput.c)
+ target_link_libraries(86Box hid)
else()
- target_sources(plat PRIVATE sdl_joystick.cpp)
+ target_sources(plat PRIVATE sdl_joystick.c)
endif()
if(WIN32 AND NOT MINGW)
diff --git a/src/qt/sdl_joystick.cpp b/src/qt/sdl_joystick.c
similarity index 76%
rename from src/qt/sdl_joystick.cpp
rename to src/qt/sdl_joystick.c
index 4437bb696..d56612872 100644
--- a/src/qt/sdl_joystick.cpp
+++ b/src/qt/sdl_joystick.c
@@ -1,28 +1,53 @@
-// Lifted from wx-sdl2-joystick.c in PCem
-
+/*
+ * 86Box A hypervisor and IBM PC system emulator that specializes in
+ * running old operating systems and software designed for IBM
+ * PC systems and compatibles from 1981 through fairly recent
+ * system designs based on the PCI bus.
+ *
+ * This file is part of the 86Box distribution.
+ *
+ * SDL2 joystick interface.
+ *
+ *
+ *
+ * Authors: Sarah Walker,
+ * Joakim L. Gilje
+ *
+ * Copyright 2017-2021 Sarah Walker
+ * Copyright 2021 Joakim L. Gilje
+ */
#include
-#include
-
-extern "C" {
+#include
+#include
+#include
+#include
+#include
+#define _USE_MATH_DEFINES
+#include
+/* This #undef is needed because a SDL include header redefines HAVE_STDARG_H. */
+#undef HAVE_STDARG_H
+#define HAVE_STDARG_H
+#include <86box/86box.h>
#include <86box/device.h>
#include <86box/gameport.h>
+#include <86box/plat_unused.h>
int joysticks_present;
joystick_t joystick_state[MAX_JOYSTICKS];
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
static SDL_Joystick *sdl_joy[MAX_PLAT_JOYSTICKS];
-}
-
-#include
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
void
-joystick_init()
+joystick_init(void)
{
+ /* This is needed for SDL's Windows raw input backend to work properly without SDL video. */
+ SDL_SetHint(SDL_HINT_JOYSTICK_THREAD, "1");
+
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0) {
return;
}
@@ -36,9 +61,9 @@ joystick_init()
int d;
strncpy(plat_joystick_state[c].name, SDL_JoystickNameForIndex(c), 64);
- plat_joystick_state[c].nr_axes = std::min(SDL_JoystickNumAxes(sdl_joy[c]), MAX_JOY_AXES);
- plat_joystick_state[c].nr_buttons = std::min(SDL_JoystickNumButtons(sdl_joy[c]), MAX_JOY_BUTTONS);
- plat_joystick_state[c].nr_povs = std::min(SDL_JoystickNumHats(sdl_joy[c]), MAX_JOY_POVS);
+ plat_joystick_state[c].nr_axes = MIN(SDL_JoystickNumAxes(sdl_joy[c]), MAX_JOY_AXES);
+ plat_joystick_state[c].nr_buttons = MIN(SDL_JoystickNumButtons(sdl_joy[c]), MAX_JOY_BUTTONS);
+ plat_joystick_state[c].nr_povs = MIN(SDL_JoystickNumHats(sdl_joy[c]), MAX_JOY_POVS);
for (d = 0; d < plat_joystick_state[c].nr_axes; d++) {
snprintf(plat_joystick_state[c].axis[d].name, sizeof(plat_joystick_state[c].axis[d].name), "Axis %i", d);
@@ -57,7 +82,7 @@ joystick_init()
}
void
-joystick_close()
+joystick_close(void)
{
int c;
@@ -103,8 +128,9 @@ joystick_get_axis(int joystick_nr, int mapping)
} else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
}
+
void
-joystick_process()
+joystick_process(void)
{
int c;
int d;
@@ -160,3 +186,11 @@ joystick_process()
}
}
}
+
+#ifdef _WIN32
+void
+win_joystick_handle(UNUSED(void *raw))
+{
+ /* Nothing to be done here, atleast currently */
+}
+#endif
diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt
index 604ba9bb0..dc8c53e45 100644
--- a/src/win/CMakeLists.txt
+++ b/src/win/CMakeLists.txt
@@ -51,6 +51,7 @@ if(NOT MINGW)
target_sources(plat PRIVATE win_opendir.c)
endif()
+option(DINPUT "Use DirectInput joystick backend instead of raw input" OFF)
if(DINPUT)
target_sources(plat PRIVATE win_joystick.cpp)
target_link_libraries(86Box dinput8)