applets/web: Fix keyboard to emulated controller input
This commit is contained in:
		| @@ -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(); | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Morph
					Morph