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