forked from dolphin-emu/dolphin
		
	The SDL backend crashes when you close a joystick after SDL_Quit has been called. Some backends don't need to be shutdown and re-initialized everytime, we can just ask to enumerate devices again.
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2010 Dolphin Emulator Project
 | 
						|
// Licensed under GPLv2+
 | 
						|
// Refer to the license.txt file included.
 | 
						|
 | 
						|
#include "InputCommon/ControllerInterface/DInput/DInput.h"
 | 
						|
#include "Common/StringUtil.h"
 | 
						|
#include "InputCommon/ControllerInterface/ControllerInterface.h"
 | 
						|
 | 
						|
#include "InputCommon/ControllerInterface/DInput/DInputJoystick.h"
 | 
						|
#include "InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h"
 | 
						|
 | 
						|
#pragma comment(lib, "Dinput8.lib")
 | 
						|
#pragma comment(lib, "dxguid.lib")
 | 
						|
 | 
						|
namespace ciface
 | 
						|
{
 | 
						|
namespace DInput
 | 
						|
{
 | 
						|
BOOL CALLBACK DIEnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef)
 | 
						|
{
 | 
						|
  ((std::list<DIDEVICEOBJECTINSTANCE>*)pvRef)->push_back(*lpddoi);
 | 
						|
  return DIENUM_CONTINUE;
 | 
						|
}
 | 
						|
 | 
						|
BOOL CALLBACK DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
 | 
						|
{
 | 
						|
  ((std::list<DIDEVICEINSTANCE>*)pvRef)->push_back(*lpddi);
 | 
						|
  return DIENUM_CONTINUE;
 | 
						|
}
 | 
						|
 | 
						|
std::string GetDeviceName(const LPDIRECTINPUTDEVICE8 device)
 | 
						|
{
 | 
						|
  DIPROPSTRING str = {};
 | 
						|
  str.diph.dwSize = sizeof(str);
 | 
						|
  str.diph.dwHeaderSize = sizeof(str.diph);
 | 
						|
  str.diph.dwHow = DIPH_DEVICE;
 | 
						|
 | 
						|
  std::string result;
 | 
						|
  if (SUCCEEDED(device->GetProperty(DIPROP_PRODUCTNAME, &str.diph)))
 | 
						|
  {
 | 
						|
    result = StripSpaces(UTF16ToUTF8(str.wsz));
 | 
						|
  }
 | 
						|
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
void PopulateDevices(HWND hwnd)
 | 
						|
{
 | 
						|
  IDirectInput8* idi8;
 | 
						|
  if (FAILED(DirectInput8Create(GetModuleHandle(nullptr), DIRECTINPUT_VERSION, IID_IDirectInput8,
 | 
						|
                                (LPVOID*)&idi8, nullptr)))
 | 
						|
  {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  InitKeyboardMouse(idi8, hwnd);
 | 
						|
  InitJoystick(idi8, hwnd);
 | 
						|
 | 
						|
  idi8->Release();
 | 
						|
}
 | 
						|
}
 | 
						|
}
 |