diff options
-rw-r--r-- | src/corelib/platform/wasm/qstdweb.cpp | 114 | ||||
-rw-r--r-- | src/corelib/platform/wasm/qstdweb_p.h | 21 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmclipboard.cpp | 116 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmdom.cpp | 5 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmdom.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmdrag.cpp | 210 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmdrag.h | 30 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmintegration.cpp | 11 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmintegration.h | 18 |
9 files changed, 231 insertions, 296 deletions
diff --git a/src/corelib/platform/wasm/qstdweb.cpp b/src/corelib/platform/wasm/qstdweb.cpp index 720ba6b7c9..0968509150 100644 --- a/src/corelib/platform/wasm/qstdweb.cpp +++ b/src/corelib/platform/wasm/qstdweb.cpp @@ -5,6 +5,8 @@ #include <QtCore/qcoreapplication.h> #include <QtCore/qfile.h> +#include <QtCore/qmimedata.h> + #include <emscripten/bind.h> #include <emscripten/emscripten.h> #include <emscripten/html5.h> @@ -368,6 +370,111 @@ bool jsHaveAsyncify() { return false; } #endif +struct DataTransferReader +{ +public: + using DoneCallback = std::function<void(std::unique_ptr<QMimeData>)>; + + static std::shared_ptr<CancellationFlag> read(emscripten::val webDataTransfer, + std::function<QVariant(QByteArray)> imageReader, + DoneCallback onCompleted) + { + auto cancellationFlag = std::make_shared<CancellationFlag>(); + (new DataTransferReader(std::move(onCompleted), std::move(imageReader), cancellationFlag)) + ->read(webDataTransfer); + return cancellationFlag; + } + + ~DataTransferReader() = default; + +private: + DataTransferReader(DoneCallback onCompleted, std::function<QVariant(QByteArray)> imageReader, + std::shared_ptr<CancellationFlag> cancellationFlag) + : mimeData(std::make_unique<QMimeData>()), + imageReader(std::move(imageReader)), + onCompleted(std::move(onCompleted)), + cancellationFlag(cancellationFlag) + { + } + + void read(emscripten::val webDataTransfer) + { + enum class ItemKind { + File, + String, + }; + + const auto items = webDataTransfer["items"]; + for (int i = 0; i < items["length"].as<int>(); ++i) { + const auto item = items[i]; + const auto itemKind = + item["kind"].as<std::string>() == "string" ? ItemKind::String : ItemKind::File; + const auto itemMimeType = QString::fromStdString(item["type"].as<std::string>()); + + switch (itemKind) { + case ItemKind::File: { + ++fileCount; + + qstdweb::File file(item.call<emscripten::val>("getAsFile")); + + QByteArray fileContent(file.size(), Qt::Uninitialized); + file.stream(fileContent.data(), [this, itemMimeType, fileContent]() { + if (!fileContent.isEmpty()) { + if (itemMimeType.startsWith("image/")) { + mimeData->setImageData(imageReader(fileContent)); + } else { + mimeData->setData(itemMimeType, fileContent.data()); + } + } + ++doneCount; + onFileRead(); + }); + break; + } + case ItemKind::String: + if (itemMimeType.contains("STRING", Qt::CaseSensitive) + || itemMimeType.contains("TEXT", Qt::CaseSensitive)) { + break; + } + QString a; + const QString data = QString::fromJsString(webDataTransfer.call<emscripten::val>( + "getData", emscripten::val(itemMimeType.toStdString()))); + + if (!data.isEmpty()) { + if (itemMimeType == "text/html") + mimeData->setHtml(data); + else if (itemMimeType.isEmpty() || itemMimeType == "text/plain") + mimeData->setText(data); // the type can be empty + else + mimeData->setData(itemMimeType, data.toLocal8Bit()); + } + break; + } + } + + onFileRead(); + } + + void onFileRead() + { + Q_ASSERT(doneCount <= fileCount); + if (doneCount < fileCount) + return; + + std::unique_ptr<DataTransferReader> deleteThisLater(this); + if (!cancellationFlag.expired()) + onCompleted(std::move(mimeData)); + } + + int fileCount = 0; + int doneCount = 0; + std::unique_ptr<QMimeData> mimeData; + std::function<QVariant(QByteArray)> imageReader; + DoneCallback onCompleted; + + std::weak_ptr<CancellationFlag> cancellationFlag; +}; + } // namespace ArrayBuffer::ArrayBuffer(uint32_t size) @@ -738,6 +845,13 @@ bool haveAsyncify() return HaveAsyncify; } +std::shared_ptr<CancellationFlag> +readDataTransfer(emscripten::val webDataTransfer, std::function<QVariant(QByteArray)> imageReader, + std::function<void(std::unique_ptr<QMimeData>)> onDone) +{ + return DataTransferReader::read(webDataTransfer, std::move(imageReader), std::move(onDone)); +} + } // namespace qstdweb QT_END_NAMESPACE diff --git a/src/corelib/platform/wasm/qstdweb_p.h b/src/corelib/platform/wasm/qstdweb_p.h index d8c0db191b..204343baaa 100644 --- a/src/corelib/platform/wasm/qstdweb_p.h +++ b/src/corelib/platform/wasm/qstdweb_p.h @@ -16,15 +16,22 @@ // #include <private/qglobal_p.h> +#include <QtCore/qglobal.h> +#include "QtCore/qhash.h" + #include <emscripten/val.h> + #include <cstdint> #include <functional> -#include "initializer_list" -#include <QtCore/qglobal.h> -#include "QtCore/qhash.h" +#include <initializer_list> +#include <memory> +#include <string> +#include <utility> QT_BEGIN_NAMESPACE +class QMimeData; + namespace qstdweb { extern const char makeContextfulPromiseFunctionName[]; @@ -195,6 +202,14 @@ namespace qstdweb { } bool haveAsyncify(); + + struct CancellationFlag + { + }; + + std::shared_ptr<CancellationFlag> + readDataTransfer(emscripten::val webObject, std::function<QVariant(QByteArray)> imageReader, + std::function<void(std::unique_ptr<QMimeData>)> onDone); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmclipboard.cpp b/src/plugins/platforms/wasm/qwasmclipboard.cpp index 24523aacbf..215ff50aa0 100644 --- a/src/plugins/platforms/wasm/qwasmclipboard.cpp +++ b/src/plugins/platforms/wasm/qwasmclipboard.cpp @@ -2,20 +2,18 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "qwasmclipboard.h" +#include "qwasmdom.h" #include "qwasmwindow.h" #include <private/qstdweb_p.h> -#include <emscripten.h> -#include <emscripten/html5.h> -#include <emscripten/bind.h> -#include <emscripten/val.h> - #include <QCoreApplication> #include <qpa/qwindowsysteminterface.h> #include <QBuffer> #include <QString> +#include <emscripten/val.h> + QT_BEGIN_NAMESPACE using namespace emscripten; @@ -67,93 +65,29 @@ static void qClipboardCopyTo(val event) commonCopyEvent(event); } -static void qWasmClipboardPaste(QMimeData *mData) -{ - // Persist clipboard data so that the app can read it when handling the CTRL+V - QWasmIntegration::get()->clipboard()-> - QPlatformClipboard::setMimeData(mData, QClipboard::Clipboard); - - QWindowSystemInterface::handleKeyEvent( - 0, QEvent::KeyPress, Qt::Key_V, Qt::ControlModifier, "V"); -} - -static void qClipboardPasteTo(val dataTransfer) +static void qClipboardPasteTo(val event) { - enum class ItemKind { - File, - String, - }; - - struct Data - { - std::unique_ptr<QMimeData> data; - int fileCount = 0; - int doneCount = 0; - }; - - auto sharedData = std::make_shared<Data>(); - sharedData->data = std::make_unique<QMimeData>(); - - auto continuation = [sharedData]() { - Q_ASSERT(sharedData->doneCount <= sharedData->fileCount); - if (sharedData->doneCount < sharedData->fileCount) - return; - - if (!sharedData->data->formats().isEmpty()) - qWasmClipboardPaste(sharedData->data.release()); - }; - - const val clipboardData = dataTransfer["clipboardData"]; - const val items = clipboardData["items"]; - for (int i = 0; i < items["length"].as<int>(); ++i) { - const val item = items[i]; - const auto itemKind = - item["kind"].as<std::string>() == "string" ? ItemKind::String : ItemKind::File; - const auto itemMimeType = QString::fromStdString(item["type"].as<std::string>()); - - switch (itemKind) { - case ItemKind::File: { - ++sharedData->fileCount; - - qstdweb::File file(item.call<emscripten::val>("getAsFile")); - - QByteArray fileContent(file.size(), Qt::Uninitialized); - file.stream(fileContent.data(), - [continuation, itemMimeType, fileContent, sharedData]() { - if (!fileContent.isEmpty()) { - if (itemMimeType.startsWith("image/")) { - QImage image; - image.loadFromData(fileContent, nullptr); - sharedData->data->setImageData(image); - } else { - sharedData->data->setData(itemMimeType, fileContent.data()); - } - } - ++sharedData->doneCount; - continuation(); - }); - break; - } - case ItemKind::String: - if (itemMimeType.contains("STRING", Qt::CaseSensitive) - || itemMimeType.contains("TEXT", Qt::CaseSensitive)) { - break; - } - const QString data = QString::fromJsString( - clipboardData.call<val>("getData", val(itemMimeType.toStdString()))); - - if (!data.isEmpty()) { - if (itemMimeType == "text/html") - sharedData->data->setHtml(data); - else if (itemMimeType.isEmpty() || itemMimeType == "text/plain") - sharedData->data->setText(data); // the type can be empty - else - sharedData->data->setData(itemMimeType, data.toLocal8Bit()); - } - break; - } - } - continuation(); + event.call<void>("preventDefault"); // prevent browser from handling drop event + + static std::shared_ptr<qstdweb::CancellationFlag> readDataCancellation = nullptr; + readDataCancellation = qstdweb::readDataTransfer( + event["clipboardData"], + [](QByteArray fileContent) { + QImage image; + image.loadFromData(fileContent, nullptr); + return image; + }, + [event](std::unique_ptr<QMimeData> data) { + if (data->formats().isEmpty()) + return; + + // Persist clipboard data so that the app can read it when handling the CTRL+V + QWasmIntegration::get()->clipboard()->QPlatformClipboard::setMimeData( + data.release(), QClipboard::Clipboard); + + QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyPress, Qt::Key_V, + Qt::ControlModifier, "V"); + }); } EMSCRIPTEN_BINDINGS(qtClipboardModule) { diff --git a/src/plugins/platforms/wasm/qwasmdom.cpp b/src/plugins/platforms/wasm/qwasmdom.cpp index 1573b5bf9c..f9705f1a1c 100644 --- a/src/plugins/platforms/wasm/qwasmdom.cpp +++ b/src/plugins/platforms/wasm/qwasmdom.cpp @@ -3,14 +3,18 @@ #include "qwasmdom.h" +#include <QMimeData> #include <QtCore/qpoint.h> #include <QtCore/qrect.h> +#include <QtGui/qimage.h> +#include <private/qstdweb_p.h> #include <utility> QT_BEGIN_NAMESPACE namespace dom { + void syncCSSClassWith(emscripten::val element, std::string cssClassName, bool flag) { if (flag) { @@ -31,6 +35,7 @@ QPoint mapPoint(emscripten::val source, emscripten::val target, const QPoint &po auto offset = sourceBoundingRect.topLeft() - targetBoundingRect.topLeft(); return (point + offset).toPoint(); } + } // namespace dom QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmdom.h b/src/plugins/platforms/wasm/qwasmdom.h index 92f710a13d..80661fce19 100644 --- a/src/plugins/platforms/wasm/qwasmdom.h +++ b/src/plugins/platforms/wasm/qwasmdom.h @@ -8,6 +8,8 @@ #include <emscripten/val.h> +#include <functional> +#include <memory> #include <string> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmdrag.cpp b/src/plugins/platforms/wasm/qwasmdrag.cpp index 0f3aa9c751..144c30e0fb 100644 --- a/src/plugins/platforms/wasm/qwasmdrag.cpp +++ b/src/plugins/platforms/wasm/qwasmdrag.cpp @@ -3,194 +3,76 @@ #include "qwasmdrag.h" -#include <iostream> -#include <QMimeDatabase> +#include "qwasmdom.h" +#include "qwasmeventtranslator.h" +#include <qpa/qwindowsysteminterface.h> +#include <QMimeData> #include <emscripten.h> -#include <emscripten/html5.h> #include <emscripten/val.h> #include <emscripten/bind.h> -#include <private/qstdweb_p.h> -#include <qpa/qwindowsysteminterface.h> -#include <private/qsimpledrag_p.h> -#include "qwasmcompositor.h" -#include "qwasmeventtranslator.h" -#include <QtCore/QEventLoop> -#include <QMimeData> -#include <private/qshapedpixmapdndwindow_p.h> -QT_BEGIN_NAMESPACE - -using namespace emscripten; - -static void getTextPlainCallback(val m_string) -{ - QWasmDrag *thisDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - thisDrag->m_mimeData->setText(QString::fromStdString(m_string.as<std::string>())); - thisDrag->qWasmDrop(); -} - -static void getTextUrlCallback(val m_string) -{ - QWasmDrag *thisDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - thisDrag->m_mimeData->setData(QStringLiteral("text/uri-list"), - QByteArray::fromStdString(m_string.as<std::string>())); +#include <memory> +#include <string> - thisDrag->qWasmDrop(); -} +QT_BEGIN_NAMESPACE -static void getTextHtmlCallback(val m_string) +namespace { +Qt::DropAction parseDropActions(emscripten::val event) { - QWasmDrag *thisDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - thisDrag->m_mimeData->setHtml(QString::fromStdString(m_string.as<std::string>())); + const std::string dEffect = event["dataTransfer"]["dropEffect"].as<std::string>(); - thisDrag->qWasmDrop(); + if (dEffect == "copy") + return Qt::CopyAction; + else if (dEffect == "move") + return Qt::MoveAction; + else if (dEffect == "link") + return Qt::LinkAction; + return Qt::IgnoreAction; } +} // namespace -static void dropEvent(val event) +void dropEvent(emscripten::val event) { // someone dropped a file into the browser window // event is dataTransfer object // if drop event from outside browser, we do not get any mouse release, maybe mouse move // after the drop event - - // data-context thing was not working here :( - QWasmDrag *wasmDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - - wasmDrag->m_wasmScreen = - reinterpret_cast<QWasmScreen *>(event["target"]["data-qtdropcontext"].as<quintptr>()); - - wasmDrag->m_mouseDropPoint = QPoint(event["x"].as<int>(), event["y"].as<int>()); - wasmDrag->m_mimeData = std::make_unique<QMimeData>(); - wasmDrag->m_qButton = MouseEvent::buttonFromWeb(event["button"].as<int>()); - - wasmDrag->m_keyModifiers = Qt::NoModifier; - if (event["altKey"].as<bool>()) - wasmDrag->m_keyModifiers |= Qt::AltModifier; - if (event["ctrlKey"].as<bool>()) - wasmDrag->m_keyModifiers |= Qt::ControlModifier; - if (event["metaKey"].as<bool>()) - wasmDrag->m_keyModifiers |= Qt::MetaModifier; - event.call<void>("preventDefault"); // prevent browser from handling drop event - std::string dEffect = event["dataTransfer"]["dropEffect"].as<std::string>(); - - wasmDrag->m_dropActions = Qt::IgnoreAction; - if (dEffect == "copy") - wasmDrag->m_dropActions = Qt::CopyAction; - if (dEffect == "move") - wasmDrag->m_dropActions = Qt::MoveAction; - if (dEffect == "link") - wasmDrag->m_dropActions = Qt::LinkAction; - - val dt = event["dataTransfer"]["items"]["length"]; - - val typesCount = event["dataTransfer"]["types"]["length"]; - - // handle mimedata - int count = dt.as<int>(); - wasmDrag->m_mimeTypesCount = count; - // kind is file type: file or string - for (int i = 0; i < count; i++) { - val item = event["dataTransfer"]["items"][i]; - val kind = item["kind"]; - val fileType = item["type"]; - - if (kind.as<std::string>() == "file") { - val m_file = item.call<val>("getAsFile"); - if (m_file.isUndefined()) { - continue; - } - - qstdweb::File file(m_file); - - QString mimeFormat = QString::fromStdString(file.type()); - QByteArray fileContent; - fileContent.resize(file.size()); - - file.stream(fileContent.data(), [mimeFormat, fileContent]() { - if (!fileContent.isEmpty()) { - QWasmDrag *wasmDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - if (mimeFormat.contains("image")) { - QImage image; - image.loadFromData(fileContent, nullptr); - wasmDrag->m_mimeData->setImageData(image); - } else { - wasmDrag->m_mimeData->setData(mimeFormat, fileContent.data()); - } - wasmDrag->qWasmDrop(); - } + static std::shared_ptr<qstdweb::CancellationFlag> readDataCancellation = nullptr; + readDataCancellation = qstdweb::readDataTransfer( + event["dataTransfer"], + [](QByteArray fileContent) { + QImage image; + image.loadFromData(fileContent, nullptr); + return image; + }, + [wasmScreen = reinterpret_cast<QWasmScreen *>( + event["target"]["data-qtdropcontext"].as<quintptr>()), + event](std::unique_ptr<QMimeData> data) { + const auto mouseDropPoint = QPoint(event["x"].as<int>(), event["y"].as<int>()); + const auto button = MouseEvent::buttonFromWeb(event["button"].as<int>()); + const Qt::KeyboardModifiers modifiers = KeyboardModifier::getForEvent(event); + const auto dropAction = parseDropActions(event); + auto *window = wasmScreen->topLevelAt(mouseDropPoint); + + QWindowSystemInterface::handleDrag(window, data.get(), mouseDropPoint, dropAction, + button, modifiers); + + // drag drop + QWindowSystemInterface::handleDrop(window, data.get(), mouseDropPoint, dropAction, + button, modifiers); + + // drag leave + QWindowSystemInterface::handleDrag(window, nullptr, QPoint(), Qt::IgnoreAction, {}, + {}); }); - - } else { // string - - if (fileType.as<std::string>() == "text/uri-list" - || fileType.as<std::string>() == "text/x-moz-url") { - item.call<val>("getAsString", val::module_property("qtgetTextUrl")); - } else if (fileType.as<std::string>() == "text/html") { - item.call<val>("getAsString", val::module_property("qtgetTextHtml")); - } else { // handle everything else here as plain text - item.call<val>("getAsString", val::module_property("qtgetTextPlain")); - } - } - } } EMSCRIPTEN_BINDINGS(drop_module) { function("qtDrop", &dropEvent); - function("qtgetTextPlain", &getTextPlainCallback); - function("qtgetTextUrl", &getTextUrlCallback); - function("qtgetTextHtml", &getTextHtmlCallback); -} - -QWasmDrag::QWasmDrag() -{ - init(); -} - -QWasmDrag::~QWasmDrag() = default; - -void QWasmDrag::init() { } - -void QWasmDrag::drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) -{ - QSimpleDrag::drop(globalPos, b, mods); -} - -void QWasmDrag::move(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) -{ - QSimpleDrag::move(globalPos, b, mods); -} - -void QWasmDrag::qWasmDrop() -{ - // collect mime - QWasmDrag *thisDrag = static_cast<QWasmDrag *>(QWasmIntegration::get()->drag()); - - if (thisDrag->m_mimeTypesCount != thisDrag->m_mimeData->formats().size()) - return; // keep collecting mimetypes - - // start drag enter - QWindowSystemInterface::handleDrag( - thisDrag->m_wasmScreen->topLevelAt(thisDrag->m_mouseDropPoint), - thisDrag->m_mimeData.get(), thisDrag->m_mouseDropPoint, thisDrag->m_dropActions, - thisDrag->m_qButton, thisDrag->m_keyModifiers); - - // drag drop - QWindowSystemInterface::handleDrop( - thisDrag->m_wasmScreen->topLevelAt(thisDrag->m_mouseDropPoint), - thisDrag->m_mimeData.get(), thisDrag->m_mouseDropPoint, thisDrag->m_dropActions, - thisDrag->m_qButton, thisDrag->m_keyModifiers); - - // drag leave - QWindowSystemInterface::handleDrag( - thisDrag->m_wasmScreen->topLevelAt(thisDrag->m_mouseDropPoint), nullptr, QPoint(), - Qt::IgnoreAction, {}, {}); - - thisDrag->m_mimeData->clear(); - thisDrag->m_mimeTypesCount = 0; } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmdrag.h b/src/plugins/platforms/wasm/qwasmdrag.h index b13c663e3c..624e9e3db6 100644 --- a/src/plugins/platforms/wasm/qwasmdrag.h +++ b/src/plugins/platforms/wasm/qwasmdrag.h @@ -4,37 +4,13 @@ #ifndef QWASMDRAG_H #define QWASMDRAG_H -#include <qpa/qplatformdrag.h> -#include <private/qsimpledrag_p.h> -#include <private/qstdweb_p.h> -#include <QDrag> -#include "qwasmscreen.h" +#include <QtCore/qtconfigmacros.h> -QT_REQUIRE_CONFIG(draganddrop); +#include <emscripten/val.h> QT_BEGIN_NAMESPACE -class QWasmDrag : public QSimpleDrag -{ -public: - QWasmDrag(); - ~QWasmDrag(); - - void drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override; - void move(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override; - - Qt::MouseButton m_qButton; - QPoint m_mouseDropPoint; - QFlags<Qt::KeyboardModifier> m_keyModifiers; - Qt::DropActions m_dropActions; - QWasmScreen *m_wasmScreen = nullptr; - int m_mimeTypesCount = 0; - std::unique_ptr<QMimeData> m_mimeData; - void qWasmDrop(); - -private: - void init(); -}; +void dropEvent(emscripten::val event); QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasmintegration.cpp b/src/plugins/platforms/wasm/qwasmintegration.cpp index fa4ae981bb..090218a118 100644 --- a/src/plugins/platforms/wasm/qwasmintegration.cpp +++ b/src/plugins/platforms/wasm/qwasmintegration.cpp @@ -80,6 +80,12 @@ QWasmIntegration::QWasmIntegration() m_clipboard(new QWasmClipboard), m_accessibility(new QWasmAccessibility) { + // Temporary measure to make dropEvent appear in the library. EMSCRIPTEN_KEEPALIVE does not + // work, nor does a Q_CONSTRUCTOR_FUNCTION in qwasmdrag.cpp. + volatile bool foolEmcc = false; + if (foolEmcc) + dropEvent(emscripten::val::undefined()); + s_instance = this; touchPoints = emscripten::val::global("navigator")["maxTouchPoints"].as<int>(); @@ -121,7 +127,7 @@ QWasmIntegration::QWasmIntegration() visualViewport.call<void>("addEventListener", val("resize"), val::module_property("qtResizeAllScreens")); } - m_drag = new QWasmDrag(); + m_drag = std::make_unique<QSimpleDrag>(); } QWasmIntegration::~QWasmIntegration() @@ -138,7 +144,6 @@ QWasmIntegration::~QWasmIntegration() delete m_desktopServices; if (m_platformInputContext) delete m_platformInputContext; - delete m_drag; delete m_accessibility; for (const auto &elementAndScreen : m_screens) @@ -330,7 +335,7 @@ quint64 QWasmIntegration::getTimestamp() #if QT_CONFIG(draganddrop) QPlatformDrag *QWasmIntegration::drag() const { - return m_drag; + return m_drag.get(); } #endif // QT_CONFIG(draganddrop) diff --git a/src/plugins/platforms/wasm/qwasmintegration.h b/src/plugins/platforms/wasm/qwasmintegration.h index 76296ff1a7..8468c4c9e1 100644 --- a/src/plugins/platforms/wasm/qwasmintegration.h +++ b/src/plugins/platforms/wasm/qwasmintegration.h @@ -6,23 +6,25 @@ #include "qwasmwindow.h" +#include "qwasminputcontext.h" + #include <qpa/qplatformintegration.h> #include <qpa/qplatformscreen.h> #include <qpa/qplatforminputcontext.h> +#if QT_CONFIG(draganddrop) +# include "qwasmdrag.h" +#endif + #include <QtCore/qhash.h> +#include <private/qsimpledrag_p.h> +#include <private/qstdweb_p.h> + #include <emscripten.h> #include <emscripten/html5.h> #include <emscripten/val.h> -#include "qwasminputcontext.h" -#include <private/qstdweb_p.h> - -#if QT_CONFIG(draganddrop) -#include "qwasmdrag.h" -#endif - QT_BEGIN_NAMESPACE class QWasmEventTranslator; @@ -97,7 +99,7 @@ private: mutable QWasmInputContext *m_platformInputContext = nullptr; #if QT_CONFIG(draganddrop) - QWasmDrag *m_drag; + std::unique_ptr<QSimpleDrag> m_drag; #endif }; |