1 // Copyright 2010 Dolphin Emulator Project
2 // Licensed under GPLv2+
3 // Refer to the license.txt file included.
4 
5 #include "InputCommon/ControllerInterface/DInput/DInput.h"
6 
7 #include "Common/Logging/Log.h"
8 #include "Common/StringUtil.h"
9 
10 #include "InputCommon/ControllerInterface/ControllerInterface.h"
11 #include "InputCommon/ControllerInterface/DInput/DInputJoystick.h"
12 #include "InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h"
13 
14 #pragma comment(lib, "Dinput8.lib")
15 #pragma comment(lib, "dxguid.lib")
16 
17 namespace ciface::DInput
18 {
DIEnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi,LPVOID pvRef)19 BOOL CALLBACK DIEnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef)
20 {
21   ((std::list<DIDEVICEOBJECTINSTANCE>*)pvRef)->push_back(*lpddoi);
22   return DIENUM_CONTINUE;
23 }
24 
DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi,LPVOID pvRef)25 BOOL CALLBACK DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
26 {
27   ((std::list<DIDEVICEINSTANCE>*)pvRef)->push_back(*lpddi);
28   return DIENUM_CONTINUE;
29 }
30 
GetDeviceName(const LPDIRECTINPUTDEVICE8 device)31 std::string GetDeviceName(const LPDIRECTINPUTDEVICE8 device)
32 {
33   DIPROPSTRING str = {};
34   str.diph.dwSize = sizeof(str);
35   str.diph.dwHeaderSize = sizeof(str.diph);
36   str.diph.dwHow = DIPH_DEVICE;
37 
38   std::string result;
39   if (SUCCEEDED(device->GetProperty(DIPROP_PRODUCTNAME, &str.diph)))
40   {
41     result = StripSpaces(WStringToUTF8(str.wsz));
42   }
43   else
44   {
45     ERROR_LOG(PAD, "GetProperty(DIPROP_PRODUCTNAME) failed.");
46   }
47 
48   return result;
49 }
50 
PopulateDevices(HWND hwnd)51 void PopulateDevices(HWND hwnd)
52 {
53   // Remove unplugged devices.
54   g_controller_interface.RemoveDevice(
55       [](const auto* dev) { return dev->GetSource() == DINPUT_SOURCE_NAME && !dev->IsValid(); });
56 
57   IDirectInput8* idi8;
58   if (FAILED(DirectInput8Create(GetModuleHandle(nullptr), DIRECTINPUT_VERSION, IID_IDirectInput8,
59                                 (LPVOID*)&idi8, nullptr)))
60   {
61     ERROR_LOG(PAD, "DirectInput8Create failed.");
62     return;
63   }
64 
65   InitKeyboardMouse(idi8, hwnd);
66   InitJoystick(idi8, hwnd);
67 
68   idi8->Release();
69 }
70 }  // namespace ciface::DInput
71