From 020a7e96d448caab86198f09d84b50be205da906 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Mon, 27 Nov 2023 11:37:24 +1000 Subject: [PATCH] wasm: move keyboard input handling for touchscreens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's better served where all keys are handled, and fixes bug with modifier keys Fixes: QTBUG-118503 Pick-to: 6.6 Change-Id: Ic53d1b332bd918dbc4fdd27ea4e43ad1e1ecce82 Reviewed-by: Morten Johan Sørvig (cherry picked from commit 75ac9adeda41194e1733c69b3176fc2a368a369e) Reviewed-by: Qt Cherry-pick Bot --- .../platforms/wasm/qwasminputcontext.cpp | 20 ------------------- .../platforms/wasm/qwasminputcontext.h | 4 +--- src/plugins/platforms/wasm/qwasmwindow.cpp | 15 ++++++++++++-- 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasminputcontext.cpp b/src/plugins/platforms/wasm/qwasminputcontext.cpp index 25b37e6930a..92fc1767d17 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.cpp +++ b/src/plugins/platforms/wasm/qwasminputcontext.cpp @@ -59,12 +59,6 @@ QWasmInputContext::QWasmInputContext() emscripten::val(quintptr(reinterpret_cast(this)))); emscripten::val body = document["body"]; body.call("appendChild", m_inputElement); - - // Enter is sent through target window, let's just handle this here - emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, (void *)this, 1, - &inputMethodKeyboardCallback); - emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, (void *)this, 1, - &inputMethodKeyboardCallback); } if (platform() == Platform::MacOS || platform() == Platform::iOS) { @@ -163,19 +157,5 @@ void QWasmInputContext::inputStringChanged(QString &inputString, int eventType, eventType == EMSCRIPTEN_EVENT_KEYDOWN ? inputString : QStringLiteral("")); } -int QWasmInputContext::inputMethodKeyboardCallback(int eventType, - const EmscriptenKeyboardEvent *keyEvent, - void *userData) -{ - // we get Enter, Backspace and function keys via emscripten on target window - QString strKey(keyEvent->key); - if (strKey == "Unidentified" || strKey == "Process") - return false; - - QWasmInputContext *wasmInput = reinterpret_cast(userData); - wasmInput->inputStringChanged(strKey, eventType, wasmInput); - - return true; -} QT_END_NAMESPACE diff --git a/src/plugins/platforms/wasm/qwasminputcontext.h b/src/plugins/platforms/wasm/qwasminputcontext.h index eb840742fc9..10dd1a09506 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.h +++ b/src/plugins/platforms/wasm/qwasminputcontext.h @@ -30,6 +30,7 @@ public: void focusWindowChanged(QWindow *focusWindow); void inputStringChanged(QString &, int eventType, QWasmInputContext *context); + emscripten::val m_inputElement = emscripten::val::null(); private: emscripten::val inputHandlerElementForFocusedWindow(); @@ -37,11 +38,8 @@ private: bool m_inputPanelVisible = false; QPointer m_focusWindow; - emscripten::val m_inputElement = emscripten::val::null(); std::unique_ptr m_blurEventHandler; std::unique_ptr m_inputEventHandler; - static int inputMethodKeyboardCallback(int eventType, - const EmscriptenKeyboardEvent *keyEvent, void *userData); bool inputPanelIsOpen = false; }; diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index 249d1fdfc93..f9861bb4dba 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -127,9 +127,20 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmDeadKeySupport *deadKeySupport, event.call("stopPropagation"); }); + emscripten::val keyFocusWindow; + if (QWasmIntegration::get()->inputContext()) { + QWasmInputContext *wasmContext = + static_cast(QWasmIntegration::get()->inputContext()); + // if there is an touchscreen input context, + // use that window for key input + keyFocusWindow = wasmContext->m_inputElement; + } else { + keyFocusWindow = m_qtWindow; + } + m_keyDownCallback = - std::make_unique(m_qtWindow, "keydown", keyCallback); - m_keyUpCallback = std::make_unique(m_qtWindow, "keyup", keyCallback); + std::make_unique(keyFocusWindow, "keydown", keyCallback); + m_keyUpCallback = std::make_unique(keyFocusWindow, "keyup", keyCallback); setParent(parent()); }