diff --git a/src/xenia/hid/input_system.cc b/src/xenia/hid/input_system.cc index 29a76f749..bb4cfbd9c 100644 --- a/src/xenia/hid/input_system.cc +++ b/src/xenia/hid/input_system.cc @@ -41,7 +41,8 @@ void InputSystem::AddDriver(std::unique_ptr driver) { void InputSystem::UpdateUsedSlot(InputDriver* driver, uint8_t slot, bool connected) { if (slot == XUserIndexAny) { - slot = 0; + XELOGW("{} received requrest for slot any! Unsupported", __func__); + return; } if (connected_slots.test(slot) == connected) { @@ -136,18 +137,16 @@ X_RESULT InputSystem::GetKeystroke(uint32_t user_index, uint32_t flags, bool any_connected = false; for (auto& driver : drivers_) { + // connected_slots X_RESULT result = driver->GetKeystroke(user_index, flags, out_keystroke); - if (result == X_ERROR_INVALID_PARAMETER) { + if (result == X_ERROR_INVALID_PARAMETER || + result == X_ERROR_DEVICE_NOT_CONNECTED) { continue; } - if (result != X_ERROR_DEVICE_NOT_CONNECTED) { - any_connected = true; - } + any_connected = true; if (result == X_ERROR_SUCCESS || result == X_ERROR_EMPTY) { - UpdateUsedSlot(driver.get(), user_index, any_connected); - if (result == X_ERROR_SUCCESS) { last_used_slot = user_index; } @@ -158,7 +157,6 @@ X_RESULT InputSystem::GetKeystroke(uint32_t user_index, uint32_t flags, continue; } } - UpdateUsedSlot(nullptr, user_index, any_connected); return any_connected ? X_ERROR_EMPTY : X_ERROR_DEVICE_NOT_CONNECTED; } diff --git a/src/xenia/hid/winkey/winkey_input_driver.cc b/src/xenia/hid/winkey/winkey_input_driver.cc index 5dd55b295..078f80c7b 100644 --- a/src/xenia/hid/winkey/winkey_input_driver.cc +++ b/src/xenia/hid/winkey/winkey_input_driver.cc @@ -39,7 +39,7 @@ namespace xe { namespace hid { namespace winkey { -bool static IsPassthroughEnabled(uint32_t user_index) { +bool static IsPassthroughEnabled() { return static_cast(cvars::keyboard_mode) == KeyboardMode::Passthrough; } @@ -272,6 +272,14 @@ X_RESULT WinKeyInputDriver::SetState(uint32_t user_index, X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags, X_INPUT_KEYSTROKE* out_keystroke) { + if (!is_active()) { + return X_ERROR_DEVICE_NOT_CONNECTED; + } + + if (!IsKeyboardForUserEnabled(user_index) && !IsPassthroughEnabled()) { + return X_ERROR_DEVICE_NOT_CONNECTED; + } + // Pop from the queue. KeyEvent evt; { @@ -284,15 +292,6 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags, key_events_.pop(); } - if (!IsKeyboardForUserEnabled(user_index) && - !IsPassthroughEnabled(user_index)) { - return X_ERROR_DEVICE_NOT_CONNECTED; - } - - if (!is_active()) { - return X_ERROR_EMPTY; - } - X_RESULT result = X_ERROR_EMPTY; ui::VirtualKey xinput_virtual_key = ui::VirtualKey::kNone; @@ -302,7 +301,7 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags, bool capital = IsKeyToggled(VK_CAPITAL) || IsKeyDown(VK_SHIFT); - if (!IsPassthroughEnabled(user_index)) { + if (!IsPassthroughEnabled()) { if (IsKeyboardForUserEnabled(user_index)) { for (const KeyBinding& b : key_bindings_) { if (b.input_key == evt.virtual_key && @@ -338,7 +337,7 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags, keystroke_flags |= 0x0002; // XINPUT_KEYSTROKE_KEYUP } - if (IsPassthroughEnabled(user_index)) { + if (IsPassthroughEnabled()) { if (GetKeyboardState(key_map_)) { WCHAR buf; if (ToUnicode(uint8_t(xinput_virtual_key), 0, key_map_, &buf, 1, 0) == @@ -373,7 +372,8 @@ void WinKeyInputDriver::WinKeyWindowInputListener::OnKeyUp(ui::KeyEvent& e) { } void WinKeyInputDriver::OnKey(ui::KeyEvent& e, bool is_down) { - if (!is_active()) { + if (!is_active() || static_cast(cvars::keyboard_mode) == + KeyboardMode::Disabled) { return; }