Workaround windows not gaining focus on mac.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Fri, 28 Oct 2011 06:15:38 +0000 (16:15 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 1 Nov 2011 04:13:05 +0000 (05:13 +0100)
Delaying giving focus to the rootItem until the canvas window gains
focus doesn't work if the window never gains focus.  So give focus to
the rootItem immediately so text input continues to work while
QTBUG-22415 is being resolved.

Task-number: QTBUG-22409
Change-Id: I1bdb13485219d0c2a2f8bdcb3e0972444e3813f2
Reviewed-by: Yann Bodson <yann.bodson@nokia.com>

src/declarative/items/qquickcanvas.cpp
tests/auto/declarative/qquickfocusscope/tst_qquickfocusscope.cpp

index 6df0c65..861b11f 100644 (file)
@@ -495,6 +495,12 @@ void QQuickCanvasPrivate::init(QQuickCanvas *c)
     rootItemPrivate->canvas = q;
     rootItemPrivate->flags |= QQuickItem::ItemIsFocusScope;
 
+    // In the absence of a focus in event on some platforms assume the window will
+    // be activated immediately and set focus on the rootItem
+    // ### Remove when QTBUG-22415 is resolved.
+    //It is important that this call happens after the rootItem has a canvas..
+    rootItem->setFocus(true);
+
     bool threaded = !qmlNoThreadedRenderer();
 
     if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) {
@@ -633,13 +639,13 @@ void QQuickCanvasPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, F
     }
 
     if (!(options & DontChangeFocusProperty)) {
-        if (item != rootItem || QGuiApplication::focusWindow() == q) {
+//        if (item != rootItem || QGuiApplication::focusWindow() == q) {    // QTBUG-22415
             itemPrivate->focus = true;
             changed << item;
-        }
+//        }
     }
 
-    if (newActiveFocusItem && QGuiApplication::focusWindow() == q) {
+    if (newActiveFocusItem && rootItem->hasFocus()) {
         activeFocusItem = newActiveFocusItem;
 
         QQuickItemPrivate::get(newActiveFocusItem)->activeFocus = true;
index ffb9660..d0149ed 100644 (file)
@@ -557,6 +557,7 @@ void tst_qquickfocusscope::canvasFocus()
     QSignalSpy scope2ActiveFocusSpy(scope2, SIGNAL(activeFocusChanged(bool)));
     QSignalSpy item2ActiveFocusSpy(item2, SIGNAL(activeFocusChanged(bool)));
 
+    QEXPECT_FAIL("", "QTBUG-22415", Abort);
     QCOMPARE(rootItem->hasFocus(), false);
     QCOMPARE(rootItem->hasActiveFocus(), false);
     QCOMPARE(scope1->hasFocus(), true);
@@ -585,6 +586,7 @@ void tst_qquickfocusscope::canvasFocus()
     QCOMPARE(scope2->hasActiveFocus(), false);
     QCOMPARE(item2->hasFocus(), false);
     QCOMPARE(item2->hasActiveFocus(), false);
+
     QCOMPARE(rootFocusSpy.count(), 1);
     QCOMPARE(rootActiveFocusSpy.count(), 1);
     QCOMPARE(scope1FocusSpy.count(), 0);
@@ -605,6 +607,7 @@ void tst_qquickfocusscope::canvasFocus()
     QCOMPARE(scope1->hasActiveFocus(), false);
     QCOMPARE(item1->hasFocus(), true);
     QCOMPARE(item1->hasActiveFocus(), false);
+
     QCOMPARE(rootFocusSpy.count(), 2);
     QCOMPARE(rootActiveFocusSpy.count(), 2);
     QCOMPARE(scope1FocusSpy.count(), 0);
@@ -612,6 +615,7 @@ void tst_qquickfocusscope::canvasFocus()
     QCOMPARE(item1FocusSpy.count(), 0);
     QCOMPARE(item1ActiveFocusSpy.count(), 2);
 
+
     // canvas does not have focus, so item2 will not get active focus
     item2->forceActiveFocus();