Make the clipboard paste from the outside work correctly

During the previous refactoring, two exceptions that triggered
native copy/paste events were omitted.

Fixes: QTBUG-106668
Change-Id: Ie61dd6a0c1d9d2fdd47bd94be055d0221feae25b
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
(cherry picked from commit 38049164c370dd424afe0c4574b458f7bd79083b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
Mikolaj Boc 2022-09-16 15:34:03 +02:00 committed by Qt Cherry-pick Bot
parent eb8aab9b60
commit bc01540a6d
3 changed files with 34 additions and 17 deletions

View File

@ -284,19 +284,21 @@ void QWasmClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
isPaste = false; isPaste = false;
} }
bool QWasmClipboard::processKeyboard(const QWasmEventTranslator::TranslatedEvent &event, QWasmClipboard::ProcessKeyboardResult
QWasmClipboard::processKeyboard(const QWasmEventTranslator::TranslatedEvent &event,
const QFlags<Qt::KeyboardModifier> &modifiers) const QFlags<Qt::KeyboardModifier> &modifiers)
{ {
// Clipboard path: cut/copy/paste are handled by clipboard event or direct clipboard if (event.type != QEvent::KeyPress || !modifiers.testFlag(Qt::ControlModifier))
// access. return ProcessKeyboardResult::Ignored;
if (hasClipboardApi)
return false; if (event.key != Qt::Key_C && event.key != Qt::Key_V && event.key != Qt::Key_X)
if (event.type != QEvent::KeyPress || !modifiers.testFlag(Qt::ControlModifier) return ProcessKeyboardResult::Ignored;
|| (event.key != Qt::Key_C && event.key != Qt::Key_V && event.key != Qt::Key_X)) {
return false;
}
isPaste = event.key == Qt::Key_V; isPaste = event.key == Qt::Key_V;
return true;
return hasClipboardApi && !isPaste
? ProcessKeyboardResult::NativeClipboardEventAndCopiedDataNeeded
: ProcessKeyboardResult::NativeClipboardEventNeeded;
} }
bool QWasmClipboard::supportsMode(QClipboard::Mode mode) const bool QWasmClipboard::supportsMode(QClipboard::Mode mode) const

View File

@ -19,6 +19,12 @@ QT_BEGIN_NAMESPACE
class QWasmClipboard : public QObject, public QPlatformClipboard class QWasmClipboard : public QObject, public QPlatformClipboard
{ {
public: public:
enum class ProcessKeyboardResult {
Ignored,
NativeClipboardEventNeeded,
NativeClipboardEventAndCopiedDataNeeded,
};
QWasmClipboard(); QWasmClipboard();
virtual ~QWasmClipboard(); virtual ~QWasmClipboard();
@ -29,7 +35,7 @@ public:
bool ownsMode(QClipboard::Mode mode) const override; bool ownsMode(QClipboard::Mode mode) const override;
static void qWasmClipboardPaste(QMimeData *mData); static void qWasmClipboardPaste(QMimeData *mData);
bool processKeyboard(const QWasmEventTranslator::TranslatedEvent &event, ProcessKeyboardResult processKeyboard(const QWasmEventTranslator::TranslatedEvent &event,
const QFlags<Qt::KeyboardModifier> &modifiers); const QFlags<Qt::KeyboardModifier> &modifiers);
void initClipboardPermissions(); void initClipboardPermissions();
void installEventHandlers(const emscripten::val &canvas); void installEventHandlers(const emscripten::val &canvas);

View File

@ -1146,21 +1146,30 @@ void QWasmCompositor::WindowManipulation::onPointerUp(const PointerEvent& event)
bool QWasmCompositor::processKeyboard(int eventType, const EmscriptenKeyboardEvent *emKeyEvent) bool QWasmCompositor::processKeyboard(int eventType, const EmscriptenKeyboardEvent *emKeyEvent)
{ {
constexpr bool ProceedToNativeEvent = false;
Q_ASSERT(eventType == EMSCRIPTEN_EVENT_KEYDOWN || eventType == EMSCRIPTEN_EVENT_KEYUP); Q_ASSERT(eventType == EMSCRIPTEN_EVENT_KEYDOWN || eventType == EMSCRIPTEN_EVENT_KEYUP);
auto translatedEvent = m_eventTranslator->translateKeyEvent(eventType, emKeyEvent); auto translatedEvent = m_eventTranslator->translateKeyEvent(eventType, emKeyEvent);
const QFlags<Qt::KeyboardModifier> modifiers = KeyboardModifier::getForEvent(*emKeyEvent); const QFlags<Qt::KeyboardModifier> modifiers = KeyboardModifier::getForEvent(*emKeyEvent);
if (QWasmIntegration::get()->getWasmClipboard()->processKeyboard(translatedEvent, modifiers)) const auto clipboardResult = QWasmIntegration::get()->getWasmClipboard()->processKeyboard(
return false; translatedEvent, modifiers);
using ProcessKeyboardResult = QWasmClipboard::ProcessKeyboardResult;
if (clipboardResult == ProcessKeyboardResult::NativeClipboardEventNeeded)
return ProceedToNativeEvent;
if (translatedEvent.text.isEmpty()) if (translatedEvent.text.isEmpty())
translatedEvent.text = QString(emKeyEvent->key); translatedEvent.text = QString(emKeyEvent->key);
if (translatedEvent.text.size() > 1) if (translatedEvent.text.size() > 1)
translatedEvent.text.clear(); translatedEvent.text.clear();
return QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>( const auto result =
QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>(
0, translatedEvent.type, translatedEvent.key, modifiers, translatedEvent.text); 0, translatedEvent.type, translatedEvent.key, modifiers, translatedEvent.text);
return clipboardResult == ProcessKeyboardResult::NativeClipboardEventAndCopiedDataNeeded
? ProceedToNativeEvent
: result;
} }
bool QWasmCompositor::processWheel(int eventType, const EmscriptenWheelEvent *wheelEvent) bool QWasmCompositor::processWheel(int eventType, const EmscriptenWheelEvent *wheelEvent)