Widgets: only update IM if the widget is the current focus object
QInputMethod works on focusObject, not focusWidget. These two are not always the same, and sometimes the focusObject is also NULL. In either case, we should not tell QInputMethod to commit, reset or otherwise emit signals based on the internal state of widgets that are not the focus object. This led to a crash on iOS, since we got a call to cursorRectangleChanged when focus object was NULL, which the code didn't (and shouldn't need to) take into account. Change-Id: I54e40d7ec35210ba6599a78c5a8c7f982a1c3dbb Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>bb10
parent
32dfbd6dbf
commit
e5f48c63d2
|
|
@ -9688,7 +9688,8 @@ void QWidget::setInputMethodHints(Qt::InputMethodHints hints)
|
|||
if (d->imHints == hints)
|
||||
return;
|
||||
d->imHints = hints;
|
||||
qApp->inputMethod()->update(Qt::ImHints);
|
||||
if (this == qApp->focusObject())
|
||||
qApp->inputMethod()->update(Qt::ImHints);
|
||||
#endif //QT_NO_IM
|
||||
}
|
||||
|
||||
|
|
@ -11031,7 +11032,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
|
|||
d->createTLSysExtra();
|
||||
#ifndef QT_NO_IM
|
||||
QWidget *focusWidget = d->effectiveFocusWidget();
|
||||
if (on && !internalWinId() && hasFocus()
|
||||
if (on && !internalWinId() && this == qApp->focusObject()
|
||||
&& focusWidget->testAttribute(Qt::WA_InputMethodEnabled)) {
|
||||
qApp->inputMethod()->commit();
|
||||
qApp->inputMethod()->update(Qt::ImEnabled);
|
||||
|
|
@ -11040,7 +11041,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
|
|||
parentWidget()->d_func()->enforceNativeChildren();
|
||||
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
|
||||
d->createWinId();
|
||||
if (isEnabled() && focusWidget->isEnabled()
|
||||
if (isEnabled() && focusWidget->isEnabled() && this == qApp->focusObject()
|
||||
&& focusWidget->testAttribute(Qt::WA_InputMethodEnabled)) {
|
||||
qApp->inputMethod()->update(Qt::ImEnabled);
|
||||
}
|
||||
|
|
@ -11566,7 +11567,8 @@ void QWidget::setShortcutAutoRepeat(int id, bool enable)
|
|||
void QWidget::updateMicroFocus()
|
||||
{
|
||||
// updating everything since this is currently called for any kind of state change
|
||||
qApp->inputMethod()->update(Qt::ImQueryAll);
|
||||
if (this == qApp->focusObject())
|
||||
qApp->inputMethod()->update(Qt::ImQueryAll);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
Loading…
Reference in New Issue