diff options
| author | JosJuice <josjuice@gmail.com> | 2021-12-09 22:20:55 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-09 22:20:55 +0100 |
| commit | e0a61ed9a0e00eec7e1e30b3df1499f90b6dd3b7 (patch) | |
| tree | 0ac8e4103ced709c92d93db22a2dad850cc0b64f /Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp | |
| parent | d5d21c6533ff2709b9cdf357b0569f3418264812 (diff) | |
| parent | 125971d9f2cbfff81985610a750364a54c3d452d (diff) | |
Merge pull request #10248 from Filoppi/fix_input_config_default_device_load
Fix default input config default device not being loaded/found
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp')
| -rw-r--r-- | Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp b/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp index f1066cfa3c..21ee1fa425 100644 --- a/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp @@ -7,9 +7,9 @@ #include <array> #include <future> +#include <mutex> #include <thread> -#include "Common/Event.h" #include "Common/Flag.h" #include "Common/Logging/Log.h" #include "Common/ScopeGuard.h" @@ -19,12 +19,12 @@ constexpr UINT WM_DOLPHIN_STOP = WM_USER; -static Common::Event s_received_device_change_event; // Dolphin's render window static HWND s_hwnd; // Windows messaging window (hidden) static HWND s_message_window; static std::thread s_thread; +static std::mutex s_populate_mutex; static Common::Flag s_first_populate_devices_asked; static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) @@ -35,7 +35,7 @@ static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARA // listen for it. if (s_first_populate_devices_asked.IsSet()) { - s_received_device_change_event.Set(); + std::lock_guard lk_population(s_populate_mutex); // TODO: we could easily use the message passed alongside this event, which tells // whether a device was added or removed, to avoid removing old, still connected, devices g_controller_interface.PlatformPopulateDevices([] { @@ -135,14 +135,12 @@ void ciface::Win32::PopulateDevices(void* hwnd) if (s_thread.joinable()) { s_hwnd = static_cast<HWND>(hwnd); + // To avoid blocking this thread until the async population has finished, directly do it here + // (we need the DInput Keyboard and Mouse "default" device to always be added without any wait). + std::lock_guard lk_population(s_populate_mutex); s_first_populate_devices_asked.Set(); - s_received_device_change_event.Reset(); - // Do this forced devices refresh in the messaging thread so it won't cause any race conditions - PostMessage(s_message_window, WM_INPUT_DEVICE_CHANGE, 0, 0); - std::thread([] { - if (!s_received_device_change_event.WaitFor(std::chrono::seconds(5))) - ERROR_LOG_FMT(CONTROLLERINTERFACE, "win32 timed out when trying to populate devices"); - }).detach(); + ciface::DInput::PopulateDevices(s_hwnd); + ciface::XInput::PopulateDevices(); } else { @@ -156,6 +154,7 @@ void ciface::Win32::ChangeWindow(void* hwnd) if (s_thread.joinable()) // "Has init?" { s_hwnd = static_cast<HWND>(hwnd); + std::lock_guard lk_population(s_populate_mutex); ciface::DInput::ChangeWindow(s_hwnd); } } @@ -168,7 +167,6 @@ void ciface::Win32::DeInit() PostMessage(s_message_window, WM_DOLPHIN_STOP, 0, 0); s_thread.join(); s_message_window = nullptr; - s_received_device_change_event.Reset(); s_first_populate_devices_asked.Clear(); DInput::DeInit(); } |
