forked from suyu/suyu
applets/web: Fix keyboard to emulated controller input
This commit is contained in:
parent
2ddd83cdfe
commit
51cddcb8b8
3 changed files with 30 additions and 4 deletions
|
@ -15,6 +15,8 @@
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/frontend/input_interpreter.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.h"
|
||||||
#include "yuzu/applets/web_browser_scripts.h"
|
#include "yuzu/applets/web_browser_scripts.h"
|
||||||
#include "yuzu/main.h"
|
#include "yuzu/main.h"
|
||||||
|
@ -45,8 +47,10 @@ constexpr int HIDButtonToKey(HIDButton button) {
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system)
|
QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system,
|
||||||
: QWebEngineView(parent), url_interceptor(std::make_unique<UrlRequestInterceptor>()),
|
InputCommon::InputSubsystem* input_subsystem_)
|
||||||
|
: QWebEngineView(parent), input_subsystem{input_subsystem_},
|
||||||
|
url_interceptor(std::make_unique<UrlRequestInterceptor>()),
|
||||||
input_interpreter(std::make_unique<InputInterpreter>(system)) {
|
input_interpreter(std::make_unique<InputInterpreter>(system)) {
|
||||||
QWebEngineScript nx_font_css;
|
QWebEngineScript nx_font_css;
|
||||||
QWebEngineScript load_nx_font;
|
QWebEngineScript load_nx_font;
|
||||||
|
@ -203,6 +207,14 @@ void QtNXWebEngineView::hide() {
|
||||||
QWidget::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>
|
template <HIDButton... T>
|
||||||
void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() {
|
void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() {
|
||||||
const auto f = [this](HIDButton button) {
|
const auto f = [this](HIDButton button) {
|
||||||
|
@ -282,6 +294,7 @@ void QtNXWebEngineView::StartInputThread() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtNXWebEngineView::StopInputThread() {
|
void QtNXWebEngineView::StopInputThread() {
|
||||||
|
QWidget::releaseKeyboard();
|
||||||
input_thread_running = false;
|
input_thread_running = false;
|
||||||
if (input_thread.joinable()) {
|
if (input_thread.joinable()) {
|
||||||
input_thread.join();
|
input_thread.join();
|
||||||
|
@ -292,6 +305,8 @@ void QtNXWebEngineView::InputThread() {
|
||||||
// Wait for 1 second before allowing any inputs to be processed.
|
// Wait for 1 second before allowing any inputs to be processed.
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||||
|
|
||||||
|
QWidget::grabKeyboard();
|
||||||
|
|
||||||
while (input_thread_running) {
|
while (input_thread_running) {
|
||||||
input_interpreter->PollInput();
|
input_interpreter->PollInput();
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,10 @@ namespace Core {
|
||||||
class System;
|
class System;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace InputCommon {
|
||||||
|
class InputSubsystem;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef YUZU_USE_QT_WEB_ENGINE
|
#ifdef YUZU_USE_QT_WEB_ENGINE
|
||||||
|
|
||||||
enum class UserAgent {
|
enum class UserAgent {
|
||||||
|
@ -41,7 +45,8 @@ class QtNXWebEngineView : public QWebEngineView {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QtNXWebEngineView(QWidget* parent, Core::System& system);
|
explicit QtNXWebEngineView(QWidget* parent, Core::System& system,
|
||||||
|
InputCommon::InputSubsystem* input_subsystem_);
|
||||||
~QtNXWebEngineView() override;
|
~QtNXWebEngineView() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,6 +91,10 @@ public:
|
||||||
public slots:
|
public slots:
|
||||||
void hide();
|
void hide();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void keyPressEvent(QKeyEvent* event) override;
|
||||||
|
void keyReleaseEvent(QKeyEvent* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Handles button presses to execute functions assigned in yuzu_key_callbacks.
|
* 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.
|
/// The thread where input is being polled and processed.
|
||||||
void InputThread();
|
void InputThread();
|
||||||
|
|
||||||
|
InputCommon::InputSubsystem* input_subsystem;
|
||||||
|
|
||||||
std::unique_ptr<UrlRequestInterceptor> url_interceptor;
|
std::unique_ptr<UrlRequestInterceptor> url_interceptor;
|
||||||
|
|
||||||
std::unique_ptr<InputInterpreter> input_interpreter;
|
std::unique_ptr<InputInterpreter> input_interpreter;
|
||||||
|
|
|
@ -376,7 +376,7 @@ void GMainWindow::WebBrowserOpenLocalWebPage(std::string_view main_url,
|
||||||
return;
|
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_Pause->setEnabled(false);
|
||||||
ui.action_Restart->setEnabled(false);
|
ui.action_Restart->setEnabled(false);
|
||||||
|
|
Loading…
Reference in a new issue