d->thread->stopRendering();
}
+void QQuickCanvas::focusOutEvent(QFocusEvent *)
+{
+ Q_D(QQuickCanvas);
+ d->rootItem->setFocus(false);
+}
+
+void QQuickCanvas::focusInEvent(QFocusEvent *)
+{
+ Q_D(QQuickCanvas);
+ d->rootItem->setFocus(true);
+}
/*!
rootItemPrivate->canvas = q;
rootItemPrivate->flags |= QQuickItem::ItemIsFocusScope;
- // QML always has focus. 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)) {
}
if (!(options & DontChangeFocusProperty)) {
- // if (item != rootItem || q->hasFocus()) { // ### refactor: focus handling...
+ if (item != rootItem || QGuiApplication::focusWindow() == q) {
itemPrivate->focus = true;
changed << item;
- // }
+ }
}
- if (newActiveFocusItem) { // ### refactor: && q->hasFocus()) {
+ if (newActiveFocusItem && QGuiApplication::focusWindow() == q) {
activeFocusItem = newActiveFocusItem;
QQuickItemPrivate::get(newActiveFocusItem)->activeFocus = true;
virtual void showEvent(QShowEvent *);
virtual void hideEvent(QHideEvent *);
+ virtual void focusInEvent(QFocusEvent *);
+ virtual void focusOutEvent(QFocusEvent *);
+
virtual bool event(QEvent *);
virtual void keyPressEvent(QKeyEvent *);
virtual void keyReleaseEvent(QKeyEvent *);
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVERIFY(view->isTopLevel());
QVERIFY(item0->hasActiveFocus() == true);
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVERIFY(item1->hasActiveFocus() == true);
QVERIFY(item2->hasActiveFocus() == true);
view->show();
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVERIFY(item0->hasActiveFocus() == false);
QVERIFY(item1->hasActiveFocus() == false);
view->show();
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVERIFY(item0->hasActiveFocus() == true);
QVERIFY(item1->hasActiveFocus() == true);
view->show();
view->requestActivateWindow();
- qApp->processEvents();
-
-#ifdef Q_WS_X11
- // to be safe and avoid failing setFocus with window managers
- qt_x11_wait_for_window_manager(view);
-#endif
+ QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVERIFY(view->rootObject()->property("focus1") == false);
QVERIFY(view->rootObject()->property("focus2") == false);
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QVariant blue(QColor("blue"));
QVariant red(QColor("red"));
view->show();
view->requestActivateWindow();
- qApp->processEvents();
-
-#ifdef Q_WS_X11
- // to be safe and avoid failing setFocus with window managers
- qt_x11_wait_for_window_manager(view);
-#endif
+ QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
QQuickItem *rootObject = view->rootObject();
QVERIFY(rootObject);
QQuickView *view = new QQuickView;
view->setSource(QUrl::fromLocalFile(TESTDATA("canvasFocus.qml")));
+ QQuickView alternateView;
+
QQuickItem *rootObject = view->rootObject();
QVERIFY(rootObject);
QSignalSpy scope2ActiveFocusSpy(scope2, SIGNAL(activeFocusChanged(bool)));
QSignalSpy item2ActiveFocusSpy(item2, SIGNAL(activeFocusChanged(bool)));
- QEXPECT_FAIL("", "QTBUG-21054 - Root item hasFocus returns true already", Abort);
-
QCOMPARE(rootItem->hasFocus(), false);
QCOMPARE(rootItem->hasActiveFocus(), false);
QCOMPARE(scope1->hasFocus(), true);
view->requestActivateWindow();
QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(view == qGuiApp->focusWindow());
// Now the canvas has focus, active focus given to item1
QCOMPARE(rootItem->hasFocus(), true);
QCOMPARE(item1ActiveFocusSpy.count(), 1);
- view->hide();
+ // view->hide(); // seemingly doesn't remove focus, so have an another view steal it.
+ alternateView.show();
+ alternateView.requestActivateWindow();
+ QTest::qWaitForWindowShown(&alternateView);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &alternateView);
+
QCOMPARE(rootItem->hasFocus(), false);
QCOMPARE(rootItem->hasActiveFocus(), false);
QCOMPARE(scope1->hasFocus(), true);
// give the canvas focus, and item2 will get active focus
view->show();
+ view->requestActivateWindow();
+ QTest::qWaitForWindowShown(view);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == view);
QCOMPARE(rootItem->hasFocus(), true);
QCOMPARE(rootItem->hasActiveFocus(), true);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *l1c1 = new TestItem(canvas.rootItem());
QQuickItem *l1c2 = new TestItem(canvas.rootItem());
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *l1c1 = new TestItem(canvas.rootItem());
QQuickItem *l1c2 = new TestItem(canvas.rootItem());
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *item = new TestItem;
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *item = new TestItem(canvas.rootItem());
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *tree = new TestItem;
QQuickItem *c1 = new TestItem(tree);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *tree = new TestFocusScope;
QQuickItem *c1 = new TestItem(tree);
QQuickItem *c2 = new TestItem(tree);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *tree = new TestFocusScope;
QQuickItem *c1 = new TestItem(tree);
QQuickItem *c2 = new TestItem(tree);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
QQuickItem *tree = new TestFocusScope;
QQuickItem *c1 = new TestItem(tree);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
FocusState focusState;
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
QQuickItem *child2 = new TestItem(canvas.rootItem());
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
QQuickItem *item = new TestItem(child);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
QQuickItem *item = new TestItem(child2);
{
QQuickCanvas canvas;
ensureFocus(&canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
QQuickItem *child = new TestItem(canvas.rootItem());
QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
QQuickItem *item = new TestItem(child2);
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keystest.qml")));
canvas->show();
- qApp->processEvents();
-
- QEvent wa(QEvent::WindowActivate);
- QApplication::sendEvent(canvas, &wa);
- QFocusEvent fe(QEvent::FocusIn);
- QApplication::sendEvent(canvas, &fe);
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QVERIFY(canvas->rootObject());
QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keyspriority.qml")));
canvas->show();
- qApp->processEvents();
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
QVERIFY(testItem);
- QEvent wa(QEvent::WindowActivate);
- QApplication::sendEvent(canvas, &wa);
- QFocusEvent fe(QEvent::FocusIn);
- QApplication::sendEvent(canvas, &fe);
-
QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
QApplication::sendEvent(canvas, &key);
QCOMPARE(testObject->mKey, int(Qt::Key_A));
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keynavigationtest.qml")));
canvas->show();
- qApp->processEvents();
-
- QEvent wa(QEvent::WindowActivate);
- QApplication::sendEvent(canvas, &wa);
- QFocusEvent fe(QEvent::FocusIn);
- QApplication::sendEvent(canvas, &fe);
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
QVERIFY(item);
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keynavigationtest.qml")));
canvas->show();
- qApp->processEvents();
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QQuickItem *rootItem = qobject_cast<QQuickItem*>(canvas->rootObject());
QVERIFY(rootItem);
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keynavigationtest.qml")));
canvas->show();
- qApp->processEvents();
-
- QEvent wa(QEvent::WindowActivate);
- QApplication::sendEvent(canvas, &wa);
- QFocusEvent fe(QEvent::FocusIn);
- QApplication::sendEvent(canvas, &fe);
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
QVERIFY(item);
canvas->setSource(QUrl::fromLocalFile(TESTDATA("keynavigationtest_implicit.qml")));
canvas->show();
- qApp->processEvents();
+ canvas->requestActivateWindow();
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QEvent wa(QEvent::WindowActivate);
QApplication::sendEvent(canvas, &wa);
canvas->setBaseSize(QSize(300, 300));
canvas->setSource(QUrl::fromLocalFile(TESTDATA("propertychanges.qml")));
canvas->show();
-
+ canvas->requestActivateWindow();
QTest::qWaitForWindowShown(canvas);
+ QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item");
QQuickItem *parentItem = findItem<QQuickItem>(canvas->rootObject(), "parentItem");
QCOMPARE(edit.isCursorVisible(), true);
QCOMPARE(spy.count(), 5);
- QEXPECT_FAIL("", "Most likely a side-effect of QTBUG-21489", Abort);
- view.setWindowState(Qt::WindowNoState);
+ QQuickView alternateView;
+ alternateView.show();
+ alternateView.requestActivateWindow();
+ QTest::qWaitForWindowShown(&alternateView);
+
QCOMPARE(edit.isCursorVisible(), false);
QCOMPARE(spy.count(), 6);
view.requestActivateWindow();
+ QTest::qWaitForWindowShown(&view);
QCOMPARE(edit.isCursorVisible(), true);
QCOMPARE(spy.count(), 7);
-
- // on mac, setActiveWindow(0) on mac does not deactivate the current application
- // (you have to switch to a different app or hide the current app to trigger this)
-#if !defined(Q_WS_MAC)
- // on mac, setActiveWindow(0) on mac does not deactivate the current application
- // (you have to switch to a different app or hide the current app to trigger this)
-// QApplication::setActiveWindow(0);
-// QTRY_COMPARE(QApplication::focusWindow(), static_cast<QWidget *>(0));
-// QCOMPARE(edit.isCursorVisible(), false);
-// QCOMPARE(spy.count(), 8);
-
-// view.requestActivateWindow();
-// QTest::qWaitForWindowShown(&view);
-// QTRY_COMPARE(view.windowState(), Qt::WindowActive);
-// QCOMPARE(edit.isCursorVisible(), true);
-// QCOMPARE(spy.count(), 9);
-#endif
}
void tst_qquicktextedit::delegateLoading_data()
QCOMPARE(input.isCursorVisible(), true);
QCOMPARE(spy.count(), 5);
- view.setWindowState(Qt::WindowNoState);
- QEXPECT_FAIL("", "Most likely a side-effect of QTBUG-21489", Abort);
+ QQuickView alternateView;
+ alternateView.show();
+ alternateView.requestActivateWindow();
+ QTest::qWaitForWindowShown(&alternateView);
+
QCOMPARE(input.isCursorVisible(), false);
QCOMPARE(spy.count(), 6);
view.requestActivateWindow();
+ QTest::qWaitForWindowShown(&view);
QCOMPARE(input.isCursorVisible(), true);
QCOMPARE(spy.count(), 7);
-
- // on mac, setActiveWindow(0) on mac does not deactivate the current application
- // (you have to switch to a different app or hide the current app to trigger this)
-#if !defined(Q_WS_MAC)
- // QGuiApplication has no equivalent of setActiveWindow(0). Is this different to clearing the
- // active state of the window or can it be removed?
-// QApplication::setActiveWindow(0);
-// QTRY_COMPARE(QApplication::focusWindow(), static_cast<QWidget *>(0));
-// QCOMPARE(input.isCursorVisible(), false);
-// QCOMPARE(spy.count(), 8);
-
-// view.requestActivateWindow();
-// QTRY_COMPARE(view.windowState(), Qt::WindowActive);
-// QCOMPARE(input.isCursorVisible(), true);
-// QCOMPARE(spy.count(), 9);
-#endif
}
void tst_qquicktextinput::cursorRectangle()