mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-05 03:15:07 -04:00
input: support imitation SNES USB gamepad on Windows
This commit is contained in:
parent
3da32b7b7c
commit
6e476e77a3
@ -245,8 +245,15 @@ on_input_device_arrival(HANDLE handle) {
|
|||||||
if (dev_class == "HIDClass" && _CM_Get_DevNode_PropertyW != nullptr &&
|
if (dev_class == "HIDClass" && _CM_Get_DevNode_PropertyW != nullptr &&
|
||||||
_CM_Get_DevNode_PropertyW(cur, &bus_reported_device_desc, &type, (PBYTE)buffer, &buflen, 0) == CR_SUCCESS &&
|
_CM_Get_DevNode_PropertyW(cur, &bus_reported_device_desc, &type, (PBYTE)buffer, &buflen, 0) == CR_SUCCESS &&
|
||||||
type == DEVPROP_TYPE_STRING) {
|
type == DEVPROP_TYPE_STRING) {
|
||||||
|
|
||||||
|
// Some devices insert quite some trailing space here.
|
||||||
|
wchar_t *wbuffer = (wchar_t *)buffer;
|
||||||
|
size_t wlen = wcslen(wbuffer);
|
||||||
|
while (iswspace(wbuffer[wlen - 1])) {
|
||||||
|
wbuffer[--wlen] = 0;
|
||||||
|
}
|
||||||
TextEncoder encoder;
|
TextEncoder encoder;
|
||||||
name.assign(encoder.encode_wtext((wchar_t *)buffer));
|
name.assign(encoder.encode_wtext(wstring(wbuffer, wlen)));
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
buflen = 4096;
|
buflen = 4096;
|
||||||
|
@ -265,6 +265,11 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, string name) {
|
|||||||
info.hid.usUsage == HID_USAGE_GENERIC_JOYSTICK) {
|
info.hid.usUsage == HID_USAGE_GENERIC_JOYSTICK) {
|
||||||
_device_class = DC_flight_stick;
|
_device_class = DC_flight_stick;
|
||||||
|
|
||||||
|
if (_name == "usb gamepad") {
|
||||||
|
// Well, it claims to be a gamepad...
|
||||||
|
_device_class = DC_gamepad;
|
||||||
|
}
|
||||||
|
|
||||||
// Mice
|
// Mice
|
||||||
} else if (info.hid.usUsagePage == HID_USAGE_PAGE_GENERIC &&
|
} else if (info.hid.usUsagePage == HID_USAGE_PAGE_GENERIC &&
|
||||||
info.hid.usUsage == HID_USAGE_GENERIC_MOUSE) {
|
info.hid.usUsage == HID_USAGE_GENERIC_MOUSE) {
|
||||||
@ -320,6 +325,39 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, string name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do we have a button mapping?
|
||||||
|
static const ButtonHandle gamepad_buttons_common[] = {
|
||||||
|
ButtonHandle::none(),
|
||||||
|
GamepadButton::action_a(),
|
||||||
|
GamepadButton::action_b(),
|
||||||
|
GamepadButton::action_x(),
|
||||||
|
GamepadButton::action_y(),
|
||||||
|
GamepadButton::lshoulder(),
|
||||||
|
GamepadButton::rshoulder(),
|
||||||
|
GamepadButton::start(),
|
||||||
|
GamepadButton::back(),
|
||||||
|
GamepadButton::lstick(),
|
||||||
|
GamepadButton::rstick(),
|
||||||
|
};
|
||||||
|
const ButtonHandle *gamepad_buttons = gamepad_buttons_common;
|
||||||
|
if (_vendor_id == 0x0810 && _product_id == 0xe501) {
|
||||||
|
// SNES-style USB gamepad
|
||||||
|
static const ButtonHandle gamepad_buttons_snes[] = {
|
||||||
|
ButtonHandle::none(),
|
||||||
|
GamepadButton::action_x(),
|
||||||
|
GamepadButton::action_a(),
|
||||||
|
GamepadButton::action_b(),
|
||||||
|
GamepadButton::action_y(),
|
||||||
|
GamepadButton::lshoulder(),
|
||||||
|
GamepadButton::rshoulder(),
|
||||||
|
ButtonHandle::none(),
|
||||||
|
ButtonHandle::none(),
|
||||||
|
GamepadButton::back(),
|
||||||
|
GamepadButton::start(),
|
||||||
|
};
|
||||||
|
gamepad_buttons = gamepad_buttons_snes;
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare a mapping of data indices to button/control indices.
|
// Prepare a mapping of data indices to button/control indices.
|
||||||
_indices.resize(caps.NumberInputDataIndices);
|
_indices.resize(caps.NumberInputDataIndices);
|
||||||
|
|
||||||
@ -369,20 +407,7 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, string name) {
|
|||||||
switch (cap.UsagePage) {
|
switch (cap.UsagePage) {
|
||||||
case HID_USAGE_PAGE_BUTTON:
|
case HID_USAGE_PAGE_BUTTON:
|
||||||
if (_device_class == DC_gamepad) {
|
if (_device_class == DC_gamepad) {
|
||||||
static const ButtonHandle gamepad_buttons[] = {
|
if (usage < sizeof(gamepad_buttons_common) / sizeof(ButtonHandle)) {
|
||||||
ButtonHandle::none(),
|
|
||||||
GamepadButton::action_a(),
|
|
||||||
GamepadButton::action_b(),
|
|
||||||
GamepadButton::action_x(),
|
|
||||||
GamepadButton::action_y(),
|
|
||||||
GamepadButton::lshoulder(),
|
|
||||||
GamepadButton::rshoulder(),
|
|
||||||
GamepadButton::start(),
|
|
||||||
GamepadButton::back(),
|
|
||||||
GamepadButton::lstick(),
|
|
||||||
GamepadButton::rstick(),
|
|
||||||
};
|
|
||||||
if (usage < sizeof(gamepad_buttons) / sizeof(ButtonHandle)) {
|
|
||||||
handle = gamepad_buttons[usage];
|
handle = gamepad_buttons[usage];
|
||||||
}
|
}
|
||||||
} else if (_device_class == DC_flight_stick) {
|
} else if (_device_class == DC_flight_stick) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user