From 51cddcb8b8d4d12715ba0517638b394244b500bb Mon Sep 17 00:00:00 2001 From: Morph <39850852+Morph1984@users.noreply.github.com> Date: Mon, 30 Nov 2020 22:25:01 -0500 Subject: [PATCH] applets/web: Fix keyboard to emulated controller input --- src/yuzu/applets/web_browser.cpp | 19 +++++++++++++++++-- src/yuzu/applets/web_browser.h | 13 ++++++++++++- src/yuzu/main.cpp | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/yuzu/applets/web_browser.cpp b/src/yuzu/applets/web_browser.cpp index 52c99d1bad..7e2dc6ee93 100644 --- a/src/yuzu/applets/web_browser.cpp +++ b/src/yuzu/applets/web_browser.cpp @@ -15,6 +15,8 @@ #include "common/file_util.h" #include "core/core.h" #include "core/frontend/input_interpreter.h" +#include "input_common/keyboard.h" +#include "input_common/main.h" #include "yuzu/applets/web_browser.h" #include "yuzu/applets/web_browser_scripts.h" #include "yuzu/main.h" @@ -45,8 +47,10 @@ constexpr int HIDButtonToKey(HIDButton button) { } // Anonymous namespace -QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system) - : QWebEngineView(parent), url_interceptor(std::make_unique()), +QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system, + InputCommon::InputSubsystem* input_subsystem_) + : QWebEngineView(parent), input_subsystem{input_subsystem_}, + url_interceptor(std::make_unique()), input_interpreter(std::make_unique(system)) { QWebEngineScript nx_font_css; QWebEngineScript load_nx_font; @@ -203,6 +207,14 @@ void QtNXWebEngineView::hide() { QWidget::hide(); } +void QtNXWebEngineView::keyPressEvent(QKeyEvent* event) { + input_subsystem->GetKeyboard()->PressKey(event->key()); +} + +void QtNXWebEngineView::keyReleaseEvent(QKeyEvent* event) { + input_subsystem->GetKeyboard()->ReleaseKey(event->key()); +} + template void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() { const auto f = [this](HIDButton button) { @@ -282,6 +294,7 @@ void QtNXWebEngineView::StartInputThread() { } void QtNXWebEngineView::StopInputThread() { + QWidget::releaseKeyboard(); input_thread_running = false; if (input_thread.joinable()) { input_thread.join(); @@ -292,6 +305,8 @@ void QtNXWebEngineView::InputThread() { // Wait for 1 second before allowing any inputs to be processed. std::this_thread::sleep_for(std::chrono::seconds(1)); + QWidget::grabKeyboard(); + while (input_thread_running) { input_interpreter->PollInput(); diff --git a/src/yuzu/applets/web_browser.h b/src/yuzu/applets/web_browser.h index 18b8640a7f..cfddaa6f89 100644 --- a/src/yuzu/applets/web_browser.h +++ b/src/yuzu/applets/web_browser.h @@ -26,6 +26,10 @@ namespace Core { class System; } +namespace InputCommon { +class InputSubsystem; +} + #ifdef YUZU_USE_QT_WEB_ENGINE enum class UserAgent { @@ -41,7 +45,8 @@ class QtNXWebEngineView : public QWebEngineView { Q_OBJECT public: - explicit QtNXWebEngineView(QWidget* parent, Core::System& system); + explicit QtNXWebEngineView(QWidget* parent, Core::System& system, + InputCommon::InputSubsystem* input_subsystem_); ~QtNXWebEngineView() override; /** @@ -86,6 +91,10 @@ public: public slots: void hide(); +protected: + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; + private: /** * Handles button presses to execute functions assigned in yuzu_key_callbacks. @@ -138,6 +147,8 @@ private: /// The thread where input is being polled and processed. void InputThread(); + InputCommon::InputSubsystem* input_subsystem; + std::unique_ptr url_interceptor; std::unique_ptr input_interpreter; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index ccff080747..f835ee9cb7 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -376,7 +376,7 @@ void GMainWindow::WebBrowserOpenLocalWebPage(std::string_view main_url, return; } - QtNXWebEngineView web_browser_view(this, Core::System::GetInstance()); + QtNXWebEngineView web_browser_view(this, Core::System::GetInstance(), input_subsystem.get()); ui.action_Pause->setEnabled(false); ui.action_Restart->setEnabled(false);