From de12ff38f2be5362321aa8e79cfbfd9692e18ab0 Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Tue, 16 Aug 2011 14:02:42 +0300 Subject: Disabled splitscreen translation still moves screen Do not connect (or disconnect) signal cursorPositionChanged() to slot translateInputWidget() if auto-translation of splitview is disabled. Task-number: QTBUG-20813 Reviewed-by: Miikka Heikkinen --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index c3d293b..d0dda83 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -474,7 +474,7 @@ void QCoeFepInputContext::resetSplitViewWidget(bool keepInputWidget) if (!alwaysResize) { if (gv->scene()) { - if (gv->scene()->focusItem()) { + if (gv->scene()->focusItem() && S60->partial_keyboardAutoTranslation) { // Check if the widget contains cursorPositionChanged signal and disconnect from it. QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged())); int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1)); @@ -580,7 +580,7 @@ void QCoeFepInputContext::ensureFocusWidgetVisible(QWidget *widget) if (!moveWithinVisibleArea) { // Check if the widget contains cursorPositionChanged signal and connect to it. QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged())); - if (gv->scene() && gv->scene()->focusItem()) { + if (gv->scene() && gv->scene()->focusItem() && S60->partial_keyboardAutoTranslation) { int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1)); if (index != -1) connect(gv->scene()->focusItem()->toGraphicsObject(), SIGNAL(cursorPositionChanged()), this, SLOT(translateInputWidget())); -- cgit v0.12 From 5aef1b278488fb889e298ce858ae299b83edf5ed Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Wed, 17 Aug 2011 11:46:16 +0300 Subject: Handle CloseSoftwareInputPanel event in QCoeFepInputContext Handle CloseSoftwareInputPanel event in QCoeFepInputContext (i.e. notify the native side that SIP needs to be closed). Note that event is not consumed. Task-number: QTBUG-20033 Reviewed-by: Miikka Heikkinen --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index d0dda83..2202d3a 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -252,9 +252,6 @@ bool QCoeFepInputContext::needsInputPanel() bool QCoeFepInputContext::filterEvent(const QEvent *event) { - // The CloseSoftwareInputPanel event is not handled here, because the VK will automatically - // close when it discovers that the underlying widget does not have input capabilities. - if (!focusWidget()) return false; @@ -318,6 +315,11 @@ bool QCoeFepInputContext::filterEvent(const QEvent *event) if (!needsInputPanel()) return false; + if (event->type() == QEvent::CloseSoftwareInputPanel) { + m_fepState->ReportAknEdStateEventL(MAknEdStateObserver::EAknClosePenInputRequest); + return false; + } + if (event->type() == QEvent::RequestSoftwareInputPanel) { // Only request virtual keyboard if it is not yet active or if this is the first time // panel is requested for this application. -- cgit v0.12 From a2709ef3f4410a1d1755e00353e6f969f8bb5613 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 17 Aug 2011 12:57:14 +0300 Subject: Symbian: Fix backspace on empty lines of multiline textedits Backspace on empty lines of multiline textedits didn't work because in Symbian the virtual keyboard only gets one block of text at a time, and there is some internal optimization in FEP that if the document is empty, backspace doesn't get generated. Fixed by faking document lenght to be one in cases where it is actually zero, except for password fields with hidden text, as an extra asterisk would be generated in those cases. Typically password fields are not multiline so this shouldn't be a problem. Task-number: QTBUG-20444 Reviewed-by: Sami Merila --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index 2202d3a..e22e27c 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -1089,7 +1089,18 @@ TInt QCoeFepInputContext::DocumentLengthForFep() const return 0; QVariant variant = w->inputMethodQuery(Qt::ImSurroundingText); - return variant.value().size() + m_preeditString.size(); + + int size = variant.value().size() + m_preeditString.size(); + + // To fix an issue with backspaces not being generated if document size is zero, + // fake document length to be at least one always, except when dealing with + // hidden text widgets, where this faking would generate extra asterisk. Since the + // primary use of hidden text widgets is password fields, they are unlikely to + // support multiple lines anyway. + if (size == 0 && !(m_textCapabilities & TCoeInputCapabilities::ESecretText)) + size = 1; + + return size; } TInt QCoeFepInputContext::DocumentMaximumLengthForFep() const @@ -1172,6 +1183,12 @@ void QCoeFepInputContext::GetEditorContentForFep(TDes& aEditorContent, TInt aDoc // FEP expects the preedit string to be part of the editor content, so let's mix it in. int cursor = w->inputMethodQuery(Qt::ImCursorPosition).toInt(); text.insert(cursor, m_preeditString); + + // Add additional space to empty non-password text to compensate + // for the fake length we specified in DocumentLengthForFep(). + if (text.size() == 0 && !(m_textCapabilities & TCoeInputCapabilities::ESecretText)) + text += QChar(0x20); + aEditorContent.Copy(qt_QString2TPtrC(text.mid(aDocumentPosition, aLengthToRetrieve))); } -- cgit v0.12 From 95df5be87b37da139dba33b06aaf6e2a251be698 Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Thu, 18 Aug 2011 09:24:13 +0300 Subject: Compile fix for Symbian 5th and earlier Additional fix to enable compilation of Qt GUI to succeed on earlier Symbian SDKs. Task-number: QTBUG-20033 Reviewed-by: Kalle Lehtonen --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index e22e27c..d545f2e 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -64,6 +64,8 @@ #define QT_EAknCursorPositionChanged MAknEdStateObserver::EAknEdwinStateEvent(6) // MAknEdStateObserver::EAknActivatePenInputRequest #define QT_EAknActivatePenInputRequest MAknEdStateObserver::EAknEdwinStateEvent(7) +// MAknEdStateObserver::EAknClosePenInputRequest +#define QT_EAknClosePenInputRequest MAknEdStateObserver::EAknEdwinStateEvent(10) // EAknEditorFlagSelectionVisible is only valid from 3.2 onwards. // Sym^3 AVKON FEP manager expects that this flag is used for FEP-aware editors @@ -315,8 +317,9 @@ bool QCoeFepInputContext::filterEvent(const QEvent *event) if (!needsInputPanel()) return false; - if (event->type() == QEvent::CloseSoftwareInputPanel) { - m_fepState->ReportAknEdStateEventL(MAknEdStateObserver::EAknClosePenInputRequest); + if ((event->type() == QEvent::CloseSoftwareInputPanel) + && (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0)) { + m_fepState->ReportAknEdStateEventL(QT_EAknClosePenInputRequest); return false; } -- cgit v0.12 From 1679b2d71f4f573699aad20aebf4eacc7605fdc8 Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Thu, 18 Aug 2011 15:43:55 +0300 Subject: Exact word bubble doesn't disappear when screen is tapped Sync FEP-aware text editors state to native side. Thus, native side can then do various operations based on editor state - such as removing the user typed 'exact word bubble'. Task-number: QTBUG-20919 Reviewed-by: Miikka Heikkinen --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index d545f2e..8bdaa22 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -1077,6 +1077,10 @@ void QCoeFepInputContext::CancelFepInlineEdit() if (m_hasTempPreeditString) return; + // Sync with native side editor state. Native side can then do various operations + // based on editor state, such as removing 'exact word bubble'. + ReportAknEdStateEvent(MAknEdStateObserver::EAknSyncEdwinState); + QList attributes; QInputMethodEvent event(QLatin1String(""), attributes); event.setCommitString(QLatin1String(""), 0, 0); -- cgit v0.12 From b186288cbf796be662f86ae4d5c70e39ba6afb67 Mon Sep 17 00:00:00 2001 From: Sami Merila Date: Fri, 19 Aug 2011 14:49:27 +0300 Subject: Exact word bubble doesn't disappear when screen is tapped (fix part 2) Prevent syncing with native side, if input capability changes are pending. Native side seems to be rather touchy about extra events, and might crash if syncing is requested while handling a capability change is on-going. Additionally, only cancel the transaction once. Otherwise cancellation might lead into loop (since we sync the state with native side) that eventually causes the application to crash. Task-number: QTBUG-20919 Reviewed-by: Miikka Heikkinen --- src/gui/inputmethod/qcoefepinputcontext_p.h | 1 + src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/gui/inputmethod/qcoefepinputcontext_p.h b/src/gui/inputmethod/qcoefepinputcontext_p.h index 9857015..8c30838 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_p.h +++ b/src/gui/inputmethod/qcoefepinputcontext_p.h @@ -154,6 +154,7 @@ private: TUint m_textCapabilities; bool m_inDestruction; bool m_pendingInputCapabilitiesChanged; + bool m_pendingTransactionCancel; int m_cursorVisibility; int m_inlinePosition; MFepInlineTextFormatRetriever *m_formatRetriever; diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index 8bdaa22..9cf4212 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -109,6 +109,7 @@ QCoeFepInputContext::QCoeFepInputContext(QObject *parent) m_textCapabilities(TCoeInputCapabilities::EAllText), m_inDestruction(false), m_pendingInputCapabilitiesChanged(false), + m_pendingTransactionCancel(false), m_cursorVisibility(1), m_inlinePosition(0), m_formatRetriever(0), @@ -1074,12 +1075,10 @@ void QCoeFepInputContext::CancelFepInlineEdit() // We are not supposed to ever have a tempPreeditString and a real preedit string // from S60 at the same time, so it should be safe to rely on this test to determine // whether we should honor S60's request to clear the text or not. - if (m_hasTempPreeditString) + if (m_hasTempPreeditString || m_pendingTransactionCancel) return; - // Sync with native side editor state. Native side can then do various operations - // based on editor state, such as removing 'exact word bubble'. - ReportAknEdStateEvent(MAknEdStateObserver::EAknSyncEdwinState); + m_pendingTransactionCancel = true; QList attributes; QInputMethodEvent event(QLatin1String(""), attributes); @@ -1087,6 +1086,13 @@ void QCoeFepInputContext::CancelFepInlineEdit() m_preeditString.clear(); m_inlinePosition = 0; sendEvent(event); + + // Sync with native side editor state. Native side can then do various operations + // based on editor state, such as removing 'exact word bubble'. + if (!m_pendingInputCapabilitiesChanged) + ReportAknEdStateEvent(MAknEdStateObserver::EAknSyncEdwinState); + + m_pendingTransactionCancel = false; } TInt QCoeFepInputContext::DocumentLengthForFep() const -- cgit v0.12