From 73db765aaf9fad622f050e55e1d240329da0a07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 15 Mar 2019 19:42:17 +0100 Subject: wasm: support adding and removing canvases at runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add qtloader API: addCanvasElement() removeCanvasElement() These functions call the corresponding add/remove screen functions on QWasmIntegration. Task-number: QTBUG-64079 Change-Id: I537c11f3b5fb9240cca9b6313dd45f803d865ac6 Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/wasm/qtloader.js | 20 ++++++++++++++++ src/plugins/platforms/wasm/qwasmintegration.cpp | 31 ++++++++++++++++++------- src/plugins/platforms/wasm/qwasmintegration.h | 7 +++--- 3 files changed, 46 insertions(+), 12 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/wasm/qtloader.js b/src/plugins/platforms/wasm/qtloader.js index 049eb1c35e..9bacce5944 100644 --- a/src/plugins/platforms/wasm/qtloader.js +++ b/src/plugins/platforms/wasm/qtloader.js @@ -118,6 +118,10 @@ // "Exited", iff crashed is false. // exitText // Abort/exit message. +// addCanvasElement +// Add canvas at run-time. Adds a corresponding QScreen, +// removeCanvasElement +// Remove canvas at run-time. Removes the corresponding QScreen. var Module = {} @@ -227,6 +231,8 @@ function QtLoader(config) publicAPI.canLoadApplication = canLoadQt(); publicAPI.status = undefined; publicAPI.loadEmscriptenModule = loadEmscriptenModule; + publicAPI.addCanvasElement = addCanvasElement; + publicAPI.removeCanvasElement = removeCanvasElement; restartCount = 0; @@ -528,6 +534,20 @@ function QtLoader(config) window.setTimeout(function() { handleStatusChange(); }, 0); } + function addCanvasElement(element) { + if (publicAPI.status == "Running") + Module.qtAddCanvasElement(element); + else + console.log("Error: addCanvasElement can only be called in the Running state"); + } + + function removeCanvasElement(element) { + if (publicAPI.status == "Running") + Module.qtRemoveCanvasElement(element); + else + console.log("Error: removeCanvasElement can only be called in the Running state"); + } + setStatus("Created"); return publicAPI; diff --git a/src/plugins/platforms/wasm/qwasmintegration.cpp b/src/plugins/platforms/wasm/qwasmintegration.cpp index 3b4800a787..44b4546dc6 100644 --- a/src/plugins/platforms/wasm/qwasmintegration.cpp +++ b/src/plugins/platforms/wasm/qwasmintegration.cpp @@ -61,9 +61,23 @@ static void browserBeforeUnload(emscripten::val) QWasmIntegration::QWasmBrowserExit(); } +static void addCanvasElement(emscripten::val canvas) +{ + QString canvasId = QString::fromStdString(canvas["id"].as()); + QWasmIntegration::get()->addScreen(canvasId); +} + +static void removeCanvasElement(emscripten::val canvas) +{ + QString canvasId = QString::fromStdString(canvas["id"].as()); + QWasmIntegration::get()->removeScreen(canvasId); +} + EMSCRIPTEN_BINDINGS(qtQWasmIntegraton) { function("qtBrowserBeforeUnload", &browserBeforeUnload); + function("qtAddCanvasElement", &addCanvasElement); + function("qtRemoveCanvasElement", &removeCanvasElement); } QWasmIntegration *QWasmIntegration::s_instance; @@ -99,8 +113,9 @@ QWasmIntegration::~QWasmIntegration() { delete m_fontDb; - while (!m_screens.isEmpty()) - QWindowSystemInterface::handleScreenRemoved(m_screens.takeLast()); + for (auto it = m_screens.constBegin(); it != m_screens.constEnd(); ++it) + QWindowSystemInterface::handleScreenRemoved(*it); + m_screens.clear(); s_instance = nullptr; } @@ -184,17 +199,17 @@ QPlatformClipboard* QWasmIntegration::clipboard() const return m_clipboard; } -QVector QWasmIntegration::screens() -{ - return m_screens; -} - void QWasmIntegration::addScreen(const QString &canvasId) { QWasmScreen *screen = new QWasmScreen(canvasId); m_clipboard->installEventHandlers(canvasId); - m_screens.append(screen); + m_screens.insert(canvasId, screen); QWindowSystemInterface::handleScreenAdded(screen); } +void QWasmIntegration::removeScreen(const QString &canvasId) +{ + QWindowSystemInterface::handleScreenRemoved(m_screens.take(canvasId)); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmintegration.h b/src/plugins/platforms/wasm/qwasmintegration.h index 5c0ac0b297..01ce6ec007 100644 --- a/src/plugins/platforms/wasm/qwasmintegration.h +++ b/src/plugins/platforms/wasm/qwasmintegration.h @@ -70,21 +70,20 @@ public: QStringList themeNames() const override; QPlatformTheme *createPlatformTheme(const QString &name) const override; QPlatformClipboard *clipboard() const override; - - QVectorscreens(); QWasmClipboard *getWasmClipboard() { return m_clipboard; } static QWasmIntegration *get() { return s_instance; } static void QWasmBrowserExit(); -private: void addScreen(const QString &canvasId); + void removeScreen(const QString &canvasId); +private: mutable QWasmFontDatabase *m_fontDb; mutable QWasmEventDispatcher *m_eventDispatcher; mutable QHash m_backingStores; - QVector m_screens; + QHash m_screens; mutable QWasmClipboard *m_clipboard; static QWasmIntegration *s_instance; }; -- cgit v1.2.3