This commit is contained in:
OBattler
2024-03-08 22:36:55 +01:00
4 changed files with 57 additions and 23 deletions

View File

@@ -131,7 +131,6 @@ option(RTMIDI "RtMidi"
option(FLUIDSYNTH "FluidSynth" ON) option(FLUIDSYNTH "FluidSynth" ON)
option(MUNT "MUNT" ON) option(MUNT "MUNT" ON)
option(VNC "VNC renderer" OFF) option(VNC "VNC renderer" OFF)
option(DINPUT "DirectInput" OFF)
option(CPPTHREADS "C++11 threads" ON) option(CPPTHREADS "C++11 threads" ON)
option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF) option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF)
option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF) option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF)

View File

@@ -191,13 +191,6 @@ if(WIN32)
enable_language(RC) enable_language(RC)
target_sources(86Box PUBLIC ../win/86Box-qt.rc) target_sources(86Box PUBLIC ../win/86Box-qt.rc)
target_sources(plat PRIVATE win_dynld.c) 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++ # CMake 3.22 messed this up for clang/clang++
# See https://gitlab.kitware.com/cmake/cmake/-/issues/22611 # See https://gitlab.kitware.com/cmake/cmake/-/issues/22611
@@ -212,8 +205,15 @@ if(WIN32)
if (MINGW) if (MINGW)
add_compile_definitions(NTDDI_VERSION=0x06010000) add_compile_definitions(NTDDI_VERSION=0x06010000)
endif() 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() else()
target_sources(plat PRIVATE sdl_joystick.cpp) target_sources(plat PRIVATE sdl_joystick.c)
endif() endif()
if(WIN32 AND NOT MINGW) if(WIN32 AND NOT MINGW)

View File

@@ -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, <https://pcem-emulator.co.uk/>
* Joakim L. Gilje <jgilje@jgilje.net>
*
* Copyright 2017-2021 Sarah Walker
* Copyright 2021 Joakim L. Gilje
*/
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <algorithm> #include <stdarg.h>
#include <stdint.h>
extern "C" { #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _USE_MATH_DEFINES
#include <math.h>
/* 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/device.h>
#include <86box/gameport.h> #include <86box/gameport.h>
#include <86box/plat_unused.h>
int joysticks_present; int joysticks_present;
joystick_t joystick_state[MAX_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS];
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
static SDL_Joystick *sdl_joy[MAX_PLAT_JOYSTICKS]; static SDL_Joystick *sdl_joy[MAX_PLAT_JOYSTICKS];
}
#include <algorithm>
#ifndef M_PI #ifndef M_PI
# define M_PI 3.14159265358979323846 # define M_PI 3.14159265358979323846
#endif #endif
void 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) { if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0) {
return; return;
} }
@@ -36,9 +61,9 @@ joystick_init()
int d; int d;
strncpy(plat_joystick_state[c].name, SDL_JoystickNameForIndex(c), 64); 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_axes = 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_buttons = 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_povs = MIN(SDL_JoystickNumHats(sdl_joy[c]), MAX_JOY_POVS);
for (d = 0; d < plat_joystick_state[c].nr_axes; d++) { 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); 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 void
joystick_close() joystick_close(void)
{ {
int c; int c;
@@ -103,8 +128,9 @@ joystick_get_axis(int joystick_nr, int mapping)
} else } else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id]; return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
} }
void void
joystick_process() joystick_process(void)
{ {
int c; int c;
int d; 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

View File

@@ -51,6 +51,7 @@ if(NOT MINGW)
target_sources(plat PRIVATE win_opendir.c) target_sources(plat PRIVATE win_opendir.c)
endif() endif()
option(DINPUT "Use DirectInput joystick backend instead of raw input" OFF)
if(DINPUT) if(DINPUT)
target_sources(plat PRIVATE win_joystick.cpp) target_sources(plat PRIVATE win_joystick.cpp)
target_link_libraries(86Box dinput8) target_link_libraries(86Box dinput8)