diff options
author | Zach Hilman <zachhilman@gmail.com> | 2018-12-24 22:22:49 +0100 |
---|---|---|
committer | Zach Hilman <zachhilman@gmail.com> | 2018-12-28 21:32:39 +0100 |
commit | e00e1fc755501018c4106e8453045037d5b9e3ee (patch) | |
tree | e2d19db87e63e2e873a492f5b35f0b6db15933e6 | |
parent | core: Add getter and setter for WebBrowserApplet frontend (diff) | |
download | yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar.gz yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar.bz2 yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar.lz yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar.xz yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.tar.zst yuzu-e00e1fc755501018c4106e8453045037d5b9e3ee.zip |
-rw-r--r-- | src/yuzu/applets/web_browser.cpp | 109 | ||||
-rw-r--r-- | src/yuzu/applets/web_browser.h | 45 |
2 files changed, 154 insertions, 0 deletions
diff --git a/src/yuzu/applets/web_browser.cpp b/src/yuzu/applets/web_browser.cpp new file mode 100644 index 000000000..e1a34bb5f --- /dev/null +++ b/src/yuzu/applets/web_browser.cpp @@ -0,0 +1,109 @@ +// Copyright 2018 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <mutex> + +#include <QKeyEvent> + +#include "core/hle/lock.h" +#include "yuzu/applets/web_browser.h" +#include "yuzu/main.h" + +constexpr char NX_SHIM_INJECT_SCRIPT[] = R"( + window.nx = {}; + window.nx.playReport = {}; + window.nx.playReport.setCounterSetIdentifier = function () { + console.log("nx.footer.setCounterSetIdentifier called - unimplemented"); + }; + + window.nx.playReport.incrementCounter = function () { + console.log("nx.footer.incrementCounter called - unimplemented"); + }; + + window.nx.footer = {}; + window.nx.footer.unsetAssign = function () { + console.log("nx.footer.unsetAssign called - unimplemented"); + }; + + var yuzu_key_callbacks = []; + window.nx.footer.setAssign = function(key, discard1, func, discard2) { + switch (key) { + case 'A': + yuzu_key_callbacks[0] = func; + break; + case 'B': + yuzu_key_callbacks[1] = func; + break; + case 'X': + yuzu_key_callbacks[2] = func; + break; + case 'Y': + yuzu_key_callbacks[3] = func; + break; + case 'L': + yuzu_key_callbacks[6] = func; + break; + case 'R': + yuzu_key_callbacks[7] = func; + break; + } + }; + + var applet_done = false; + window.nx.endApplet = function() { + applet_done = true; + }; +)"; + +void NXInputWebEngineView::keyPressEvent(QKeyEvent* event) { + parent()->event(event); +} + +void NXInputWebEngineView::keyReleaseEvent(QKeyEvent* event) { + parent()->event(event); +} + +QString GetNXShimInjectionScript() { + return QString::fromStdString(NX_SHIM_INJECT_SCRIPT); +} + +NXInputWebEngineView::NXInputWebEngineView(QWidget* parent) : QWebEngineView(parent) {} + +QtWebBrowser::QtWebBrowser(GMainWindow& main_window) { + connect(this, &QtWebBrowser::MainWindowOpenPage, &main_window, &GMainWindow::WebBrowserOpenPage, + Qt::QueuedConnection); + connect(&main_window, &GMainWindow::WebBrowserUnpackRomFS, this, + &QtWebBrowser::MainWindowUnpackRomFS, Qt::QueuedConnection); + connect(&main_window, &GMainWindow::WebBrowserFinishedBrowsing, this, + &QtWebBrowser::MainWindowFinishedBrowsing, Qt::QueuedConnection); +} + +QtWebBrowser::~QtWebBrowser() = default; + +void QtWebBrowser::OpenPage(std::string_view url, std::function<void()> unpack_romfs_callback, + std::function<void()> finished_callback) const { + this->unpack_romfs_callback = unpack_romfs_callback; + this->finished_callback = finished_callback; + + const auto index = url.find('?'); + if (index == std::string::npos) { + emit MainWindowOpenPage(url, ""); + } else { + const auto front = url.substr(0, index); + const auto back = url.substr(index); + emit MainWindowOpenPage(front, back); + } +} + +void QtWebBrowser::MainWindowUnpackRomFS() { + // Acquire the HLE mutex + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + unpack_romfs_callback(); +} + +void QtWebBrowser::MainWindowFinishedBrowsing() { + // Acquire the HLE mutex + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + finished_callback(); +} diff --git a/src/yuzu/applets/web_browser.h b/src/yuzu/applets/web_browser.h new file mode 100644 index 000000000..74f6698be --- /dev/null +++ b/src/yuzu/applets/web_browser.h @@ -0,0 +1,45 @@ +// Copyright 2018 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <functional> +#include <QObject> +#include <QWebEngineView> +#include "core/frontend/applets/web_browser.h" + +class GMainWindow; + +QString GetNXShimInjectionScript(); + +class NXInputWebEngineView : public QWebEngineView { +public: + NXInputWebEngineView(QWidget* parent = nullptr); + +protected: + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; +}; + +class QtWebBrowser final : public QObject, public Core::Frontend::WebBrowserApplet { + Q_OBJECT + +public: + explicit QtWebBrowser(GMainWindow& main_window); + ~QtWebBrowser() override; + + void OpenPage(std::string_view url, std::function<void()> unpack_romfs_callback, + std::function<void()> finished_callback) const override; + +signals: + void MainWindowOpenPage(std::string_view filename, std::string_view additional_args) const; + +public slots: + void MainWindowUnpackRomFS(); + void MainWindowFinishedBrowsing(); + +private: + mutable std::function<void()> unpack_romfs_callback; + mutable std::function<void()> finished_callback; +}; |