summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qcoreevent.h2
-rw-r--r--src/gui/kernel/qapplication.cpp3
-rw-r--r--src/gui/kernel/qsoftkeymanager.cpp52
-rw-r--r--src/gui/kernel/qsoftkeymanager_p.h7
-rw-r--r--src/gui/kernel/qwidget.cpp2
-rw-r--r--tests/auto/qsoftkeymanager/qsoftkeymanager.pro4
-rw-r--r--tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp138
7 files changed, 183 insertions, 25 deletions
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 11fc988..bc96918 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -283,6 +283,8 @@ public:
SymbianDeferredFocusChanged = 201, // Internal for generating asynchronous focus events on Symbian
+ UpdateSoftKeys = 202, // Internal for compressing soft key updates
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index df4a935..774ec23 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -1160,6 +1160,7 @@ bool QApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventLis
|| event->type() == QEvent::Resize
|| event->type() == QEvent::Move
|| event->type() == QEvent::LanguageChange
+ || event->type() == QEvent::UpdateSoftKeys
|| event->type() == QEvent::InputMethod)) {
for (int i = 0; i < postedEvents->size(); ++i) {
const QPostEvent &cur = postedEvents->at(i);
@@ -1177,6 +1178,8 @@ bool QApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventLis
((QMoveEvent *)(cur.event))->p = ((QMoveEvent *)event)->p;
} else if (cur.event->type() == QEvent::LanguageChange) {
;
+ } else if (cur.event->type() == QEvent::UpdateSoftKeys) {
+ ;
} else if ( cur.event->type() == QEvent::InputMethod ) {
*(QInputMethodEvent *)(cur.event) = *(QInputMethodEvent *)event;
} else {
diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp
index a7a5223..76fb378 100644
--- a/src/gui/kernel/qsoftkeymanager.cpp
+++ b/src/gui/kernel/qsoftkeymanager.cpp
@@ -139,32 +139,40 @@ void QSoftKeyManager::sendKeyEvent()
new QKeyEvent(QEvent::KeyPress, keyToSend, Qt::NoModifier));
}
-void QSoftKeyManager::updateSoftKeys(bool force)
+void QSoftKeyManager::updateSoftKeys()
{
- QList<QAction*> softKeys;
- QWidget *source = QApplication::focusWidget();
- do {
- if (source) {
- QList<QAction*> actions = source->actions();
- for (int i = 0; i < actions.count(); ++i) {
- if (actions.at(i)->softKeyRole() != QAction::NoSoftKey)
- softKeys.append(actions.at(i));
- }
+ QEvent *event = new QEvent(QEvent::UpdateSoftKeys);
+ QApplication::postEvent(QSoftKeyManager::instance(), event);
+}
- QWidget *parent = source->parentWidget();
- if (parent && softKeys.isEmpty())
- source = parent;
- else
- break;
- } else {
- source = QApplication::activeWindow();
- }
- } while (source);
+bool QSoftKeyManager::event(QEvent *e)
+{
+ if (e->type() == QEvent::UpdateSoftKeys) {
+ QList<QAction*> softKeys;
+ QWidget *source = QApplication::focusWidget();
+ do {
+ if (source) {
+ QList<QAction*> actions = source->actions();
+ for (int i = 0; i < actions.count(); ++i) {
+ if (actions.at(i)->softKeyRole() != QAction::NoSoftKey)
+ softKeys.append(actions.at(i));
+ }
+
+ QWidget *parent = source->parentWidget();
+ if (parent && softKeys.isEmpty())
+ source = parent;
+ else
+ break;
+ } else {
+ source = QApplication::activeWindow();
+ }
+ } while (source);
- if (force || (source != QSoftKeyManager::softKeySource)) {
- QSoftKeyManager::softKeySource = source;
- QSoftKeyManager::updateSoftKeys_sys(softKeys);
+ QSoftKeyManager::softKeySource = source;
+ QSoftKeyManager::updateSoftKeys_sys(softKeys);
+ return true;
}
+ return false;
}
#ifdef Q_WS_S60
diff --git a/src/gui/kernel/qsoftkeymanager_p.h b/src/gui/kernel/qsoftkeymanager_p.h
index 743b4d4..229df98 100644
--- a/src/gui/kernel/qsoftkeymanager_p.h
+++ b/src/gui/kernel/qsoftkeymanager_p.h
@@ -60,7 +60,7 @@ QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class QSoftKeyManager : public QObject
+class Q_AUTOTEST_EXPORT QSoftKeyManager : public QObject
{
Q_OBJECT
@@ -73,7 +73,7 @@ public:
CancelSoftKey,
};
- static void updateSoftKeys(bool force = false);
+ static void updateSoftKeys();
static QAction *createAction(StandardSoftKey standardKey, QWidget *actionWidget);
static QAction *createKeyedAction(StandardSoftKey standardKey, Qt::Key key, QWidget *actionWidget);
@@ -91,6 +91,9 @@ private:
static QWidget *softKeySource;
QHash<QAction*, Qt::Key> keyedActions;
+protected:
+ bool event(QEvent *e);
+
Q_DISABLE_COPY(QSoftKeyManager)
private Q_SLOTS:
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 41d0b23..00ad430 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -8257,7 +8257,7 @@ bool QWidget::event(QEvent *event)
case QEvent::ActionRemoved:
case QEvent::ActionChanged:
#ifdef QT_SOFTKEYS_ENABLED
- QSoftKeyManager::updateSoftKeys(true);
+ QSoftKeyManager::updateSoftKeys();
#endif
actionEvent((QActionEvent*)event);
break;
diff --git a/tests/auto/qsoftkeymanager/qsoftkeymanager.pro b/tests/auto/qsoftkeymanager/qsoftkeymanager.pro
new file mode 100644
index 0000000..61ed4dc
--- /dev/null
+++ b/tests/auto/qsoftkeymanager/qsoftkeymanager.pro
@@ -0,0 +1,4 @@
+load(qttest_p4)
+SOURCES += tst_qsoftkeymanager.cpp
+
+requires(symbian)
diff --git a/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp b/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp
new file mode 100644
index 0000000..81ef498
--- /dev/null
+++ b/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+
+#include "qevent.h"
+#include "private/qsoftkeymanager_p.h"
+
+class tst_QSoftKeyManager : public QObject
+{
+Q_OBJECT
+
+public:
+ tst_QSoftKeyManager();
+ virtual ~tst_QSoftKeyManager();
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+ void init();
+ void cleanup();
+private slots:
+ void updateSoftKeysCompressed();
+};
+
+class EventListener : public QObject
+{
+public:
+ EventListener(QObject *listenTo)
+ {
+ resetCounts();
+ if (listenTo)
+ listenTo->installEventFilter(this);
+ }
+
+ void resetCounts()
+ {
+ numUpdateSoftKeys = 0;
+ }
+
+ int numUpdateSoftKeys;
+
+protected:
+ bool eventFilter(QObject * /*object*/, QEvent *event)
+ {
+ if (event->type() == QEvent::UpdateSoftKeys)
+ numUpdateSoftKeys++;
+ return false;
+ }
+};
+
+tst_QSoftKeyManager::tst_QSoftKeyManager() : QObject()
+{
+}
+
+tst_QSoftKeyManager::~tst_QSoftKeyManager()
+{
+}
+
+void tst_QSoftKeyManager::initTestCase()
+{
+}
+
+void tst_QSoftKeyManager::cleanupTestCase()
+{
+}
+
+void tst_QSoftKeyManager::init()
+{
+}
+
+void tst_QSoftKeyManager::cleanup()
+{
+}
+
+/*
+ This tests that we only get one UpdateSoftKeys event even though
+ multiple events that trigger soft keys occur.
+*/
+void tst_QSoftKeyManager::updateSoftKeysCompressed()
+{
+ QWidget w;
+ EventListener listener(qApp);
+
+ QList<QAction *> softKeys;
+ for (int i = 0; i < 10; ++i) {
+ QAction *action = new QAction("foo", &w);
+ action->setSoftKeyRole(QAction::PositiveSoftKey);
+ softKeys << action;
+ }
+ w.addActions(softKeys);
+
+ QApplication::processEvents();
+
+ QVERIFY(listener.numUpdateSoftKeys == 1);
+}
+
+
+QTEST_MAIN(tst_QSoftKeyManager)
+#include "tst_qsoftkeymanager.moc"