summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2021-12-09 22:20:55 +0100
committerGitHub <noreply@github.com>2021-12-09 22:20:55 +0100
commite0a61ed9a0e00eec7e1e30b3df1499f90b6dd3b7 (patch)
tree0ac8e4103ced709c92d93db22a2dad850cc0b64f /Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp
parentd5d21c6533ff2709b9cdf357b0569f3418264812 (diff)
parent125971d9f2cbfff81985610a750364a54c3d452d (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.cpp20
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();
}