From 2630c15a3de65d118afd11bbeb349a415a4aa1d0 Mon Sep 17 00:00:00 2001 From: Andreas Buhr Date: Wed, 13 Oct 2021 11:33:23 +0200 Subject: Revert "[Android] Remove signal and slot mechanism to listen states in editor's" This reverts commit a40a512dec0f34e84eb63812af556608f03713ff. It caused UI freezes and cursor position inconsistencies. See the linked bugs. Pick-to: 6.2 6.2.1 5.15 Task-number: QTBUG-58013 Task-number: QTBUG-93414 Task-number: QTBUG-95669 Task-number: QTBUG-96671 Task-number: QTBUG-96675 Task-number: QTBUG-96769 Change-Id: Ie8100538609a1460713ca9115cdbe329654d0772 Reviewed-by: Paul Olav Tvete Reviewed-by: Assam Boudjelthia --- .../platforms/android/qandroidinputcontext.cpp | 43 ++++------------------ .../platforms/android/qandroidinputcontext.h | 2 +- 2 files changed, 8 insertions(+), 37 deletions(-) (limited to 'src/plugins/platforms/android') diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index fb51e1dba1..bfc1a1109f 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -882,44 +882,9 @@ void QAndroidInputContext::update(Qt::InputMethodQueries queries) QSharedPointer query = focusObjectInputMethodQuery(queries); if (query.isNull()) return; - - if (query->value(Qt::ImCursorPosition).toInt() >= 0 && - query->value(Qt::ImSurroundingText).toString() - .left(query->value(Qt::ImCursorPosition).toInt()).length() >= 0) { - - // Cursor position should be always valid - // when object is composing - if (focusObjectIsComposing()) - return; - - // NOTE: This seems to be happening sometimes - // when qt quick application is booted up - if (m_focusObject == nullptr) - return; - - if (m_focusObject->isWidgetType()) - updateCursorPosition(); - else - updateCursorPositionInRange(query); - } -} - -void QAndroidInputContext::updateCursorPositionInRange(const QSharedPointer &query) -{ - QObject *input = qGuiApp->focusObject(); - QList attributes; - attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, - query->value(Qt::ImCursorPosition).toInt(), 1)); - - QInputMethodEvent event(QString(), attributes); - QCoreApplication::sendEvent(input, &event); - - QtAndroidInput::updateSelection(query->value(Qt::ImCursorPosition).toInt(), - query->value(Qt::ImCursorPosition).toInt(), 0, - query->value(Qt::ImSurroundingText).toString().length()); +#warning TODO extract the needed data from query } - void QAndroidInputContext::invokeAction(QInputMethod::Action action, int cursorPosition) { #warning TODO Handle at least QInputMethod::ContextMenu action @@ -950,6 +915,12 @@ void QAndroidInputContext::showInputPanel() if (query.isNull()) return; + disconnect(m_updateCursorPosConnection); + if (qGuiApp->focusObject()->metaObject()->indexOfSignal("cursorPositionChanged(int,int)") >= 0) // QLineEdit breaks the pattern + m_updateCursorPosConnection = connect(qGuiApp->focusObject(), SIGNAL(cursorPositionChanged(int,int)), this, SLOT(updateCursorPosition())); + else + m_updateCursorPosConnection = connect(qGuiApp->focusObject(), SIGNAL(cursorPositionChanged()), this, SLOT(updateCursorPosition())); + QRect rect = cursorRect(); if (!isInputPanelVisible()) QtAndroidInput::showSoftwareKeyboard(rect.left(), rect.top(), rect.width(), rect.height(), diff --git a/src/plugins/platforms/android/qandroidinputcontext.h b/src/plugins/platforms/android/qandroidinputcontext.h index 521061b02c..02a66c367a 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.h +++ b/src/plugins/platforms/android/qandroidinputcontext.h @@ -156,13 +156,13 @@ private: void focusObjectStartComposing(); bool focusObjectStopComposing(); QRect cursorRect(); - void updateCursorPositionInRange(const QSharedPointer &query); private: ExtractedText m_extractedText; QString m_composingText; int m_composingTextStart; int m_composingCursor; + QMetaObject::Connection m_updateCursorPosConnection; HandleModes m_handleMode; int m_batchEditNestingLevel; QObject *m_focusObject; -- cgit v1.2.3