summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@nokia.com>2012-03-13 20:25:12 +0100
committerQt by Nokia <qt-info@nokia.com>2012-03-24 17:07:52 +0100
commitcea1a6bcd51a43bad6426e4de81fda117f094932 (patch)
treee059de1eee9446621bca8b46a0b5b730962a7f05
parentf195a8e2b69eba0e3c44f2dece222b0da9e06026 (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.cpp21
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp2
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp10
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp48
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 {