From 2a40fa8d3cd40bdce7d8771a15497fd75ee12f52 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Fri, 28 Oct 2011 16:15:38 +1000 Subject: [PATCH] Workaround windows not gaining focus on mac. 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 --- src/declarative/items/qquickcanvas.cpp | 12 +++++++++--- .../qquickfocusscope/tst_qquickfocusscope.cpp | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/declarative/items/qquickcanvas.cpp b/src/declarative/items/qquickcanvas.cpp index 6df0c65..861b11f 100644 --- a/src/declarative/items/qquickcanvas.cpp +++ b/src/declarative/items/qquickcanvas.cpp @@ -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; diff --git a/tests/auto/declarative/qquickfocusscope/tst_qquickfocusscope.cpp b/tests/auto/declarative/qquickfocusscope/tst_qquickfocusscope.cpp index ffb9660..d0149ed 100644 --- a/tests/auto/declarative/qquickfocusscope/tst_qquickfocusscope.cpp +++ b/tests/auto/declarative/qquickfocusscope/tst_qquickfocusscope.cpp @@ -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(); -- 1.7.2.5