Remove support for QWidget specific input contexts
authorPekka Vuorela <pekka.ta.vuorela@nokia.com>
Fri, 23 Sep 2011 12:28:19 +0000 (15:28 +0300)
committerQt by Nokia <qt-info@nokia.com>
Wed, 28 Sep 2011 12:02:08 +0000 (14:02 +0200)
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>
dist/changes-5.0.0
src/widgets/kernel/qwidget.cpp
src/widgets/kernel/qwidget.h
src/widgets/kernel/qwidget_p.h
tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
tests/auto/qgraphicsview/tst_qgraphicsview.cpp
tests/auto/qinputcontext/tst_qinputcontext.cpp
tests/auto/qwidget/tst_qwidget.cpp

index ca63359..803e16a 100644 (file)
@@ -58,6 +58,11 @@ QtCore
 QtGui
 -----
 
+QtWidgets
+---------
+* QWidget::setInputContext() is removed. Input contexts are now platform
+  specific.
+
 QtNetwork
 ---------
 
index 4cb01b9..f8d5e68 100644 (file)
@@ -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)) {
index 3db0408..365d995 100644 (file)
@@ -616,7 +616,6 @@ public:
     void ensurePolished() const;
 
     QInputContext *inputContext();
-    void setInputContext(QInputContext *);
 
     bool isAncestorOf(const QWidget *child) const;
 
index 6e1568e..775152b 100644 (file)
@@ -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();
index 79dd2bd..2d62917 100644 (file)
@@ -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()
index 910f0bb..b4c419a 100644 (file)
@@ -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
 
index d6bc8ff..d1ccd7c 100644 (file)
@@ -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()
index 27aea90..2f74988 100644 (file)
@@ -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
 {
index 1414123..f7d3e46 100644 (file)
@@ -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);