diff options
author | Roger Maclean <rmaclean@qnx.com> | 2013-11-12 18:00:09 -0500 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-11-19 14:18:53 +0100 |
commit | ac6b9be9b3d207aef6241c59edc7375f6fadabeb (patch) | |
tree | ac07da979532891e42846fc9a50c2525de485bf9 /src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp | |
parent | 1be3ecaea3f03ee29b5d420efe806ca698acc569 (diff) |
BB10: Clean up IMF session code
Be more rigorous about checking if we're in a session before invoking IMF functions. In
particular the code would call initEvent if a key was received while no text field had focus
leading to a crash.
Also closeSession is now always called when a session is terminated rather than just
setting sInputSession to 0 and hasSession is always called to check for a valid session.
Change-Id: I22ce1c9bcdf8dd130f05ae319c4cc1e01afc4456
Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com>
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
Reviewed-by: Bernd Weimer <bweimer@blackberry.com>
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Diffstat (limited to 'src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp')
-rw-r--r-- | src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp index 7f60fa1822..dd47d37af3 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp +++ b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp @@ -717,7 +717,7 @@ void QQnxInputContext::update(Qt::InputMethodQueries queries) updateCursorPosition(); // If caret position has changed we need to inform IMF unless this is just due to our own action // such as committing text. - if (!m_isUpdatingText && lastCaret != m_caretPosition) { + if (hasSession() && !m_isUpdatingText && lastCaret != m_caretPosition) { caret_event_t caretEvent; initEvent(&caretEvent.event, sInputSession, EVENT_CARET, CARET_POS_CHANGED, sizeof(caretEvent)); caretEvent.old_pos = lastCaret; @@ -738,6 +738,10 @@ void QQnxInputContext::closeSession() p_ictrl_close_session((input_session_t *)sInputSession); sInputSession = 0; } + // These are likely already in the right state but this depends on the text control + // having called reset or commit. So, just in case, set them to proper values. + m_isComposing = false; + m_composingText.clear(); } bool QQnxInputContext::openSession() @@ -791,7 +795,7 @@ bool QQnxInputContext::dispatchCloseSoftwareInputPanel() */ bool QQnxInputContext::dispatchFocusGainEvent(int inputHints) { - if (sInputSession != 0) + if (hasSession()) dispatchFocusLossEvent(); QObject *input = qGuiApp->focusObject(); @@ -835,13 +839,13 @@ bool QQnxInputContext::dispatchFocusGainEvent(int inputHints) void QQnxInputContext::dispatchFocusLossEvent() { - if (sInputSession != 0) { + if (hasSession()) { qInputContextDebug() << Q_FUNC_INFO << "ictrl_dispatch_event focus lost"; focus_event_t focusEvent; initEvent(&focusEvent.event, sInputSession, EVENT_FOCUS, FOCUS_LOST, sizeof(focusEvent)); p_ictrl_dispatch_event((event_t *)&focusEvent); - sInputSession = 0; + closeSession(); } } @@ -849,7 +853,7 @@ bool QQnxInputContext::handleKeyboardEvent(int flags, int sym, int mod, int scan { Q_UNUSED(scan); - if (!imfAvailable()) + if (!hasSession()) return false; int key = (flags & KEY_SYM_VALID) ? sym : cap; @@ -950,10 +954,12 @@ void QQnxInputContext::endComposition() finishComposingText(); - action_event_t actionEvent; - initEvent(&actionEvent.event, sInputSession, EVENT_ACTION, ACTION_END_COMPOSITION, sizeof(actionEvent)); - qInputContextDebug() << Q_FUNC_INFO << "ictrl_dispatch_even end composition"; - p_ictrl_dispatch_event(&actionEvent.event); + if (hasSession()) { + action_event_t actionEvent; + initEvent(&actionEvent.event, sInputSession, EVENT_ACTION, ACTION_END_COMPOSITION, sizeof(actionEvent)); + qInputContextDebug() << Q_FUNC_INFO << "ictrl_dispatch_even end composition"; + p_ictrl_dispatch_event(&actionEvent.event); + } } void QQnxInputContext::updateComposition(spannable_string_t *text, int32_t new_cursor_position) @@ -1318,7 +1324,7 @@ void QQnxInputContext::setFocusObject(QObject *object) if (!inputMethodAccepted()) { if (m_inputPanelVisible) hideInputPanel(); - if (sInputSession != 0) + if (hasSession()) dispatchFocusLossEvent(); } else { QInputMethodQueryEvent query(Qt::ImHints); |