Add an option to build with SDL joystick backend on Windows

This commit is contained in:
Alexander Babikov
2024-03-07 23:10:38 +05:00
parent 2e10c5a870
commit 1019953ba5
2 changed files with 57 additions and 17 deletions

View File

@@ -190,8 +190,7 @@ endif()
if(WIN32) 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 win_joystick_rawinput.c) target_sources(plat PRIVATE win_dynld.c)
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
@@ -206,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