From c8554d218b11b7af081c0b836991ffb94ae003bb Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 22 Sep 2018 14:11:15 -0600 Subject: Input: Copy current SDL.h/cpp files to impl This should make reviewing much easier as you can then see what changed happened between the old file and the new one --- src/input_common/sdl/sdl_impl.h | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/input_common/sdl/sdl_impl.h (limited to 'src/input_common/sdl/sdl_impl.h') diff --git a/src/input_common/sdl/sdl_impl.h b/src/input_common/sdl/sdl_impl.h new file mode 100644 index 000000000..c152fa747 --- /dev/null +++ b/src/input_common/sdl/sdl_impl.h @@ -0,0 +1,51 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include "core/frontend/input.h" + +union SDL_Event; +namespace Common { +class ParamPackage; +} +namespace InputCommon { +namespace Polling { +class DevicePoller; +enum class DeviceType; +} // namespace Polling +} // namespace InputCommon + +namespace InputCommon { +namespace SDL { + +/// Initializes and registers SDL device factories +void Init(); + +/// Unresisters SDL device factories and shut them down. +void Shutdown(); + +/// Needs to be called before SDL_QuitSubSystem. +void CloseSDLJoysticks(); + +/// Handle SDL_Events for joysticks from SDL_PollEvent +void HandleGameControllerEvent(const SDL_Event& event); + +/// A Loop that calls HandleGameControllerEvent until Shutdown is called +void PollLoop(); + +/// Creates a ParamPackage from an SDL_Event that can directly be used to create a ButtonDevice +Common::ParamPackage SDLEventToButtonParamPackage(const SDL_Event& event); + +namespace Polling { + +/// Get all DevicePoller that use the SDL backend for a specific device type +void GetPollers(InputCommon::Polling::DeviceType type, + std::vector>& pollers); + +} // namespace Polling +} // namespace SDL +} // namespace InputCommon -- cgit v1.2.3 From 09ac66388c01187ed6a402efcad76984c8af9a2e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 20 Sep 2018 00:28:05 -0600 Subject: Input: Remove global variables from SDL Input Changes the interface as well to remove any unique methods that frontends needed to call such as StartJoystickEventHandler by conditionally starting the polling thread only if the frontend hasn't started it already. Additionally, moves all global state into a single SDLState class in order to guarantee that the destructors are called in the proper order --- src/input_common/sdl/sdl_impl.h | 79 ++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 33 deletions(-) (limited to 'src/input_common/sdl/sdl_impl.h') diff --git a/src/input_common/sdl/sdl_impl.h b/src/input_common/sdl/sdl_impl.h index c152fa747..fec82fbe6 100644 --- a/src/input_common/sdl/sdl_impl.h +++ b/src/input_common/sdl/sdl_impl.h @@ -1,51 +1,64 @@ -// Copyright 2017 Citra Emulator Project +// Copyright 2018 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once +#include #include -#include -#include "core/frontend/input.h" +#include +#include "common/threadsafe_queue.h" +#include "input_common/sdl/sdl.h" union SDL_Event; -namespace Common { -class ParamPackage; -} -namespace InputCommon { -namespace Polling { -class DevicePoller; -enum class DeviceType; -} // namespace Polling -} // namespace InputCommon +using SDL_Joystick = struct _SDL_Joystick; +using SDL_JoystickID = s32; -namespace InputCommon { -namespace SDL { +namespace InputCommon::SDL { -/// Initializes and registers SDL device factories -void Init(); +class SDLJoystick; +class SDLButtonFactory; +class SDLAnalogFactory; -/// Unresisters SDL device factories and shut them down. -void Shutdown(); +class SDLState : public State { +public: + /// Initializes and registers SDL device factories + SDLState(); -/// Needs to be called before SDL_QuitSubSystem. -void CloseSDLJoysticks(); + /// Unresisters SDL device factories and shut them down. + ~SDLState() override; -/// Handle SDL_Events for joysticks from SDL_PollEvent -void HandleGameControllerEvent(const SDL_Event& event); + /// Handle SDL_Events for joysticks from SDL_PollEvent + void HandleGameControllerEvent(const SDL_Event& event); -/// A Loop that calls HandleGameControllerEvent until Shutdown is called -void PollLoop(); + std::shared_ptr GetSDLJoystickBySDLID(SDL_JoystickID sdl_id); + std::shared_ptr GetSDLJoystickByGUID(const std::string& guid, int port); -/// Creates a ParamPackage from an SDL_Event that can directly be used to create a ButtonDevice -Common::ParamPackage SDLEventToButtonParamPackage(const SDL_Event& event); + /// Get all DevicePoller that use the SDL backend for a specific device type + std::vector> GetPollers( + InputCommon::Polling::DeviceType type) override; -namespace Polling { + /// Used by the Pollers during config + std::atomic polling = false; + Common::SPSCQueue event_queue; -/// Get all DevicePoller that use the SDL backend for a specific device type -void GetPollers(InputCommon::Polling::DeviceType type, - std::vector>& pollers); +private: + void InitJoystick(int joystick_index); + void CloseJoystick(SDL_Joystick* sdl_joystick); -} // namespace Polling -} // namespace SDL -} // namespace InputCommon + /// Needs to be called before SDL_QuitSubSystem. + void CloseJoysticks(); + + /// Map of GUID of a list of corresponding virtual Joysticks + std::unordered_map>> joystick_map; + std::mutex joystick_map_mutex; + + std::shared_ptr button_factory; + std::shared_ptr analog_factory; + + bool start_thread = false; + std::atomic initialized = false; + + std::thread poll_thread; +}; +} // namespace InputCommon::SDL -- cgit v1.2.3