General code cleanup in input modules. Using ComPtr to manage DirectInput resources.

This commit is contained in:
Brad Hughes 2016-03-18 22:51:06 -04:00
parent 042fe7a2ab
commit cadc351289
8 changed files with 108 additions and 103 deletions

View File

@ -9,10 +9,8 @@
//============================================================ //============================================================
#include "input_module.h" #include "input_module.h"
#include "modules/osdmodule.h"
#include "modules/lib/osdobj_common.h" #include "modules/lib/osdobj_common.h"
#include <mutex>
#include <memory> #include <memory>
// MAME headers // MAME headers
@ -200,7 +198,7 @@ keyboard_trans_table::keyboard_trans_table(std::unique_ptr<key_trans_entry[]> en
m_table_size = size; m_table_size = size;
} }
int keyboard_trans_table::lookup_mame_index(const char *scode) int keyboard_trans_table::lookup_mame_index(const char *scode) const
{ {
for (int i = 0; i < m_table_size; i++) for (int i = 0; i < m_table_size; i++)
{ {
@ -210,7 +208,7 @@ int keyboard_trans_table::lookup_mame_index(const char *scode)
return -1; return -1;
} }
input_item_id keyboard_trans_table::lookup_mame_code(const char *scode) input_item_id keyboard_trans_table::lookup_mame_code(const char *scode) const
{ {
int const index = lookup_mame_index(scode); int const index = lookup_mame_index(scode);
if (index >= 0) if (index >= 0)
@ -222,7 +220,7 @@ input_item_id keyboard_trans_table::lookup_mame_code(const char *scode)
// Windows specific lookup methods // Windows specific lookup methods
#if defined(OSD_WINDOWS) #if defined(OSD_WINDOWS)
input_item_id keyboard_trans_table::map_di_scancode_to_itemid(int scancode) input_item_id keyboard_trans_table::map_di_scancode_to_itemid(int scancode) const
{ {
int tablenum; int tablenum;
@ -239,7 +237,7 @@ input_item_id keyboard_trans_table::map_di_scancode_to_itemid(int scancode)
// wininput_vkey_for_mame_code // wininput_vkey_for_mame_code
//============================================================ //============================================================
int keyboard_trans_table::vkey_for_mame_code(input_code code) int keyboard_trans_table::vkey_for_mame_code(input_code code) const
{ {
// only works for keyboard switches // only works for keyboard switches
if (code.device_class() == DEVICE_CLASS_KEYBOARD && code.item_class() == ITEM_CLASS_SWITCH) if (code.device_class() == DEVICE_CLASS_KEYBOARD && code.item_class() == ITEM_CLASS_SWITCH)

View File

@ -406,12 +406,12 @@ public:
UINT32 size() { return m_table_size; } UINT32 size() { return m_table_size; }
// public methods // public methods
input_item_id lookup_mame_code(const char * scode); input_item_id lookup_mame_code(const char * scode) const;
int lookup_mame_index(const char * scode); int lookup_mame_index(const char * scode) const;
#if defined(OSD_WINDOWS) #if defined(OSD_WINDOWS)
input_item_id map_di_scancode_to_itemid(int di_scancode); input_item_id map_di_scancode_to_itemid(int di_scancode) const;
int vkey_for_mame_code(input_code code); int vkey_for_mame_code(input_code code) const;
#endif #endif
static keyboard_trans_table& instance() static keyboard_trans_table& instance()

View File

@ -15,6 +15,7 @@
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>
#include <wrl\client.h>
// undef WINNT for dinput.h to prevent duplicate definition // undef WINNT for dinput.h to prevent duplicate definition
#undef WINNT #undef WINNT
@ -37,6 +38,8 @@
#include "input_common.h" #include "input_common.h"
#include "input_windows.h" #include "input_windows.h"
using namespace Microsoft::WRL;
#define STRUCTSIZE(x) (m_dinput_version == 0x0300) ? sizeof(x##_DX3) : sizeof(x) #define STRUCTSIZE(x) (m_dinput_version == 0x0300) ? sizeof(x##_DX3) : sizeof(x)
static INT32 dinput_joystick_pov_get_state(void *device_internal, void *item_internal); static INT32 dinput_joystick_pov_get_state(void *device_internal, void *item_internal);
@ -45,7 +48,7 @@ static INT32 dinput_joystick_pov_get_state(void *device_internal, void *item_int
// dinput_set_dword_property // dinput_set_dword_property
//============================================================ //============================================================
static HRESULT dinput_set_dword_property(LPDIRECTINPUTDEVICE device, REFGUID property_guid, DWORD object, DWORD how, DWORD value) static HRESULT dinput_set_dword_property(ComPtr<IDirectInputDevice> device, REFGUID property_guid, DWORD object, DWORD how, DWORD value)
{ {
DIPROPDWORD dipdw; DIPROPDWORD dipdw;
@ -55,7 +58,7 @@ static HRESULT dinput_set_dword_property(LPDIRECTINPUTDEVICE device, REFGUID pro
dipdw.diph.dwHow = how; dipdw.diph.dwHow = how;
dipdw.dwData = value; dipdw.dwData = value;
return IDirectInputDevice_SetProperty(device, property_guid, &dipdw.diph); return IDirectInputDevice_SetProperty(device.Get(), property_guid, &dipdw.diph);
} }
//============================================================ //============================================================
@ -65,8 +68,8 @@ static HRESULT dinput_set_dword_property(LPDIRECTINPUTDEVICE device, REFGUID pro
// DirectInput-specific information about a device // DirectInput-specific information about a device
struct dinput_api_state struct dinput_api_state
{ {
LPDIRECTINPUTDEVICE device; ComPtr<IDirectInputDevice> device;
LPDIRECTINPUTDEVICE2 device2; ComPtr<IDirectInputDevice2> device2;
DIDEVCAPS caps; DIDEVCAPS caps;
LPCDIDATAFORMAT format; LPCDIDATAFORMAT format;
}; };
@ -78,28 +81,37 @@ public:
dinput_device(running_machine &machine, const char *name, input_device_class deviceclass, input_module &module) dinput_device(running_machine &machine, const char *name, input_device_class deviceclass, input_module &module)
: device_info(machine, name, deviceclass, module), : device_info(machine, name, deviceclass, module),
dinput({0}) dinput({nullptr})
{ {
} }
virtual ~dinput_device()
{
if (dinput.device2 != nullptr)
dinput.device2.Reset();
if (dinput.device != nullptr)
dinput.device.Reset();
}
protected: protected:
HRESULT poll_dinput(LPVOID pState) HRESULT poll_dinput(LPVOID pState) const
{ {
HRESULT result; HRESULT result;
// first poll the device, then get the state // first poll the device, then get the state
if (dinput.device2 != NULL) if (dinput.device2 != nullptr)
IDirectInputDevice2_Poll(dinput.device2); IDirectInputDevice2_Poll(dinput.device2.Get());
// GetDeviceState returns the immediate state // GetDeviceState returns the immediate state
result = IDirectInputDevice_GetDeviceState(dinput.device, dinput.format->dwDataSize, pState); result = IDirectInputDevice_GetDeviceState(dinput.device.Get(), dinput.format->dwDataSize, pState);
// handle lost inputs here // handle lost inputs here
if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED)
{ {
result = IDirectInputDevice_Acquire(dinput.device); result = IDirectInputDevice_Acquire(dinput.device.Get());
if (result == DI_OK) if (result == DI_OK)
result = IDirectInputDevice_GetDeviceState(dinput.device, dinput.format->dwDataSize, pState); result = IDirectInputDevice_GetDeviceState(dinput.device.Get(), dinput.format->dwDataSize, pState);
} }
return result; return result;
@ -146,7 +158,7 @@ public:
class dinput_module : public wininput_module class dinput_module : public wininput_module
{ {
private: private:
LPDIRECTINPUT m_dinput; ComPtr<IDirectInput> m_dinput;
int m_dinput_version; int m_dinput_version;
public: public:
@ -163,7 +175,7 @@ public:
#if DIRECTINPUT_VERSION >= 0x800 #if DIRECTINPUT_VERSION >= 0x800
m_dinput_version = DIRECTINPUT_VERSION; m_dinput_version = DIRECTINPUT_VERSION;
result = DirectInput8Create(GetModuleHandleUni(), m_dinput_version, IID_IDirectInput8, (void **)&m_dinput, NULL); result = DirectInput8Create(GetModuleHandleUni(), m_dinput_version, IID_IDirectInput8, reinterpret_cast<void **>(m_dinput.GetAddressOf()), nullptr);
if (result != DI_OK) if (result != DI_OK)
{ {
m_dinput_version = 0; m_dinput_version = 0;
@ -172,17 +184,17 @@ public:
#else #else
// first attempt to initialize DirectInput at the current version // first attempt to initialize DirectInput at the current version
m_dinput_version = DIRECTINPUT_VERSION; m_dinput_version = DIRECTINPUT_VERSION;
result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, &m_dinput, NULL); result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr);
if (result != DI_OK) if (result != DI_OK)
{ {
// if that fails, try version 5 // if that fails, try version 5
m_dinput_version = 0x0500; m_dinput_version = 0x0500;
result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, &m_dinput, NULL); result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr);
if (result != DI_OK) if (result != DI_OK)
{ {
// if that fails, try version 3 // if that fails, try version 3
m_dinput_version = 0x0300; m_dinput_version = 0x0300;
result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, &m_dinput, NULL); result = DirectInputCreate(GetModuleHandleUni(), m_dinput_version, m_dinput.GetAddressOf(), nullptr);
if (result != DI_OK) if (result != DI_OK)
{ {
m_dinput_version = 0; m_dinput_version = 0;
@ -198,6 +210,7 @@ public:
void exit() override void exit() override
{ {
m_dinput.Reset();
wininput_module::exit(); wininput_module::exit();
} }
@ -211,15 +224,17 @@ public:
static BOOL CALLBACK enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) static BOOL CALLBACK enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref)
{ {
return ((dinput_callback_context*)ref)->self->device_enum_callback(instance, ((dinput_callback_context*)ref)->machine); auto context = static_cast<dinput_callback_context*>(ref);
return context->self->device_enum_callback(instance, context->machine);
} }
void input_init(running_machine &machine) override void input_init(running_machine &machine) override
{ {
dinput_callback_context context = { this, &machine }; dinput_callback_context context = { this, &machine };
HRESULT result = IDirectInput_EnumDevices(m_dinput, dinput_devclass(), enum_callback, &context, DIEDFL_ATTACHEDONLY); HRESULT result = IDirectInput_EnumDevices(m_dinput, dinput_devclass(), enum_callback, &context, DIEDFL_ATTACHEDONLY);
if (result != DI_OK) if (result != DI_OK)
fatalerror("DirectInput: Unable to enumerate keyboards (result=%08X)\n", (UINT32)result); fatalerror("DirectInput: Unable to enumerate keyboards (result=%08X)\n", static_cast<UINT32>(result));
} }
protected: protected:
@ -243,55 +258,55 @@ protected:
TDevice* devinfo = devicelist()->create_device<TDevice>(machine, utf8_instance_name.get(), *this); TDevice* devinfo = devicelist()->create_device<TDevice>(machine, utf8_instance_name.get(), *this);
// attempt to create a device // attempt to create a device
result = IDirectInput_CreateDevice(m_dinput, WRAP_REFIID(instance->guidInstance), &devinfo->dinput.device, NULL); result = IDirectInput_CreateDevice(m_dinput, WRAP_REFIID(instance->guidInstance), devinfo->dinput.device.GetAddressOf(), NULL);
if (result != DI_OK) if (result != DI_OK)
goto error; goto error;
// try to get a version 2 device for it // try to get a version 2 device for it
result = IDirectInputDevice_QueryInterface(devinfo->dinput.device, WRAP_REFIID(IID_IDirectInputDevice2), (void **)&devinfo->dinput.device2); result = IDirectInputDevice_QueryInterface(devinfo->dinput.device.Get(), WRAP_REFIID(IID_IDirectInputDevice2), reinterpret_cast<void **>(devinfo->dinput.device2.GetAddressOf()));
if (result != DI_OK) if (result != DI_OK)
devinfo->dinput.device2 = NULL; devinfo->dinput.device2 = nullptr;
// get the caps // get the caps
devinfo->dinput.caps.dwSize = STRUCTSIZE(DIDEVCAPS); devinfo->dinput.caps.dwSize = STRUCTSIZE(DIDEVCAPS);
result = IDirectInputDevice_GetCapabilities(devinfo->dinput.device, &devinfo->dinput.caps); result = IDirectInputDevice_GetCapabilities(devinfo->dinput.device.Get(), &devinfo->dinput.caps);
if (result != DI_OK) if (result != DI_OK)
goto error; goto error;
// attempt to set the data format // attempt to set the data format
devinfo->dinput.format = format1; devinfo->dinput.format = format1;
result = IDirectInputDevice_SetDataFormat(devinfo->dinput.device, devinfo->dinput.format); result = IDirectInputDevice_SetDataFormat(devinfo->dinput.device.Get(), devinfo->dinput.format);
if (result != DI_OK) if (result != DI_OK)
{ {
// use the secondary format if available // use the secondary format if available
if (format2 != NULL) if (format2 != nullptr)
{ {
devinfo->dinput.format = format2; devinfo->dinput.format = format2;
result = IDirectInputDevice_SetDataFormat(devinfo->dinput.device, devinfo->dinput.format); result = IDirectInputDevice_SetDataFormat(devinfo->dinput.device.Get(), devinfo->dinput.format);
} }
if (result != DI_OK) if (result != DI_OK)
goto error; goto error;
} }
// set the cooperative level // set the cooperative level
result = IDirectInputDevice_SetCooperativeLevel(devinfo->dinput.device, win_window_list->m_hwnd, cooperative_level); result = IDirectInputDevice_SetCooperativeLevel(devinfo->dinput.device.Get(), win_window_list->m_hwnd, cooperative_level);
if (result != DI_OK) if (result != DI_OK)
goto error; goto error;
return devinfo; return devinfo;
error: error:
devicelist()->free_device(devinfo); devicelist()->free_device(devinfo);
return NULL; return nullptr;
} }
std::string device_item_name(dinput_device * devinfo, int offset, const char * defstring, const TCHAR * suffix) std::string device_item_name(dinput_device * devinfo, int offset, const char * defstring, const TCHAR * suffix) const
{ {
DIDEVICEOBJECTINSTANCE instance = { 0 }; DIDEVICEOBJECTINSTANCE instance = { 0 };
HRESULT result; HRESULT result;
// query the key name // query the key name
instance.dwSize = STRUCTSIZE(DIDEVICEOBJECTINSTANCE); instance.dwSize = STRUCTSIZE(DIDEVICEOBJECTINSTANCE);
result = IDirectInputDevice_GetObjectInfo(devinfo->dinput.device, &instance, offset, DIPH_BYOFFSET); result = IDirectInputDevice_GetObjectInfo(devinfo->dinput.device.Get(), &instance, offset, DIPH_BYOFFSET);
// if we got an error and have no default string, just return NULL // if we got an error and have no default string, just return NULL
if (result != DI_OK) if (result != DI_OK)
@ -348,13 +363,13 @@ public:
BOOL device_enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) override BOOL device_enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) override
{ {
running_machine &machine = *(running_machine *)ref; running_machine &machine = *static_cast<running_machine *>(ref);
dinput_keyboard_device *devinfo; dinput_keyboard_device *devinfo;
int keynum; int keynum;
// allocate and link in a new device // allocate and link in a new device
devinfo = create_dinput_device<dinput_keyboard_device>(machine, instance, &c_dfDIKeyboard, NULL, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); devinfo = create_dinput_device<dinput_keyboard_device>(machine, instance, &c_dfDIKeyboard, nullptr, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if (devinfo == NULL) if (devinfo == nullptr)
goto exit; goto exit;
// populate it // populate it
@ -366,7 +381,7 @@ public:
// generate/fetch the name // generate/fetch the name
snprintf(defname, ARRAY_LENGTH(defname), "Scan%03d", keynum); snprintf(defname, ARRAY_LENGTH(defname), "Scan%03d", keynum);
name = device_item_name(devinfo, keynum, defname, NULL); name = device_item_name(devinfo, keynum, defname, nullptr);
// add the item to the device // add the item to the device
devinfo->device()->add_item(name.c_str(), itemid, generic_button_get_state, &devinfo->keyboard.state[keynum]); devinfo->device()->add_item(name.c_str(), itemid, generic_button_get_state, &devinfo->keyboard.state[keynum]);
@ -424,14 +439,14 @@ public:
BOOL device_enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) override BOOL device_enum_callback(LPCDIDEVICEINSTANCE instance, LPVOID ref) override
{ {
dinput_mouse_device *devinfo = NULL; dinput_mouse_device *devinfo = nullptr;
running_machine &machine = *(running_machine *)ref; running_machine &machine = *static_cast<running_machine *>(ref);
int axisnum, butnum; int axisnum, butnum;
HRESULT result; HRESULT result;
// allocate and link in a new device // allocate and link in a new device
devinfo = create_dinput_device<dinput_mouse_device>(machine, instance, &c_dfDIMouse2, &c_dfDIMouse, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); devinfo = create_dinput_device<dinput_mouse_device>(machine, instance, &c_dfDIMouse2, &c_dfDIMouse, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if (devinfo == NULL) if (devinfo == nullptr)
goto exit; goto exit;
// set relative mode on the mouse device // set relative mode on the mouse device
@ -450,25 +465,25 @@ public:
for (axisnum = 0; axisnum < devinfo->dinput.caps.dwAxes; axisnum++) for (axisnum = 0; axisnum < devinfo->dinput.caps.dwAxes; axisnum++)
{ {
// add to the mouse device and optionally to the gun device as well // add to the mouse device and optionally to the gun device as well
std::string name = device_item_name(devinfo, offsetof(DIMOUSESTATE, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], NULL); std::string name = device_item_name(devinfo, offsetof(DIMOUSESTATE, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], nullptr);
devinfo->device()->add_item(name.c_str(), (input_item_id)(ITEM_ID_XAXIS + axisnum), generic_axis_get_state, &devinfo->mouse.lX + axisnum); devinfo->device()->add_item(name.c_str(), static_cast<input_item_id>(ITEM_ID_XAXIS + axisnum), generic_axis_get_state, &devinfo->mouse.lX + axisnum);
} }
// populate the buttons // populate the buttons
for (butnum = 0; butnum < devinfo->dinput.caps.dwButtons; butnum++) for (butnum = 0; butnum < devinfo->dinput.caps.dwButtons; butnum++)
{ {
FPTR offset = (FPTR)(&((DIMOUSESTATE *)NULL)->rgbButtons[butnum]); FPTR offset = reinterpret_cast<FPTR>(&static_cast<DIMOUSESTATE *>(nullptr)->rgbButtons[butnum]);
// add to the mouse device // add to the mouse device
std::string name = device_item_name(devinfo, offset, default_button_name(butnum), NULL); std::string name = device_item_name(devinfo, offset, default_button_name(butnum), nullptr);
devinfo->device()->add_item(name.c_str(), (input_item_id)(ITEM_ID_BUTTON1 + butnum), generic_button_get_state, &devinfo->mouse.rgbButtons[butnum]); devinfo->device()->add_item(name.c_str(), static_cast<input_item_id>(ITEM_ID_BUTTON1 + butnum), generic_button_get_state, &devinfo->mouse.rgbButtons[butnum]);
} }
exit: exit:
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
error: error:
if (devinfo != NULL) if (devinfo != nullptr)
devicelist()->free_device(devinfo); devicelist()->free_device(devinfo);
goto exit; goto exit;
} }
@ -503,7 +518,8 @@ public:
int axisnum; int axisnum;
// poll the device first // poll the device first
dinput_device::poll_dinput(&joystick.state); if (dinput_device::poll_dinput(&joystick.state) != ERROR_SUCCESS)
return;
// normalize axis values // normalize axis values
for (axisnum = 0; axisnum < 8; axisnum++) for (axisnum = 0; axisnum < 8; axisnum++)
@ -535,16 +551,16 @@ public:
{ {
DWORD cooperative_level = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE; DWORD cooperative_level = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE;
int axisnum, axiscount, povnum, butnum; int axisnum, axiscount, povnum, butnum;
running_machine &machine = *(running_machine *)ref; running_machine &machine = *static_cast<running_machine *>(ref);
dinput_joystick_device *devinfo; dinput_joystick_device *devinfo;
HRESULT result; HRESULT result;
if (win_window_list != NULL && win_window_list->win_has_menu()) { if (win_window_list != nullptr && win_window_list->win_has_menu()) {
cooperative_level = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE; cooperative_level = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE;
} }
// allocate and link in a new device // allocate and link in a new device
devinfo = create_dinput_device<dinput_joystick_device>(machine, instance, &c_dfDIJoystick, NULL, cooperative_level); devinfo = create_dinput_device<dinput_joystick_device>(machine, instance, &c_dfDIJoystick, nullptr, cooperative_level);
if (devinfo == NULL) if (devinfo == nullptr)
goto exit; goto exit;
// set absolute mode // set absolute mode
@ -578,7 +594,7 @@ public:
dipr.diph.dwHeaderSize = sizeof(dipr.diph); dipr.diph.dwHeaderSize = sizeof(dipr.diph);
dipr.diph.dwObj = offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG); dipr.diph.dwObj = offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG);
dipr.diph.dwHow = DIPH_BYOFFSET; dipr.diph.dwHow = DIPH_BYOFFSET;
result = IDirectInputDevice_GetProperty(devinfo->dinput.device, DIPROP_RANGE, &dipr.diph); result = IDirectInputDevice_GetProperty(devinfo->dinput.device.Get(), DIPROP_RANGE, &dipr.diph);
if (result != DI_OK) if (result != DI_OK)
continue; continue;
@ -586,8 +602,8 @@ public:
devinfo->joystick.rangemax[axisnum] = dipr.lMax; devinfo->joystick.rangemax[axisnum] = dipr.lMax;
// populate the item description as well // populate the item description as well
name = device_item_name(devinfo, offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], NULL); name = device_item_name(devinfo, offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], nullptr);
devinfo->device()->add_item(name.c_str(), (input_item_id)(ITEM_ID_XAXIS + axisnum), generic_axis_get_state, &devinfo->joystick.state.lX + axisnum); devinfo->device()->add_item(name.c_str(), static_cast<input_item_id>(ITEM_ID_XAXIS + axisnum), generic_axis_get_state, &devinfo->joystick.state.lX + axisnum);
axiscount++; axiscount++;
} }
@ -599,33 +615,33 @@ public:
// left // left
name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("L")); name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("L"));
devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, (void *)(FPTR)(povnum * 4 + POVDIR_LEFT)); devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, reinterpret_cast<void *>(static_cast<FPTR>(povnum * 4 + POVDIR_LEFT)));
// right // right
name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("R")); name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("R"));
devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, (void *)(FPTR)(povnum * 4 + POVDIR_RIGHT)); devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, reinterpret_cast<void *>(static_cast<FPTR>(povnum * 4 + POVDIR_RIGHT)));
// up // up
name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("U")); name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("U"));
devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, (void *)(FPTR)(povnum * 4 + POVDIR_UP)); devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, reinterpret_cast<void *>(static_cast<FPTR>(povnum * 4 + POVDIR_UP)));
// down // down
name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("D")); name = device_item_name(devinfo, offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), TEXT("D"));
devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, (void *)(FPTR)(povnum * 4 + POVDIR_DOWN)); devinfo->device()->add_item(name.c_str(), ITEM_ID_OTHER_SWITCH, dinput_joystick_pov_get_state, reinterpret_cast<void *>(static_cast<FPTR>(povnum * 4 + POVDIR_DOWN)));
} }
// populate the buttons // populate the buttons
for (butnum = 0; butnum < devinfo->dinput.caps.dwButtons; butnum++) for (butnum = 0; butnum < devinfo->dinput.caps.dwButtons; butnum++)
{ {
FPTR offset = (FPTR)(&((DIJOYSTATE2 *)NULL)->rgbButtons[butnum]); FPTR offset = reinterpret_cast<FPTR>(&static_cast<DIJOYSTATE2 *>(nullptr)->rgbButtons[butnum]);
std::string name = device_item_name(devinfo, offset, default_button_name(butnum), NULL); std::string name = device_item_name(devinfo, offset, default_button_name(butnum), nullptr);
input_item_id itemid; input_item_id itemid;
if (butnum < INPUT_MAX_BUTTONS) if (butnum < INPUT_MAX_BUTTONS)
itemid = (input_item_id)(ITEM_ID_BUTTON1 + butnum); itemid = static_cast<input_item_id>(ITEM_ID_BUTTON1 + butnum);
else if (butnum < INPUT_MAX_BUTTONS + INPUT_MAX_ADD_SWITCH) else if (butnum < INPUT_MAX_BUTTONS + INPUT_MAX_ADD_SWITCH)
itemid = (input_item_id)(ITEM_ID_ADD_SWITCH1 - INPUT_MAX_BUTTONS + butnum); itemid = static_cast<input_item_id>(ITEM_ID_ADD_SWITCH1 - INPUT_MAX_BUTTONS + butnum);
else else
itemid = ITEM_ID_OTHER_SWITCH; itemid = ITEM_ID_OTHER_SWITCH;
@ -643,9 +659,9 @@ public:
static INT32 dinput_joystick_pov_get_state(void *device_internal, void *item_internal) static INT32 dinput_joystick_pov_get_state(void *device_internal, void *item_internal)
{ {
dinput_joystick_device *devinfo = (dinput_joystick_device *)device_internal; dinput_joystick_device *devinfo = static_cast<dinput_joystick_device *>(device_internal);
int povnum = (FPTR)item_internal / 4; int povnum = reinterpret_cast<FPTR>(item_internal) / 4;
int povdir = (FPTR)item_internal % 4; int povdir = reinterpret_cast<FPTR>(item_internal) % 4;
INT32 result = 0; INT32 result = 0;
DWORD pov; DWORD pov;

View File

@ -14,17 +14,11 @@
// standard windows headers // standard windows headers
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <winioctl.h>
#include <tchar.h>
#undef interface #undef interface
#include <mutex>
// MAME headers // MAME headers
#include "emu.h" #include "emu.h"
#include "osdepend.h" #include "osdepend.h"
#include "ui/ui.h"
#include "strconv.h"
// MAMEOS headers // MAMEOS headers
#include "winmain.h" #include "winmain.h"
@ -101,13 +95,13 @@ public:
if (!input_enabled()) if (!input_enabled())
return FALSE; return FALSE;
KeyPressEventArgs *args = nullptr; KeyPressEventArgs *args;
switch (eventid) switch (eventid)
{ {
case INPUT_EVENT_KEYDOWN: case INPUT_EVENT_KEYDOWN:
case INPUT_EVENT_KEYUP: case INPUT_EVENT_KEYUP:
args = (KeyPressEventArgs*)eventdata; args = static_cast<KeyPressEventArgs*>(eventdata);
for (int i = 0; i < devicelist()->size(); i++) for (int i = 0; i < devicelist()->size(); i++)
downcast<win32_keyboard_device*>(devicelist()->at(i))->queue_events(args, 1); downcast<win32_keyboard_device*>(devicelist()->at(i))->queue_events(args, 1);

View File

@ -7,30 +7,20 @@
//============================================================ //============================================================
#include "input_module.h" #include "input_module.h"
#include "modules/osdmodule.h"
#if defined(OSD_WINDOWS) #if defined(OSD_WINDOWS)
// standard windows headers
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winioctl.h>
#include <tchar.h>
#undef interface
// MAME headers // MAME headers
#include "emu.h" #include "emu.h"
#include "osdepend.h" #include "osdepend.h"
#include "ui/ui.h"
// MAMEOS headers // MAMEOS headers
#include "winmain.h" #include "winmain.h"
#include "window.h"
#include "input_common.h" #include "input_common.h"
#include "input_windows.h" #include "input_windows.h"
bool windows_osd_interface::should_hide_mouse() bool windows_osd_interface::should_hide_mouse() const
{ {
bool hidemouse = false; bool hidemouse = false;
hidemouse |= downcast<wininput_module*>(m_keyboard_input)->should_hide_mouse(); hidemouse |= downcast<wininput_module*>(m_keyboard_input)->should_hide_mouse();
@ -40,7 +30,7 @@ bool windows_osd_interface::should_hide_mouse()
return hidemouse; return hidemouse;
} }
bool windows_osd_interface::handle_input_event(input_event eventid, void* eventdata) bool windows_osd_interface::handle_input_event(input_event eventid, void* eventdata) const
{ {
bool handled = false; bool handled = false;
handled |= downcast<wininput_module*>(m_keyboard_input)->handle_input_event(eventid, eventdata); handled |= downcast<wininput_module*>(m_keyboard_input)->handle_input_event(eventid, eventdata);
@ -50,7 +40,7 @@ bool windows_osd_interface::handle_input_event(input_event eventid, void* eventd
return handled; return handled;
} }
void windows_osd_interface::poll_input(running_machine &machine) void windows_osd_interface::poll_input(running_machine &machine) const
{ {
m_keyboard_input->poll_if_necessary(machine); m_keyboard_input->poll_if_necessary(machine);
m_mouse_input->poll_if_necessary(machine); m_mouse_input->poll_if_necessary(machine);
@ -68,7 +58,7 @@ void windows_osd_interface::customize_input_type_list(simple_list<input_type_ent
const char* uimode; const char* uimode;
// loop over the defaults // loop over the defaults
for (entry = typelist.first(); entry != NULL; entry = entry->next()) for (entry = typelist.first(); entry != nullptr; entry = entry->next())
switch (entry->type()) switch (entry->type())
{ {
// disable the config menu if the ALT key is down // disable the config menu if the ALT key is down

View File

@ -9,6 +9,13 @@
#ifndef INPUT_WIN_H_ #ifndef INPUT_WIN_H_
#define INPUT_WIN_H_ #define INPUT_WIN_H_
// standard windows headers
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef interface
#include "window.h"
//============================================================ //============================================================
// TYPEDEFS // TYPEDEFS
//============================================================ //============================================================

View File

@ -297,13 +297,13 @@ protected:
continue; continue;
// Add the axes // Add the axes
for (int i = 0; i < XINPUT_MAX_AXIS; i++) for (int axisnum = 0; axisnum < XINPUT_MAX_AXIS; axisnum++)
{ {
devinfo->device()->add_item( devinfo->device()->add_item(
xinput_axis_name[i], xinput_axis_name[axisnum],
xinput_axis_ids[i], xinput_axis_ids[axisnum],
generic_axis_get_state, generic_axis_get_state,
&devinfo->gamepad.sThumbLX + i); &devinfo->gamepad.sThumbLX + axisnum);
} }
// Populate the POVs // Populate the POVs

View File

@ -288,9 +288,9 @@ public:
void extract_video_config(); void extract_video_config();
// windows osd specific // windows osd specific
bool handle_input_event(input_event eventid, void *eventdata); bool handle_input_event(input_event eventid, void *eventdata) const;
bool should_hide_mouse(); bool should_hide_mouse() const;
void poll_input(running_machine &machine); void poll_input(running_machine &machine) const;
windows_options &options() { return m_options; } windows_options &options() { return m_options; }