diff options
| author | 2023-01-29 03:02:02 +1100 | |
|---|---|---|
| committer | 2023-01-29 03:16:14 +1100 | |
| commit | 68472d3d72ea4bbc545c0669348172b4e96c7b41 (patch) | |
| tree | e34fca0f55c977624148d1c806ecc6c44a5edd11 /src/osd/modules/input/input_rawinput.cpp | |
| parent | 01fcb2e0decf670a4cdee3d37b6f7ebde9b8f02b (diff) | |
Various input and OSD refactoring:
osd: Supply OSD object to modules on initialisation. Encapsulated some
event handling in the OSD objects rather than leaving it in free
functions. Put various stuff in namespaces.
osd/modules/input: Enabled dinput, xinput and winhybrid modules for
Windows SDL builds, and enabled background input for dinput and xinput
(and by extension winhybrid) modules. Also fixed some COM and X11
resource leaks.
osd/modules/input/input_sdl.cpp: Flipped SDL mouse button order to match
Windows, and exposed vertical and horizontal scroll as Z and rZ axes.
Moved SDL UI event handling out of input devices into OSD object.
osd/modules/input_rawinput.cpp: Changed lightgun Z axis token so it's
correctly identified as a relative axis (it maps to the scroll wheel
equivalent).
osd: Added an option to choose the network provider module. Mostly
useful if you build with both TUN/TAP and pcap support included, or if
you want to disable emulated networking completely.
emu/input.cpp: Use a better strategy for assembling input code names
that uses fewer temporary strings and doesn't require use of the
non-Unicode-aware space trimming function (fixes MT08552).
osd/modules/input_dinput.cpp: Improved polling logic.
osd: Made various parts of the input code less dependent on concrete emu
objects, and reduced inappropriately passing around the machine object.
Made input modules less dependent on OSD implementation. Encapsulated
some stuff and got rid of some vestigial newui and SDL1 support code.
Cleaned up some interfaces. Moved OSD options classes to their own
files.
Prepare to remove main.h from emu.h - it's mostly used to get the
application name, which the vast majority of emulated devices don't need
to do.
Diffstat (limited to 'src/osd/modules/input/input_rawinput.cpp')
| -rw-r--r-- | src/osd/modules/input/input_rawinput.cpp | 431 |
1 files changed, 232 insertions, 199 deletions
diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index c681017a061..804f4ae53cd 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -10,18 +10,21 @@ #if defined(OSD_WINDOWS) -// MAME headers -#include "emu.h" - #include "input_windows.h" +#include "input_wincommon.h" + #include "winmain.h" #include "window.h" #include "modules/lib/osdlib.h" #include "strconv.h" +// MAME headers +#include "emu.h" + #include <algorithm> +#include <cassert> #include <functional> #include <mutex> #include <new> @@ -31,6 +34,8 @@ #include <tchar.h> +namespace osd { + namespace { class safe_regkey @@ -222,6 +227,7 @@ std::wstring improve_name_from_usb_path(const std::wstring ®path) return trim_prefix(regstring); } + //============================================================ // rawinput_device_improve_name //============================================================ @@ -262,19 +268,36 @@ std::wstring rawinput_device_improve_name(const std::wstring &name) class rawinput_device : public event_based_device<RAWINPUT> { -private: - HANDLE m_handle = nullptr; - public: - rawinput_device(running_machine &machine, std::string &&name, std::string &&id, input_device_class deviceclass, input_module &module) : - event_based_device(machine, std::move(name), std::move(id), deviceclass, module) + rawinput_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : + event_based_device(std::move(name), std::move(id), module), + m_handle(handle) { } HANDLE device_handle() const { return m_handle; } - void set_handle(HANDLE handle) { m_handle = handle; } + + bool reconnect_candidate(std::string_view i) const { return !m_handle && (id() == i); } + + void detach_device() + { + assert(m_handle); + m_handle = nullptr; + osd_printf_verbose("RawInput: %s [ID %s] disconnected\n", name(), id()); + } + + void attach_device(HANDLE handle) + { + assert(!m_handle); + m_handle = handle; + osd_printf_verbose("RawInput: %s [ID %s] reconnected\n", name(), id()); + } + +private: + HANDLE m_handle; }; + //============================================================ // rawinput_keyboard_device //============================================================ @@ -282,20 +305,18 @@ public: class rawinput_keyboard_device : public rawinput_device { public: - keyboard_state keyboard; - - rawinput_keyboard_device(running_machine &machine, std::string &&name, std::string &&id, input_module &module) : - rawinput_device(machine, std::move(name), std::move(id), DEVICE_CLASS_KEYBOARD, module), - keyboard({ { 0 } }) + rawinput_keyboard_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : + rawinput_device(std::move(name), std::move(id), module, handle), + m_keyboard({ { 0 } }) { } - void reset() override + virtual void reset() override { - memset(&keyboard, 0, sizeof(keyboard)); + memset(&m_keyboard, 0, sizeof(m_keyboard)); } - void process_event(RAWINPUT &rawinput) override + virtual void process_event(RAWINPUT const &rawinput) override { // determine the full DIK-compatible scancode uint8_t scancode = (rawinput.data.keyboard.MakeCode & 0x7f) | ((rawinput.data.keyboard.Flags & RI_KEY_E0) ? 0x80 : 0x00); @@ -305,149 +326,231 @@ public: return; // set or clear the key - keyboard.state[scancode] = (rawinput.data.keyboard.Flags & RI_KEY_BREAK) ? 0x00 : 0x80; + m_keyboard.state[scancode] = (rawinput.data.keyboard.Flags & RI_KEY_BREAK) ? 0x00 : 0x80; } + + virtual void configure(input_device &device) override + { + keyboard_trans_table const &table = keyboard_trans_table::instance(); + + for (int keynum = 0; keynum < MAX_KEYS; keynum++) + { + input_item_id itemid = table.map_di_scancode_to_itemid(keynum); + WCHAR keyname[100]; + + // generate the name + if (GetKeyNameTextW(((keynum & 0x7f) << 16) | ((keynum & 0x80) << 17), keyname, std::size(keyname)) == 0) + _snwprintf(keyname, std::size(keyname), L"Scan%03d", keynum); + std::string name = text::from_wstring(keyname); + + // add the item to the device + device.add_item( + name, + itemid, + generic_button_get_state<std::uint8_t>, + &m_keyboard.state[keynum]); + } + } + +private: + keyboard_state m_keyboard; }; + //============================================================ // rawinput_mouse_device //============================================================ class rawinput_mouse_device : public rawinput_device { -private: - std::mutex m_device_lock; public: - mouse_state mouse; - - rawinput_mouse_device(running_machine &machine, std::string &&name, std::string &&id, input_module &module) : - rawinput_device(machine, std::move(name), std::move(id), DEVICE_CLASS_MOUSE, module), - mouse({0}) + rawinput_mouse_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : + rawinput_device(std::move(name), std::move(id), module, handle), + m_mouse({0}) { } - void poll() override + virtual void poll() override { - mouse.lX = 0; - mouse.lY = 0; - mouse.lZ = 0; + m_mouse.lX = 0; + m_mouse.lY = 0; + m_mouse.lZ = 0; rawinput_device::poll(); } - void reset() override + virtual void reset() override { - memset(&mouse, 0, sizeof(mouse)); + memset(&m_mouse, 0, sizeof(m_mouse)); } - void process_event(RAWINPUT &rawinput) override + virtual void configure(input_device &device) override + { + // populate the axes + for (int axisnum = 0; axisnum < 3; axisnum++) + { + device.add_item( + default_axis_name[axisnum], + input_item_id(ITEM_ID_XAXIS + axisnum), + generic_axis_get_state<LONG>, + &m_mouse.lX + axisnum); + } + + // populate the buttons + for (int butnum = 0; butnum < 5; butnum++) + { + device.add_item( + default_button_name(butnum), + input_item_id(ITEM_ID_BUTTON1 + butnum), + generic_button_get_state<BYTE>, + &m_mouse.rgbButtons[butnum]); + } + } + + virtual void process_event(RAWINPUT const &rawinput) override { // If this data was intended for a rawinput mouse if (rawinput.data.mouse.usFlags == MOUSE_MOVE_RELATIVE) { - mouse.lX += rawinput.data.mouse.lLastX * osd::INPUT_RELATIVE_PER_PIXEL; - mouse.lY += rawinput.data.mouse.lLastY * osd::INPUT_RELATIVE_PER_PIXEL; + m_mouse.lX += rawinput.data.mouse.lLastX * INPUT_RELATIVE_PER_PIXEL; + m_mouse.lY += rawinput.data.mouse.lLastY * INPUT_RELATIVE_PER_PIXEL; // update zaxis if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - mouse.lZ += static_cast<int16_t>(rawinput.data.mouse.usButtonData) * osd::INPUT_RELATIVE_PER_PIXEL; + m_mouse.lZ += int16_t(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) mouse.rgbButtons[0] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) mouse.rgbButtons[0] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) mouse.rgbButtons[1] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) mouse.rgbButtons[1] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) mouse.rgbButtons[2] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) mouse.rgbButtons[2] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) mouse.rgbButtons[3] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) mouse.rgbButtons[3] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) mouse.rgbButtons[4] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) mouse.rgbButtons[4] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_mouse.rgbButtons[0] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) m_mouse.rgbButtons[0] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) m_mouse.rgbButtons[1] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) m_mouse.rgbButtons[1] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) m_mouse.rgbButtons[2] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) m_mouse.rgbButtons[2] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) m_mouse.rgbButtons[3] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) m_mouse.rgbButtons[3] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) m_mouse.rgbButtons[4] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) m_mouse.rgbButtons[4] = 0x00; } } + +private: + mouse_state m_mouse; }; + //============================================================ // rawinput_lightgun_device //============================================================ class rawinput_lightgun_device : public rawinput_device { -private: - std::mutex m_device_lock; public: - mouse_state lightgun; - - rawinput_lightgun_device(running_machine &machine, std::string &&name, std::string &&id, input_module &module) : - rawinput_device(machine, std::move(name), std::move(id), DEVICE_CLASS_LIGHTGUN, module), - lightgun({0}) + rawinput_lightgun_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : + rawinput_device(std::move(name), std::move(id), module, handle), + m_lightgun({0}) { } - void poll() override + virtual void poll() override { - lightgun.lZ = 0; + m_lightgun.lZ = 0; rawinput_device::poll(); } - void reset() override + virtual void reset() override { - memset(&lightgun, 0, sizeof(lightgun)); + memset(&m_lightgun, 0, sizeof(m_lightgun)); } - void process_event(RAWINPUT &rawinput) override + virtual void configure(input_device &device) override + { + // populate the axes + for (int axisnum = 0; axisnum < 2; axisnum++) + { + device.add_item( + default_axis_name[axisnum], + input_item_id(ITEM_ID_XAXIS + axisnum), + generic_axis_get_state<LONG>, + &m_lightgun.lX + axisnum); + } + + // scroll wheel is always relative if present + device.add_item( + default_axis_name[2], + ITEM_ID_ADD_RELATIVE1, + generic_axis_get_state<LONG>, + &m_lightgun.lZ); + + // populate the buttons + for (int butnum = 0; butnum < 5; butnum++) + { + device.add_item( + default_button_name(butnum), + input_item_id(ITEM_ID_BUTTON1 + butnum), + generic_button_get_state<BYTE>, + &m_lightgun.rgbButtons[butnum]); + } + } + + virtual void process_event(RAWINPUT const &rawinput) override { // If this data was intended for a rawinput lightgun if (rawinput.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) { // update the X/Y positions - lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, osd::INPUT_ABSOLUTE_MAX); - lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, osd::INPUT_ABSOLUTE_MAX); + m_lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, INPUT_ABSOLUTE_MAX); + m_lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, INPUT_ABSOLUTE_MAX); // update zaxis if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - lightgun.lZ += static_cast<int16_t>(rawinput.data.mouse.usButtonData) * osd::INPUT_RELATIVE_PER_PIXEL; + m_lightgun.lZ += int16_t(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) lightgun.rgbButtons[0] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) lightgun.rgbButtons[0] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) lightgun.rgbButtons[1] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) lightgun.rgbButtons[1] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) lightgun.rgbButtons[2] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) lightgun.rgbButtons[2] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) lightgun.rgbButtons[3] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) lightgun.rgbButtons[3] = 0x00; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) lightgun.rgbButtons[4] = 0x80; - if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) lightgun.rgbButtons[4] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_lightgun.rgbButtons[0] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) m_lightgun.rgbButtons[0] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) m_lightgun.rgbButtons[1] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) m_lightgun.rgbButtons[1] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) m_lightgun.rgbButtons[2] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) m_lightgun.rgbButtons[2] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) m_lightgun.rgbButtons[3] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) m_lightgun.rgbButtons[3] = 0x00; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) m_lightgun.rgbButtons[4] = 0x80; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) m_lightgun.rgbButtons[4] = 0x00; } } + +private: + mouse_state m_lightgun; }; + //============================================================ // rawinput_module - base class for rawinput modules //============================================================ -class rawinput_module : public wininput_module +class rawinput_module : public wininput_module<rawinput_device> { private: std::mutex m_module_lock; public: - rawinput_module(const char *type, const char *name) : wininput_module(type, name) + rawinput_module(const char *type, const char *name) : wininput_module<rawinput_device>(type, name) { } - bool probe() override + virtual bool probe() override { return true; } - void input_init(running_machine &machine) override + virtual void input_init(running_machine &machine) override { + wininput_module<rawinput_device>::input_init(machine); + // get initial number of devices UINT device_count = 0; if (GetRawInputDeviceList(nullptr, &device_count, sizeof(RAWINPUTDEVICELIST)) != 0) @@ -479,11 +582,7 @@ public: // iterate backwards through devices; new devices are added at the head for (int devnum = retrieved - 1; devnum >= 0; devnum--) - add_rawinput_device(machine, rawinput_devices[devnum]); - - // don't enable background input when debugging - if (!machine.options().debug()) - m_global_inputs_enabled = options()->background_input(); + add_rawinput_device(rawinput_devices[devnum]); // If we added no devices, no need to register for notifications if (devicelist().empty()) @@ -494,7 +593,7 @@ public: registration.usUsagePage = usagepage(); registration.usUsage = usage(); registration.dwFlags = RIDEV_DEVNOTIFY; - if (m_global_inputs_enabled) + if (background_input()) registration.dwFlags |= RIDEV_INPUTSINK; registration.hwndTarget = std::static_pointer_cast<win_window_info>(osd_common_t::s_window_list.front())->platform_window(); @@ -503,17 +602,12 @@ public: } protected: - virtual void add_rawinput_device(running_machine &machine, RAWINPUTDEVICELIST const &device) = 0; + virtual void add_rawinput_device(RAWINPUTDEVICELIST const &device) = 0; virtual USHORT usagepage() = 0; virtual USHORT usage() = 0; - int init_internal() override - { - return 0; - } - template<class TDevice> - TDevice *create_rawinput_device(running_machine &machine, RAWINPUTDEVICELIST const &rawinputdevice) + TDevice *create_rawinput_device(input_device_class deviceclass, RAWINPUTDEVICELIST const &rawinputdevice) { // determine the length of the device name, allocate it, and fetch it if not nameless UINT name_length = 0; @@ -528,34 +622,30 @@ protected: if (wcsstr(tname.get(), L"Root#RDP_") != nullptr) return nullptr; - // improve the name and then allocate a device - std::string utf8_name = osd::text::from_wstring(rawinput_device_improve_name(tname.get())); + // improve the name + std::string utf8_name = text::from_wstring(rawinput_device_improve_name(tname.get())); // set device ID to raw input name - std::string utf8_id = osd::text::from_wstring(tname.get()); + std::string utf8_id = text::from_wstring(tname.get()); tname.reset(); - TDevice &devinfo = devicelist().create_device<TDevice>(machine, std::move(utf8_name), std::move(utf8_id), *this); - - // Add the handle - devinfo.set_handle(rawinputdevice.hDevice); - - return &devinfo; + // allocate a device + return &create_device<TDevice>( + deviceclass, + std::move(utf8_name), + std::move(utf8_id), + rawinputdevice.hDevice); } - bool handle_input_event(input_event eventid, void *eventdata) override + virtual bool handle_input_event(input_event eventid, void *eventdata) override { switch (eventid) { // handle raw input data case INPUT_EVENT_RAWINPUT: { - // ignore if not enabled - if (!input_enabled()) - return false; - - HRAWINPUT rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); + HRAWINPUT const rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); BYTE small_buffer[4096]; std::unique_ptr<BYTE []> larger_buffer; @@ -595,13 +685,12 @@ protected: devicelist().end(), [input] (auto const &device) { - auto devinfo = dynamic_cast<rawinput_device *>(device.get()); - return devinfo && (input->header.hDevice == devinfo->device_handle()); + return input->header.hDevice == device->device_handle(); }); if (devicelist().end() == target_device) return false; - static_cast<rawinput_device *>(target_device->get())->queue_events(input, 1); + (*target_device)->queue_events(input, 1); return true; } } @@ -609,7 +698,7 @@ protected: case INPUT_EVENT_ARRIVAL: { - HRAWINPUT rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); + HRAWINPUT const rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); // determine the length of the device name, allocate it, and fetch it if not nameless UINT name_length = 0; @@ -619,7 +708,7 @@ protected: std::unique_ptr<WCHAR []> tname = std::make_unique<WCHAR []>(name_length + 1); if (name_length > 1 && GetRawInputDeviceInfoW(rawinputdevice, RIDI_DEVICENAME, tname.get(), &name_length) == UINT(-1)) return false; - std::string utf8_id = osd::text::from_wstring(tname.get()); + std::string utf8_id = text::from_wstring(tname.get()); tname.reset(); std::lock_guard<std::mutex> scope_lock(m_module_lock); @@ -630,20 +719,19 @@ protected: devicelist().end(), [&utf8_id] (auto const &device) { - auto devinfo = dynamic_cast<rawinput_device *>(device.get()); - return devinfo && !devinfo->device_handle() && (devinfo->id() == utf8_id); + return device->reconnect_candidate(utf8_id); }); if (devicelist().end() == target_device) return false; - static_cast<rawinput_device *>(target_device->get())->set_handle(rawinputdevice); + (*target_device)->attach_device(rawinputdevice); return true; } break; case INPUT_EVENT_REMOVAL: { - HRAWINPUT rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); + HRAWINPUT const rawinputdevice = *static_cast<HRAWINPUT *>(eventdata); std::lock_guard<std::mutex> scope_lock(m_module_lock); @@ -653,15 +741,14 @@ protected: devicelist().end(), [rawinputdevice] (auto const &device) { - auto devinfo = dynamic_cast<rawinput_device *>(device.get()); - return devinfo && (rawinputdevice == devinfo->device_handle()); + return rawinputdevice == device->device_handle(); }); if (devicelist().end() == target_device) return false; (*target_device)->reset(); - static_cast<rawinput_device *>(target_device->get())->set_handle(nullptr); + (*target_device)->detach_device(); return true; } break; @@ -675,6 +762,7 @@ protected: } }; + //============================================================ // keyboard_input_rawinput - rawinput keyboard module //============================================================ @@ -682,45 +770,26 @@ protected: class keyboard_input_rawinput : public rawinput_module { public: - keyboard_input_rawinput() - : rawinput_module(OSD_KEYBOARDINPUT_PROVIDER, "rawinput") + keyboard_input_rawinput() : rawinput_module(OSD_KEYBOARDINPUT_PROVIDER, "rawinput") { } protected: - USHORT usagepage() override { return 1; } - USHORT usage() override { return 6; } + virtual USHORT usagepage() override { return 1; } + virtual USHORT usage() override { return 6; } - void add_rawinput_device(running_machine &machine, RAWINPUTDEVICELIST const &device) override + virtual void add_rawinput_device(RAWINPUTDEVICELIST const &device) override { // make sure this is a keyboard if (device.dwType != RIM_TYPEKEYBOARD) return; // allocate and link in a new device - auto *devinfo = create_rawinput_device<rawinput_keyboard_device>(machine, device); - if (devinfo == nullptr) - return; - - keyboard_trans_table &table = keyboard_trans_table::instance(); - - // populate it - for (int keynum = 0; keynum < MAX_KEYS; keynum++) - { - input_item_id itemid = table.map_di_scancode_to_itemid(keynum); - WCHAR keyname[100]; - - // generate the name - if (GetKeyNameTextW(((keynum & 0x7f) << 16) | ((keynum & 0x80) << 17), keyname, std::size(keyname)) == 0) - _snwprintf(keyname, std::size(keyname), L"Scan%03d", keynum); - std::string name = osd::text::from_wstring(keyname); - - // add the item to the device - devinfo->device()->add_item(name, itemid, generic_button_get_state<std::uint8_t>, &devinfo->keyboard.state[keynum]); - } + create_rawinput_device<rawinput_keyboard_device>(DEVICE_CLASS_KEYBOARD, device); } }; + //============================================================ // mouse_input_rawinput - rawinput mouse module //============================================================ @@ -728,48 +797,26 @@ protected: class mouse_input_rawinput : public rawinput_module { public: - mouse_input_rawinput() - : rawinput_module(OSD_MOUSEINPUT_PROVIDER, "rawinput") + mouse_input_rawinput() : rawinput_module(OSD_MOUSEINPUT_PROVIDER, "rawinput") { } protected: - USHORT usagepage() override { return 1; } - USHORT usage() override { return 2; } + virtual USHORT usagepage() override { return 1; } + virtual USHORT usage() override { return 2; } - void add_rawinput_device(running_machine &machine, RAWINPUTDEVICELIST const &device) override + virtual void add_rawinput_device(RAWINPUTDEVICELIST const &device) override { // make sure this is a mouse if (device.dwType != RIM_TYPEMOUSE) return; // allocate and link in a new device - auto *devinfo = create_rawinput_device<rawinput_mouse_device>(machine, device); - if (devinfo == nullptr) - return; - - // populate the axes - for (int axisnum = 0; axisnum < 3; axisnum++) - { - devinfo->device()->add_item( - default_axis_name[axisnum], - static_cast<input_item_id>(ITEM_ID_XAXIS + axisnum), - generic_axis_get_state<LONG>, - &devinfo->mouse.lX + axisnum); - } - - // populate the buttons - for (int butnum = 0; butnum < 5; butnum++) - { - devinfo->device()->add_item( - default_button_name(butnum), - static_cast<input_item_id>(ITEM_ID_BUTTON1 + butnum), - generic_button_get_state<BYTE>, - &devinfo->mouse.rgbButtons[butnum]); - } + create_rawinput_device<rawinput_mouse_device>(DEVICE_CLASS_MOUSE, device); } }; + //============================================================ // lightgun_input_rawinput - rawinput lightgun module //============================================================ @@ -777,61 +824,47 @@ protected: class lightgun_input_rawinput : public rawinput_module { public: - lightgun_input_rawinput() - : rawinput_module(OSD_LIGHTGUNINPUT_PROVIDER, "rawinput") + lightgun_input_rawinput() : rawinput_module(OSD_LIGHTGUNINPUT_PROVIDER, "rawinput") { } protected: - USHORT usagepage() override { return 1; } - USHORT usage() override { return 2; } + virtual USHORT usagepage() override { return 1; } + virtual USHORT usage() override { return 2; } - void add_rawinput_device(running_machine &machine, RAWINPUTDEVICELIST const &device) override + virtual void add_rawinput_device(RAWINPUTDEVICELIST const &device) override { - // make sure this is a mouse if (device.dwType != RIM_TYPEMOUSE) return; // allocate and link in a new device - auto *devinfo = create_rawinput_device<rawinput_lightgun_device>(machine, device); - if (devinfo == nullptr) - return; - - // populate the axes - for (int axisnum = 0; axisnum < 3; axisnum++) - { - devinfo->device()->add_item( - default_axis_name[axisnum], - static_cast<input_item_id>(ITEM_ID_XAXIS + axisnum), - generic_axis_get_state<LONG>, - &devinfo->lightgun.lX + axisnum); - } - - // populate the buttons - for (int butnum = 0; butnum < 5; butnum++) - { - devinfo->device()->add_item( - default_button_name(butnum), - static_cast<input_item_id>(ITEM_ID_BUTTON1 + butnum), - generic_button_get_state<BYTE>, - &devinfo->lightgun.rgbButtons[butnum]); - } + create_rawinput_device<rawinput_lightgun_device>(DEVICE_CLASS_LIGHTGUN, device); } }; } // anonymous namespace +} // namespace osd + #else // defined(OSD_WINDOWS) #include "input_module.h" +namespace osd { + +namespace { + MODULE_NOT_SUPPORTED(keyboard_input_rawinput, OSD_KEYBOARDINPUT_PROVIDER, "rawinput") MODULE_NOT_SUPPORTED(mouse_input_rawinput, OSD_MOUSEINPUT_PROVIDER, "rawinput") MODULE_NOT_SUPPORTED(lightgun_input_rawinput, OSD_LIGHTGUNINPUT_PROVIDER, "rawinput") +} // anonymous namespace + +} // namespace osd + #endif // defined(OSD_WINDOWS) -MODULE_DEFINITION(KEYBOARDINPUT_RAWINPUT, keyboard_input_rawinput) -MODULE_DEFINITION(MOUSEINPUT_RAWINPUT, mouse_input_rawinput) -MODULE_DEFINITION(LIGHTGUNINPUT_RAWINPUT, lightgun_input_rawinput) +MODULE_DEFINITION(KEYBOARDINPUT_RAWINPUT, osd::keyboard_input_rawinput) +MODULE_DEFINITION(MOUSEINPUT_RAWINPUT, osd::mouse_input_rawinput) +MODULE_DEFINITION(LIGHTGUNINPUT_RAWINPUT, osd::lightgun_input_rawinput) |
