diff --git a/code/io/spacemouse.cpp b/code/io/spacemouse.cpp index c47e9f9e8a..5e44c51400 100644 --- a/code/io/spacemouse.cpp +++ b/code/io/spacemouse.cpp @@ -165,12 +165,21 @@ std::unique_ptr SpaceMouse::searchSpaceMice(int pollingFrequency) { return mouse; } +static std::unique_ptr sharedMouse = nullptr; SpaceMouse* SpaceMouse::getSharedSpaceMouse(int pollingFrequency) { - static std::unique_ptr sharedMouse = SpaceMouse::searchSpaceMice(pollingFrequency); + if (!sharedMouse) { + sharedMouse = searchSpaceMice(pollingFrequency); + } + return sharedMouse.get(); } +void SpaceMouse::shutdownSharedSpaceMouse() +{ + sharedMouse = nullptr; +} + #define HANDLE_NONLINEARITY(field, idx) field = copysignf(powf(field, std::get<0>(spacemouse_nonlinearity[idx])) * std::get<1>(spacemouse_nonlinearity[idx]), field) void SpaceMouseMovement::handleNonlinearities(std::array, 6>& spacemouse_nonlinearity) { diff --git a/code/io/spacemouse.h b/code/io/spacemouse.h index 25deb00eca..19a99fffed 100644 --- a/code/io/spacemouse.h +++ b/code/io/spacemouse.h @@ -63,6 +63,14 @@ namespace io @returns A pointer to the shared SpaceMouse instance, or nullptr if no supported device is present. */ static SpaceMouse* getSharedSpaceMouse(int pollingFrequency = 10); + + /* + @brief Closes the shared SpaceMouse instance, if one was opened. + + Must be called before HIDAPI is shut down, since the device handle may not outlive it. + Safe to call repeatedly and when no device was ever opened. + */ + static void shutdownSharedSpaceMouse(); }; } } diff --git a/code/osapi/osapi.cpp b/code/osapi/osapi.cpp index b16a83db44..a537941b6a 100644 --- a/code/osapi/osapi.cpp +++ b/code/osapi/osapi.cpp @@ -21,6 +21,7 @@ #include "imgui.h" #include "backends/imgui_impl_sdl3.h" +#include "io/spacemouse.h" #ifdef SCP_UNIX #include @@ -634,10 +635,12 @@ void os_deinit() // Free the view ports os::closeAllViewports(); - SDL_Quit(); + //If we have an open space mouse, close it + io::spacemouse::SpaceMouse::shutdownSharedSpaceMouse(); - // Balance the SDL_hid_init() from os_init(). SDL_hid_exit(); + + SDL_Quit(); } void debug_int3(const char *file, int line)