wasm: tidy up qwasmcclipboard.cpp/h

Use private class functions and data. Move static paste
function out of the class, next to the other static event
handlers. Remove writeToClipboard()'s unused argument.

Change-Id: I9098290a3885dc540ea29a989fe3e83f8f4d5396
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
This commit is contained in:
Morten Sørvig 2022-09-20 09:47:19 +02:00
parent 153a3245dc
commit af987e0f66
2 changed files with 34 additions and 28 deletions

View File

@ -49,7 +49,7 @@ static void commonCopyEvent(val event)
static void qClipboardCutTo(val event) static void qClipboardCutTo(val event)
{ {
if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi) { if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi()) {
// Send synthetic Ctrl+X to make the app cut data to Qt's clipboard // Send synthetic Ctrl+X to make the app cut data to Qt's clipboard
QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>( QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>(
0, QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier, "X"); 0, QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier, "X");
@ -60,7 +60,7 @@ static void qClipboardCutTo(val event)
static void qClipboardCopyTo(val event) static void qClipboardCopyTo(val event)
{ {
if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi) { if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi()) {
// Send synthetic Ctrl+C to make the app copy data to Qt's clipboard // Send synthetic Ctrl+C to make the app copy data to Qt's clipboard
QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>( QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>(
0, QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier, "C"); 0, QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier, "C");
@ -68,6 +68,16 @@ static void qClipboardCopyTo(val event)
commonCopyEvent(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<QWindowSystemInterface::SynchronousDelivery>(
0, QEvent::KeyPress, Qt::Key_V, Qt::ControlModifier, "V");
}
static void qClipboardPasteTo(val dataTransfer) static void qClipboardPasteTo(val dataTransfer)
{ {
val clipboardData = dataTransfer["clipboardData"]; val clipboardData = dataTransfer["clipboardData"];
@ -123,13 +133,13 @@ static void qClipboardPasteTo(val dataTransfer)
} else { } else {
mMimeData->setData(mimeFormat,fileContent.data()); mMimeData->setData(mimeFormat,fileContent.data());
} }
QWasmClipboard::qWasmClipboardPaste(mMimeData); qWasmClipboardPaste(mMimeData);
} }
}); });
} // next item } // next item
} }
} }
QWasmClipboard::qWasmClipboardPaste(mMimeData); qWasmClipboardPaste(mMimeData);
} }
EMSCRIPTEN_BINDINGS(qtClipboardModule) { EMSCRIPTEN_BINDINGS(qtClipboardModule) {
@ -143,9 +153,9 @@ QWasmClipboard::QWasmClipboard()
val clipboard = val::global("navigator")["clipboard"]; val clipboard = val::global("navigator")["clipboard"];
const bool hasPermissionsApi = !val::global("navigator")["permissions"].isUndefined(); const bool hasPermissionsApi = !val::global("navigator")["permissions"].isUndefined();
hasClipboardApi = !clipboard.isUndefined() && !clipboard["readText"].isUndefined(); m_hasClipboardApi = !clipboard.isUndefined() && !clipboard["readText"].isUndefined();
if (hasClipboardApi && hasPermissionsApi) if (m_hasClipboardApi && hasPermissionsApi)
initClipboardPermissions(); initClipboardPermissions();
} }
@ -165,10 +175,10 @@ void QWasmClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
{ {
// handle setText/ setData programmatically // handle setText/ setData programmatically
QPlatformClipboard::setMimeData(mimeData, mode); QPlatformClipboard::setMimeData(mimeData, mode);
if (hasClipboardApi) if (m_hasClipboardApi)
writeToClipboardApi(); writeToClipboardApi();
else else
writeToClipboard(mimeData); writeToClipboard();
} }
QWasmClipboard::ProcessKeyboardResult QWasmClipboard::ProcessKeyboardResult
@ -183,7 +193,7 @@ QWasmClipboard::processKeyboard(const QWasmEventTranslator::TranslatedEvent &eve
const bool isPaste = event.key == Qt::Key_V; const bool isPaste = event.key == Qt::Key_V;
return hasClipboardApi && !isPaste return m_hasClipboardApi && !isPaste
? ProcessKeyboardResult::NativeClipboardEventAndCopiedDataNeeded ? ProcessKeyboardResult::NativeClipboardEventAndCopiedDataNeeded
: ProcessKeyboardResult::NativeClipboardEventNeeded; : ProcessKeyboardResult::NativeClipboardEventNeeded;
} }
@ -199,16 +209,6 @@ bool QWasmClipboard::ownsMode(QClipboard::Mode mode) const
return false; return false;
} }
void QWasmClipboard::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<QWindowSystemInterface::SynchronousDelivery>(
0, QEvent::KeyPress, Qt::Key_V, Qt::ControlModifier, "V");
}
void QWasmClipboard::initClipboardPermissions() void QWasmClipboard::initClipboardPermissions()
{ {
val permissions = val::global("navigator")["permissions"]; val permissions = val::global("navigator")["permissions"];
@ -243,16 +243,20 @@ void QWasmClipboard::installEventHandlers(const emscripten::val &canvas)
val::module_property("qtClipboardPasteTo"), true); val::module_property("qtClipboardPasteTo"), true);
} }
bool QWasmClipboard::hasClipboardApi()
{
return m_hasClipboardApi;
}
void QWasmClipboard::writeToClipboardApi() void QWasmClipboard::writeToClipboardApi()
{ {
if (!QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi) Q_ASSERT(!m_hasClipboardApi);
return;
// copy event // copy event
// browser event handler detected ctrl c if clipboard API // browser event handler detected ctrl c if clipboard API
// or Qt call from keyboard event handler // or Qt call from keyboard event handler
QMimeData *_mimes = QWasmIntegration::get()->getWasmClipboard()->mimeData(QClipboard::Clipboard); QMimeData *_mimes = mimeData(QClipboard::Clipboard);
if (!_mimes) if (!_mimes)
return; return;
@ -340,9 +344,8 @@ void QWasmClipboard::writeToClipboardApi()
clipboardWriteArray); clipboardWriteArray);
} }
void QWasmClipboard::writeToClipboard(const QMimeData *data) void QWasmClipboard::writeToClipboard()
{ {
Q_UNUSED(data)
// this works for firefox, chrome by generating // this works for firefox, chrome by generating
// copy event, but not safari // copy event, but not safari
// execCommand has been deemed deprecated in the docs, but browsers do not seem // execCommand has been deemed deprecated in the docs, but browsers do not seem

View File

@ -34,14 +34,17 @@ public:
bool supportsMode(QClipboard::Mode mode) const override; bool supportsMode(QClipboard::Mode mode) const override;
bool ownsMode(QClipboard::Mode mode) const override; bool ownsMode(QClipboard::Mode mode) const override;
static void qWasmClipboardPaste(QMimeData *mData);
ProcessKeyboardResult processKeyboard(const QWasmEventTranslator::TranslatedEvent &event, ProcessKeyboardResult processKeyboard(const QWasmEventTranslator::TranslatedEvent &event,
const QFlags<Qt::KeyboardModifier> &modifiers); const QFlags<Qt::KeyboardModifier> &modifiers);
void initClipboardPermissions();
void installEventHandlers(const emscripten::val &canvas); void installEventHandlers(const emscripten::val &canvas);
bool hasClipboardApi; bool hasClipboardApi();
private:
void initClipboardPermissions();
void writeToClipboardApi(); void writeToClipboardApi();
void writeToClipboard(const QMimeData *data); void writeToClipboard();
bool m_hasClipboardApi = false;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE