diff options
author | Frederik Gladhorn <frederik.gladhorn@nokia.com> | 2012-03-13 20:25:12 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-24 17:07:52 +0100 |
commit | cea1a6bcd51a43bad6426e4de81fda117f094932 (patch) | |
tree | e059de1eee9446621bca8b46a0b5b730962a7f05 | |
parent | f195a8e2b69eba0e3c44f2dece222b0da9e06026 (diff) |
Make sure windows send accessibility activated updates.
Both QWindow and QWidgetWindow should update with the
active state signal.
Change-Id: I0219f803aa0fb109765f0faa0aedb120c2a439f0
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 21 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa.cpp | 10 | ||||
-rw-r--r-- | tests/auto/other/qaccessibility/tst_qaccessibility.cpp | 48 |
4 files changed, 71 insertions, 10 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index b9a3d3ac8c..7248a990d7 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -52,6 +52,7 @@ #include "qwindow_p.h" #include "qguiapplication_p.h" +#include "qaccessible.h" #include <private/qevent_p.h> @@ -1427,13 +1428,25 @@ bool QWindow::event(QEvent *ev) keyReleaseEvent(static_cast<QKeyEvent *>(ev)); break; - case QEvent::FocusIn: + case QEvent::FocusIn: { focusInEvent(static_cast<QFocusEvent *>(ev)); - break; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent event(this, state); + QAccessible::updateAccessibility(&event); +#endif + break; } - case QEvent::FocusOut: + case QEvent::FocusOut: { focusOutEvent(static_cast<QFocusEvent *>(ev)); - break; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent event(this, state); + QAccessible::updateAccessibility(&event); +#endif + break; } #ifndef QT_NO_WHEELEVENT case QEvent::Wheel: diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 790b51102c..ae050ac643 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -557,6 +557,8 @@ QAccessible::State QAccessibleWidget::state() const state.movable = true; if (w->minimumSize() != w->maximumSize()) state.sizeable = true; + if (w->isActiveWindow()) + state.active = true; } return state; diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index 7a13e2032e..ed7371a9bd 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -96,8 +96,14 @@ bool QWidgetWindow::event(QEvent *event) // these should not be sent to QWidget, the corresponding events // are sent by QApplicationPrivate::notifyActiveWindowChange() case QEvent::FocusIn: - case QEvent::FocusOut: - return false; + case QEvent::FocusOut: { +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent ev(widget(), state); + QAccessible::updateAccessibility(&ev); +#endif + return false; } case QEvent::FocusAboutToChange: if (QApplicationPrivate::focus_widget) { diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index be7cb7dd15..a01589d9d5 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -777,6 +777,7 @@ void tst_QAccessibility::applicationTest() void tst_QAccessibility::mainWindowTest() { + { QMainWindow *mw = new QMainWindow; mw->resize(300, 200); mw->show(); // triggers layout @@ -787,12 +788,51 @@ void tst_QAccessibility::mainWindowTest() QAccessibleEvent show(mw, QAccessible::ObjectShow); QVERIFY_EVENT(&show); - QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw); - QCOMPARE(interface->text(QAccessible::Name), name); - QCOMPARE(interface->role(), QAccessible::Window); - delete interface; + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(mw); + QCOMPARE(iface->text(QAccessible::Name), name); + QCOMPARE(iface->role(), QAccessible::Window); + QVERIFY(iface->state().active); + + QAccessible::State activeState; + activeState.active = true; + QAccessibleStateChangeEvent active(mw, activeState); + QVERIFY_EVENT(&active); + + delete iface; delete mw; + } QTestAccessibility::clearEvents(); + + { + QWindow window; + window.setGeometry(80, 80, 40, 40); + window.show(); + QTRY_VERIFY(QGuiApplication::focusWindow() == &window); + +// We currently don't have an accessible interface for QWindow +// the active state is either in the QMainWindow or QQuickView +// QAIPtr windowIface(QAccessible::queryAccessibleInterface(&window)); +// QVERIFY(windowIface->state().active); + + QAccessible::State activeState; + activeState.active = true; + QAccessibleStateChangeEvent active(&window, activeState); + QVERIFY_EVENT(&active); + + QWindow child; + child.setParent(&window); + child.setGeometry(10, 10, 20, 20); + child.show(); + + child.requestActivateWindow(); + QTRY_VERIFY(QGuiApplication::focusWindow() == &child); + + QAccessibleStateChangeEvent deactivate(&window, activeState); + QVERIFY_EVENT(&deactivate); // deactivation of parent + + QAccessibleStateChangeEvent activeChild(&child, activeState); + QVERIFY_EVENT(&activeChild); + } } class CounterButton : public QPushButton { |