diff --git a/src/plugins/platforms/wasm/qwasmclipboard.cpp b/src/plugins/platforms/wasm/qwasmclipboard.cpp index 713adee8f9..acf0ceb571 100644 --- a/src/plugins/platforms/wasm/qwasmclipboard.cpp +++ b/src/plugins/platforms/wasm/qwasmclipboard.cpp @@ -43,6 +43,7 @@ using namespace emscripten; // there has got to be a better way... static QString g_clipboardText; static QString g_clipboardFormat; +static bool g_onListener = false; static val getClipboardData() { @@ -70,6 +71,7 @@ static void qClipboardPromiseResolve(emscripten::val something) static void qClipboardCutTo(val event) { + g_onListener = true; if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi) { // Send synthetic Ctrl+X to make the app cut data to Qt's clipboard QWindowSystemInterface::handleKeyEvent( @@ -81,10 +83,12 @@ static void qClipboardCutTo(val event) val clipFormat = module.call("qtGetClipboardFormat"); event["clipboardData"].call("setData", clipFormat, clipdata); event.call("preventDefault"); + g_onListener = false; } static void qClipboardCopyTo(val event) { + g_onListener = true; if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi) { // Send synthetic Ctrl+C to make the app copy data to Qt's clipboard QWindowSystemInterface::handleKeyEvent( @@ -96,6 +100,7 @@ static void qClipboardCopyTo(val event) val clipFormat = module.call("qtGetClipboardFormat"); event["clipboardData"].call("setData", clipFormat, clipdata); event.call("preventDefault"); + g_onListener = false; } static void qClipboardPasteTo(val event) @@ -157,6 +162,14 @@ void QWasmClipboard::setMimeData(QMimeData* mimeData, QClipboard::Mode mode) } QPlatformClipboard::setMimeData(mimeData, mode); + + if (hasClipboardApi) + writeTextToClipboard(); + else if (!g_onListener) + { + val document = val::global("document"); + document.call("execCommand", val("copy")); + } } bool QWasmClipboard::supportsMode(QClipboard::Mode mode) const @@ -195,15 +208,14 @@ void QWasmClipboard::initClipboardEvents() void QWasmClipboard::installEventHandlers(const emscripten::val &canvas) { - if (hasClipboardApi) - return; + val document = val::global("document"); // Fallback path for browsers which do not support direct clipboard access - canvas.call("addEventListener", val("cut"), + document.call("addEventListener", val("cut"), val::module_property("qtClipboardCutTo")); - canvas.call("addEventListener", val("copy"), + document.call("addEventListener", val("copy"), val::module_property("qtClipboardCopyTo")); - canvas.call("addEventListener", val("paste"), + document.call("addEventListener", val("paste"), val::module_property("qtClipboardPasteTo")); }