Remove support for QWidget specific input contexts
QInputContext is migrated to QInputPanel, which allows only one instance. Change-Id: I4912164790d5a6bdff41e11cbe4bc4e2f9f111ec Reviewed-on: http://codereview.qt-project.org/5641 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>bb10
parent
d0968472c6
commit
3d71266fea
|
|
@ -58,6 +58,11 @@ QtCore
|
|||
QtGui
|
||||
-----
|
||||
|
||||
QtWidgets
|
||||
---------
|
||||
* QWidget::setInputContext() is removed. Input contexts are now platform
|
||||
specific.
|
||||
|
||||
QtNetwork
|
||||
---------
|
||||
|
||||
|
|
|
|||
|
|
@ -372,24 +372,9 @@ void QWidgetPrivate::updateWidgetTransform()
|
|||
}
|
||||
}
|
||||
|
||||
QInputContext *QWidgetPrivate::assignedInputContext() const
|
||||
{
|
||||
#ifndef QT_NO_IM
|
||||
const QWidget *widget = q_func();
|
||||
while (widget) {
|
||||
if (QInputContext *qic = widget->d_func()->ic)
|
||||
return qic;
|
||||
widget = widget->parentWidget();
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
QInputContext *QWidgetPrivate::inputContext() const
|
||||
{
|
||||
#ifndef QT_NO_IM
|
||||
if (QInputContext *qic = assignedInputContext())
|
||||
return qic;
|
||||
return qApp->inputContext();
|
||||
#else
|
||||
return 0;
|
||||
|
|
@ -415,31 +400,6 @@ QInputContext *QWidget::inputContext()
|
|||
return d->inputContext();
|
||||
}
|
||||
|
||||
/*!
|
||||
This function sets the input context \a context
|
||||
on this widget.
|
||||
|
||||
Qt takes ownership of the given input \a context.
|
||||
|
||||
\sa inputContext()
|
||||
*/
|
||||
void QWidget::setInputContext(QInputContext *context)
|
||||
{
|
||||
Q_D(QWidget);
|
||||
if (!testAttribute(Qt::WA_InputMethodEnabled))
|
||||
return;
|
||||
#ifndef QT_NO_IM
|
||||
if (context == d->ic)
|
||||
return;
|
||||
if (d->ic)
|
||||
delete d->ic;
|
||||
d->ic = context;
|
||||
if (d->ic)
|
||||
d->ic->setParent(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef QT_KEYPAD_NAVIGATION
|
||||
QPointer<QWidget> QWidgetPrivate::editingWidget;
|
||||
|
||||
|
|
@ -10415,9 +10375,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
|
|||
case Qt::WA_InputMethodEnabled: {
|
||||
#ifndef QT_NO_IM
|
||||
QWidget *focusWidget = d->effectiveFocusWidget();
|
||||
QInputContext *ic = focusWidget->d_func()->assignedInputContext();
|
||||
if (!ic && (!on || hasFocus()))
|
||||
ic = focusWidget->d_func()->inputContext();
|
||||
QInputContext *ic = qApp->inputContext();
|
||||
if (ic) {
|
||||
if (on && hasFocus() && ic->focusWidget() != focusWidget && isEnabled()
|
||||
&& focusWidget->testAttribute(Qt::WA_InputMethodEnabled)) {
|
||||
|
|
|
|||
|
|
@ -616,7 +616,6 @@ public:
|
|||
void ensurePolished() const;
|
||||
|
||||
QInputContext *inputContext();
|
||||
void setInputContext(QInputContext *);
|
||||
|
||||
bool isAncestorOf(const QWidget *child) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -573,7 +573,6 @@ public:
|
|||
// sub-classes that their internals are about to be released.
|
||||
virtual void aboutToDestroy() {}
|
||||
|
||||
QInputContext *assignedInputContext() const;
|
||||
QInputContext *inputContext() const;
|
||||
inline QWidget *effectiveFocusWidget() {
|
||||
QWidget *w = q_func();
|
||||
|
|
|
|||
|
|
@ -10411,10 +10411,8 @@ void tst_QGraphicsItem::updateMicroFocus()
|
|||
QGraphicsView view2(&scene);
|
||||
layout.addWidget(&view, 0, 0);
|
||||
layout.addWidget(&view2, 0, 1);
|
||||
MyInputContext ic2;
|
||||
view2.setInputContext(&ic2);
|
||||
MyInputContext ic;
|
||||
view.setInputContext(&ic);
|
||||
MyInputContext *ic = new MyInputContext;
|
||||
qApp->setInputContext(ic);
|
||||
MyInputWidget input;
|
||||
input.setPos(0, 0);
|
||||
input.resize(150, 150);
|
||||
|
|
@ -10427,13 +10425,10 @@ void tst_QGraphicsItem::updateMicroFocus()
|
|||
QTest::qWaitForWindowShown(&parent);
|
||||
QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&parent));
|
||||
//We reset the number of updates that happened previously (initialisation)
|
||||
ic.nbUpdates = 0;
|
||||
ic2.nbUpdates = 0;
|
||||
ic->nbUpdates = 0;
|
||||
input.doUpdateMicroFocus();
|
||||
QApplication::processEvents();
|
||||
QTRY_COMPARE(ic.nbUpdates, 1);
|
||||
//No update since view2 does not have the focus.
|
||||
QTRY_COMPARE(ic2.nbUpdates, 0);
|
||||
QTRY_COMPARE(ic->nbUpdates, 1);
|
||||
}
|
||||
|
||||
void tst_QGraphicsItem::textItem_shortcuts()
|
||||
|
|
|
|||
|
|
@ -3867,21 +3867,21 @@ void tst_QGraphicsScene::inputMethod()
|
|||
|
||||
QGraphicsScene scene;
|
||||
QGraphicsView view(&scene);
|
||||
TestInputContext inputContext;
|
||||
view.setInputContext(&inputContext);
|
||||
TestInputContext *inputContext = new TestInputContext;
|
||||
qApp->setInputContext(inputContext);
|
||||
view.show();
|
||||
QApplication::setActiveWindow(&view);
|
||||
view.setFocus();
|
||||
QTest::qWaitForWindowShown(&view);
|
||||
QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
|
||||
|
||||
inputContext.resetCalls = 0;
|
||||
inputContext->resetCalls = 0;
|
||||
scene.addItem(item);
|
||||
QInputMethodEvent event;
|
||||
|
||||
scene.setFocusItem(item);
|
||||
QCOMPARE(!!(item->flags() & QGraphicsItem::ItemIsFocusable), scene.focusItem() == item);
|
||||
QCOMPARE(inputContext.resetCalls, 0);
|
||||
QCOMPARE(inputContext->resetCalls, 0);
|
||||
|
||||
item->eventCalls = 0;
|
||||
qApp->sendEvent(&scene, &event);
|
||||
|
|
@ -3894,7 +3894,7 @@ void tst_QGraphicsScene::inputMethod()
|
|||
scene.setFocusItem(0);
|
||||
// the input context is reset twice, once because an item has lost focus and again because
|
||||
// the Qt::WA_InputMethodEnabled flag is cleared because no item has focus.
|
||||
QCOMPARE(inputContext.resetCalls, callFocusItem ? 2 : 0);
|
||||
QCOMPARE(inputContext->resetCalls, callFocusItem ? 2 : 0);
|
||||
QCOMPARE(item->eventCalls, callFocusItem ? 2 : 0); // verify correct delivery of "reset" event
|
||||
QCOMPARE(item->queryCalls, callFocusItem ? 1 : 0); // verify that value is unaffected
|
||||
|
||||
|
|
|
|||
|
|
@ -4124,8 +4124,8 @@ void tst_QGraphicsView::inputContextReset()
|
|||
QGraphicsView view(&scene);
|
||||
QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled));
|
||||
|
||||
InputContextTester inputContext;
|
||||
view.setInputContext(&inputContext);
|
||||
InputContextTester *inputContext = new InputContextTester;
|
||||
qApp->setInputContext(inputContext);
|
||||
|
||||
view.show();
|
||||
QTest::qWaitForWindowShown(&view);
|
||||
|
|
@ -4135,39 +4135,39 @@ void tst_QGraphicsView::inputContextReset()
|
|||
QGraphicsItem *item1 = new QGraphicsRectItem;
|
||||
item1->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemAcceptsInputMethod);
|
||||
|
||||
inputContext.resets = 0;
|
||||
inputContext->resets = 0;
|
||||
scene.addItem(item1);
|
||||
QCOMPARE(inputContext.resets, 0);
|
||||
QCOMPARE(inputContext->resets, 0);
|
||||
|
||||
inputContext.resets = 0;
|
||||
inputContext->resets = 0;
|
||||
scene.setFocusItem(item1);
|
||||
QCOMPARE(scene.focusItem(), (QGraphicsItem *)item1);
|
||||
QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled));
|
||||
QCOMPARE(inputContext.resets, 0);
|
||||
QCOMPARE(inputContext->resets, 0);
|
||||
|
||||
inputContext.resets = 0;
|
||||
inputContext->resets = 0;
|
||||
scene.setFocusItem(0);
|
||||
// the input context is reset twice, once because an item has lost focus and again because
|
||||
// the Qt::WA_InputMethodEnabled flag is cleared because no item has focus.
|
||||
QCOMPARE(inputContext.resets, 2);
|
||||
QCOMPARE(inputContext->resets, 2);
|
||||
|
||||
// introduce another item that is focusable but does not accept input methods
|
||||
QGraphicsItem *item2 = new QGraphicsRectItem;
|
||||
item2->setFlags(QGraphicsItem::ItemIsFocusable);
|
||||
scene.addItem(item2);
|
||||
|
||||
inputContext.resets = 0;
|
||||
inputContext->resets = 0;
|
||||
scene.setFocusItem(item2);
|
||||
QCOMPARE(inputContext.resets, 0);
|
||||
QCOMPARE(inputContext->resets, 0);
|
||||
|
||||
inputContext.resets = 0;
|
||||
inputContext->resets = 0;
|
||||
scene.setFocusItem(item1);
|
||||
QCOMPARE(inputContext.resets, 0);
|
||||
QCOMPARE(inputContext->resets, 0);
|
||||
|
||||
// test changing between between items that accept input methods.
|
||||
item2->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemAcceptsInputMethod);
|
||||
scene.setFocusItem(item2);
|
||||
QCOMPARE(inputContext.resets, 1);
|
||||
QCOMPARE(inputContext->resets, 1);
|
||||
}
|
||||
|
||||
void tst_QGraphicsView::indirectPainting()
|
||||
|
|
|
|||
|
|
@ -88,7 +88,6 @@ private slots:
|
|||
void closeSoftwareInputPanel();
|
||||
void selections();
|
||||
void focusProxy();
|
||||
void contextInheritance();
|
||||
void symbianTestCoeFepInputContext_data();
|
||||
void symbianTestCoeFepInputContext();
|
||||
void symbianTestCoeFepAutoCommit_data();
|
||||
|
|
@ -306,12 +305,10 @@ void tst_QInputContext::filterMouseEvents()
|
|||
QApplication::setActiveWindow(&le);
|
||||
|
||||
QFilterInputContext *ic = new QFilterInputContext;
|
||||
le.setInputContext(ic);
|
||||
qApp->setInputContext(ic);
|
||||
QTest::mouseClick(&le, Qt::LeftButton);
|
||||
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::MouseButtonRelease) >= 0);
|
||||
|
||||
le.setInputContext(0);
|
||||
}
|
||||
|
||||
class RequestSoftwareInputPanelStyle : public QWindowsStyle
|
||||
|
|
@ -357,11 +354,8 @@ void tst_QInputContext::requestSoftwareInputPanel()
|
|||
layout->addWidget(le2);
|
||||
w.setLayout(layout);
|
||||
|
||||
QFilterInputContext *ic1, *ic2;
|
||||
ic1 = new QFilterInputContext;
|
||||
ic2 = new QFilterInputContext;
|
||||
le1->setInputContext(ic1);
|
||||
le2->setInputContext(ic2);
|
||||
QFilterInputContext *ic = new QFilterInputContext;
|
||||
qApp->setInputContext(ic);
|
||||
|
||||
w.show();
|
||||
QApplication::setActiveWindow(&w);
|
||||
|
|
@ -369,20 +363,20 @@ void tst_QInputContext::requestSoftwareInputPanel()
|
|||
// Testing single click panel activation.
|
||||
newStyle->m_rsipBehavior = QStyle::RSIP_OnMouseClick;
|
||||
QTest::mouseClick(le2, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic2->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) >= 0);
|
||||
ic2->lastTypes.clear();
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) >= 0);
|
||||
ic->lastTypes.clear();
|
||||
|
||||
// Testing double click panel activation.
|
||||
newStyle->m_rsipBehavior = QStyle::RSIP_OnMouseClickAndAlreadyFocused;
|
||||
QTest::mouseClick(le1, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic1->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) < 0);
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) < 0);
|
||||
QTest::mouseClick(le1, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic1->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) >= 0);
|
||||
ic1->lastTypes.clear();
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) >= 0);
|
||||
ic->lastTypes.clear();
|
||||
|
||||
// Testing right mouse button
|
||||
QTest::mouseClick(le1, Qt::RightButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic1->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) < 0);
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::RequestSoftwareInputPanel) < 0);
|
||||
|
||||
qApp->setStyle(oldStyle);
|
||||
oldStyle->setParent(qApp);
|
||||
|
|
@ -402,11 +396,8 @@ void tst_QInputContext::closeSoftwareInputPanel()
|
|||
layout->addWidget(rb);
|
||||
w.setLayout(layout);
|
||||
|
||||
QFilterInputContext *ic1, *ic2;
|
||||
ic1 = new QFilterInputContext;
|
||||
ic2 = new QFilterInputContext;
|
||||
le1->setInputContext(ic1);
|
||||
le2->setInputContext(ic2);
|
||||
QFilterInputContext *ic = new QFilterInputContext;
|
||||
qApp->setInputContext(ic);
|
||||
|
||||
w.show();
|
||||
QApplication::setActiveWindow(&w);
|
||||
|
|
@ -414,11 +405,11 @@ void tst_QInputContext::closeSoftwareInputPanel()
|
|||
// Testing that panel doesn't close between two input methods aware widgets.
|
||||
QTest::mouseClick(le1, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QTest::mouseClick(le2, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic2->lastTypes.indexOf(QEvent::CloseSoftwareInputPanel) < 0);
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::CloseSoftwareInputPanel) < 0);
|
||||
|
||||
// Testing that panel closes when focusing non-aware widget.
|
||||
QTest::mouseClick(rb, Qt::LeftButton, Qt::NoModifier, QPoint(5, 5));
|
||||
QVERIFY(ic2->lastTypes.indexOf(QEvent::CloseSoftwareInputPanel) >= 0);
|
||||
QVERIFY(ic->lastTypes.indexOf(QEvent::CloseSoftwareInputPanel) >= 0);
|
||||
}
|
||||
|
||||
void tst_QInputContext::selections()
|
||||
|
|
@ -474,37 +465,6 @@ void tst_QInputContext::focusProxy()
|
|||
QCOMPARE(gic->focusWidget(), &proxy);
|
||||
}
|
||||
|
||||
void tst_QInputContext::contextInheritance()
|
||||
{
|
||||
QWidget parent;
|
||||
QWidget child(&parent);
|
||||
|
||||
parent.setAttribute(Qt::WA_InputMethodEnabled, true);
|
||||
child.setAttribute(Qt::WA_InputMethodEnabled, true);
|
||||
|
||||
QCOMPARE(parent.inputContext(), qApp->inputContext());
|
||||
QCOMPARE(child.inputContext(), qApp->inputContext());
|
||||
|
||||
QInputContext *qic = new QFilterInputContext;
|
||||
parent.setInputContext(qic);
|
||||
QCOMPARE(parent.inputContext(), qic);
|
||||
QCOMPARE(child.inputContext(), qic);
|
||||
|
||||
parent.setAttribute(Qt::WA_InputMethodEnabled, false);
|
||||
QVERIFY(!parent.inputContext());
|
||||
QCOMPARE(child.inputContext(), qic);
|
||||
parent.setAttribute(Qt::WA_InputMethodEnabled, true);
|
||||
|
||||
parent.setInputContext(0);
|
||||
QCOMPARE(parent.inputContext(), qApp->inputContext());
|
||||
QCOMPARE(child.inputContext(), qApp->inputContext());
|
||||
|
||||
qic = new QFilterInputContext;
|
||||
qApp->setInputContext(qic);
|
||||
QCOMPARE(parent.inputContext(), qic);
|
||||
QCOMPARE(child.inputContext(), qic);
|
||||
}
|
||||
|
||||
#ifdef QT_WEBKIT_LIB
|
||||
class AutoWebView : public QWebView
|
||||
{
|
||||
|
|
|
|||
|
|
@ -589,21 +589,11 @@ void tst_QWidget::getSetCheck()
|
|||
QCOMPARE(true, obj1.acceptDrops());
|
||||
|
||||
// QInputContext * QWidget::inputContext()
|
||||
// void QWidget::setInputContext(QInputContext *)
|
||||
MyInputContext *var13 = new MyInputContext;
|
||||
obj1.setInputContext(var13);
|
||||
qApp->setInputContext(var13);
|
||||
QCOMPARE((QInputContext *)0, obj1.inputContext()); // The widget by default doesn't have the WA_InputMethodEnabled attribute
|
||||
obj1.setAttribute(Qt::WA_InputMethodEnabled);
|
||||
obj1.setInputContext(var13);
|
||||
QCOMPARE(static_cast<QInputContext *>(var13), obj1.inputContext());
|
||||
// QWidget takes ownership, so check parent
|
||||
QCOMPARE(var13->parent(), static_cast<QObject *>(&obj1));
|
||||
// Check self assignment
|
||||
obj1.setInputContext(obj1.inputContext());
|
||||
QCOMPARE(static_cast<QInputContext *>(var13), obj1.inputContext());
|
||||
obj1.setInputContext((QInputContext *)0);
|
||||
QCOMPARE(qApp->inputContext(), obj1.inputContext());
|
||||
QVERIFY(qApp->inputContext() != var13);
|
||||
|
||||
// bool QWidget::autoFillBackground()
|
||||
// void QWidget::setAutoFillBackground(bool)
|
||||
|
|
@ -9937,7 +9927,7 @@ void tst_QWidget::focusProxyAndInputMethods()
|
|||
InputContextTester *inputContext = new InputContextTester;
|
||||
QWidget *toplevel = new QWidget(0, Qt::X11BypassWindowManagerHint);
|
||||
toplevel->setAttribute(Qt::WA_InputMethodEnabled, true);
|
||||
toplevel->setInputContext(inputContext); // ownership is transferred
|
||||
qApp->setInputContext(inputContext); // ownership is transferred
|
||||
|
||||
QWidget *child = new QWidget(toplevel);
|
||||
child->setFocusProxy(toplevel);
|
||||
|
|
|
|||
Loading…
Reference in New Issue