From 8f14f392fdaf3750171e6476c5c34a64e758a455 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 25 Apr 2022 18:44:28 +0200 Subject: [PATCH] overlays: ignore input if kb pad handler is active --- rpcs3/Emu/Io/pad_types.h | 8 ++++++-- rpcs3/Emu/RSX/Overlays/overlays.cpp | 19 ++++++++++++++----- rpcs3/Emu/RSX/Overlays/overlays.h | 1 + rpcs3/Input/basic_keyboard_handler.cpp | 5 ++++- rpcs3/Input/pad_thread.cpp | 2 +- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/Io/pad_types.h b/rpcs3/Emu/Io/pad_types.h index ed00412c36..80ec4be05e 100644 --- a/rpcs3/Emu/Io/pad_types.h +++ b/rpcs3/Emu/Io/pad_types.h @@ -1,6 +1,7 @@ #pragma once #include "util/types.hpp" +#include "Emu/Io/pad_config_types.h" #include @@ -250,6 +251,8 @@ struct VibrateMotor struct Pad { + const pad_handler m_pad_handler; + bool m_buffer_cleared{true}; u32 m_port_status{0}; u32 m_device_capability{0}; @@ -308,8 +311,9 @@ struct Pad bool ldd{false}; u8 ldd_data[132] = {}; - explicit Pad(u32 port_status, u32 device_capability, u32 device_type) - : m_port_status(port_status) + explicit Pad(pad_handler handler, u32 port_status, u32 device_capability, u32 device_type) + : m_pad_handler(handler) + , m_port_status(port_status) , m_device_capability(device_capability) , m_device_type(device_type) { diff --git a/rpcs3/Emu/RSX/Overlays/overlays.cpp b/rpcs3/Emu/RSX/Overlays/overlays.cpp index 0efca84f1c..757cbf9217 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlays.cpp @@ -124,8 +124,9 @@ namespace rsx if (Emu.IsPaused()) continue; - // Get keyboard input - if (m_keyboard_input_enabled && input::g_keyboards_intercepted) + // Get keyboard input if supported by the overlay and activated by the game. + // Ignored if a keyboard pad handler is active in order to prevent double input. + if (m_keyboard_input_enabled && !m_keyboard_pad_handler_active && input::g_keyboards_intercepted) { auto& handler = g_fxo->get(); std::lock_guard lock(handler.m_mutex); @@ -150,10 +151,9 @@ namespace rsx continue; } } - else + else if (g_cfg.io.keyboard != keyboard_handler::null) { - // TODO: Init handler only if the game requests keyboard input. - // This probably needs to happen completely seperate from cellKb. + // Workaround if cellKb did not init the keyboard handler. handler.Init(1); } } @@ -169,6 +169,8 @@ namespace rsx continue; } + bool keyboard_pad_handler_active = false; + int pad_index = -1; for (const auto& pad : handler->GetPads()) { @@ -192,6 +194,11 @@ namespace rsx continue; } + if (pad->m_pad_handler == pad_handler::keyboard) + { + m_keyboard_pad_handler_active = true; + } + for (const Button& button : pad->m_buttons) { u8 button_id = pad_button::pad_button_max_enum; @@ -310,6 +317,8 @@ namespace rsx } } + m_keyboard_pad_handler_active = keyboard_pad_handler_active; + refresh(); } diff --git a/rpcs3/Emu/RSX/Overlays/overlays.h b/rpcs3/Emu/RSX/Overlays/overlays.h index e0c40ab78e..83a10bf4a6 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.h +++ b/rpcs3/Emu/RSX/Overlays/overlays.h @@ -97,6 +97,7 @@ namespace rsx atomic_t m_stop_pad_interception = false; atomic_t thread_bits = 0; bool m_keyboard_input_enabled = false; // Allow keyboard events + bool m_keyboard_pad_handler_active = true; // Initialized as true to prevent keyboard input until proven otherwise. static thread_local u64 g_thread_bit; diff --git a/rpcs3/Input/basic_keyboard_handler.cpp b/rpcs3/Input/basic_keyboard_handler.cpp index 883ac0f410..1a23e336eb 100644 --- a/rpcs3/Input/basic_keyboard_handler.cpp +++ b/rpcs3/Input/basic_keyboard_handler.cpp @@ -13,6 +13,9 @@ LOG_CHANNEL(input_log, "Input"); void basic_keyboard_handler::Init(const u32 max_connect) { + m_keyboards.clear(); + m_info = {}; + for (u32 i = 0; i < max_connect; i++) { Keyboard kb{}; @@ -23,7 +26,7 @@ void basic_keyboard_handler::Init(const u32 max_connect) } LoadSettings(); - memset(&m_info, 0, sizeof(KbInfo)); + m_info.max_connect = max_connect; m_info.now_connect = std::min(::size32(m_keyboards), max_connect); m_info.info = input::g_keyboards_intercepted ? CELL_KB_INFO_INTERCEPTED : 0; // Ownership of keyboard data: 0=Application, 1=System diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index a975d3c478..7ee7dab989 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -168,7 +168,7 @@ void pad_thread::Init() } cur_pad_handler->Init(); - m_pads[i] = std::make_shared(CELL_PAD_STATUS_DISCONNECTED, pad_settings[i].device_capability, pad_settings[i].device_type); + m_pads[i] = std::make_shared(handler_type, CELL_PAD_STATUS_DISCONNECTED, pad_settings[i].device_capability, pad_settings[i].device_type); if (is_ldd_pad) {