Make sure the device is connected before calling XInputGetKeystroke.
This commit is contained in:
parent
abf50b477e
commit
e212a7da1d
|
@ -86,8 +86,26 @@ X_RESULT XInputInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
|
||||||
X_INPUT_KEYSTROKE* out_keystroke) {
|
X_INPUT_KEYSTROKE* out_keystroke) {
|
||||||
// We may want to filter flags/user_index before sending to native.
|
// We may want to filter flags/user_index before sending to native.
|
||||||
// flags is reserved on desktop.
|
// flags is reserved on desktop.
|
||||||
|
DWORD result;
|
||||||
|
|
||||||
|
// XInputGetKeystroke on Windows has a bug where it will return
|
||||||
|
// ERROR_SUCCESS (0) even if the device is not connected:
|
||||||
|
// http://stackoverflow.com/questions/23669238/xinputgetkeystroke-returning-error-success-while-controller-is-unplugged
|
||||||
|
//
|
||||||
|
// So we first check if the device is connected via XInputGetCapabilities, so
|
||||||
|
// we are not passing back an uninitialized X_INPUT_KEYSTROKE structure:
|
||||||
|
XINPUT_CAPABILITIES caps;
|
||||||
|
result = XInputGetCapabilities(user_index, 0, &caps);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
XINPUT_KEYSTROKE native_keystroke;
|
XINPUT_KEYSTROKE native_keystroke;
|
||||||
DWORD result = XInputGetKeystroke(user_index, flags, &native_keystroke);
|
result = XInputGetKeystroke(user_index, flags, &native_keystroke);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
out_keystroke->virtual_key = native_keystroke.VirtualKey;
|
out_keystroke->virtual_key = native_keystroke.VirtualKey;
|
||||||
out_keystroke->unicode = native_keystroke.Unicode;
|
out_keystroke->unicode = native_keystroke.Unicode;
|
||||||
out_keystroke->flags = native_keystroke.Flags;
|
out_keystroke->flags = native_keystroke.Flags;
|
||||||
|
|
Loading…
Reference in New Issue