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>
This commit is contained in:
Roger Maclean 2013-11-12 18:00:09 -05:00 committed by The Qt Project
parent 1be3ecaea3
commit ac6b9be9b3

View File

@ -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);