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 52c99d1ba..7e2dc6ee9 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<UrlRequestInterceptor>()),
+QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system,
+                                     InputCommon::InputSubsystem* input_subsystem_)
+    : QWebEngineView(parent), input_subsystem{input_subsystem_},
+      url_interceptor(std::make_unique<UrlRequestInterceptor>()),
       input_interpreter(std::make_unique<InputInterpreter>(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 <HIDButton... T>
 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 18b8640a7..cfddaa6f8 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<UrlRequestInterceptor> url_interceptor;
 
     std::unique_ptr<InputInterpreter> input_interpreter;
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index ccff08074..f835ee9cb 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);