summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraxis <qt-info@nokia.com>2009-07-09 11:36:37 +0200
committeraxis <qt-info@nokia.com>2009-07-09 11:49:13 +0200
commitb6377f43410b14125a66ffd02acde69cfb6e455e (patch)
treeee150876b60fa127037efa302640de42060a3230
parentf9dcdb8ca49a67b6bd0a191bf622efb2efe9111b (diff)
downloadqt4-tools-b6377f43410b14125a66ffd02acde69cfb6e455e.tar.gz
Switched to asynchronous focus handling on Symbian.
This was done in order to be more in line with what other platforms (at least X11) do. In addition, it prevents show() from entering event handlers in Qt. That should only happen in processEvents(). This required the introduction of a new event, SymbianDeferredFocusChanged, which we post whenever there is a focus change. RevBy: Jason Barron AutoTest: Passed
-rw-r--r--src/corelib/kernel/qcoreevent.cpp1
-rw-r--r--src/corelib/kernel/qcoreevent.h2
-rw-r--r--src/gui/kernel/qapplication_s60.cpp16
-rw-r--r--src/gui/kernel/qwidget.cpp6
-rw-r--r--src/gui/kernel/qwidget_p.h3
-rw-r--r--src/gui/kernel/qwidget_s60.cpp26
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp9
7 files changed, 49 insertions, 14 deletions
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index 01b310b5ff..b1c01ca9d0 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -266,6 +266,7 @@ QT_BEGIN_NAMESPACE
\omitvalue NetworkReplyUpdated
\omitvalue FutureCallOut
\omitvalue CocoaRequestModal
+ \omitvalue SymbianDeferredFocusChanged
*/
/*!
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index d896ad553e..e88525a970 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -269,6 +269,8 @@ public:
RequestSoftwareInputPanel = 192,
CloseSoftwareInputPanel = 193,
+ SymbianDeferredFocusChanged = 194, // Internal for generating asynchronous focus events on Symbian
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index b954ddbfc9..dd05806e9a 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -659,20 +659,8 @@ void QSymbianControl::FocusChanged(TDrawNow /* aDrawNow */)
|| (qwidget->windowType() & Qt::Popup) == Qt::Popup)
return;
- if (IsFocused()) {
- QApplication::setActiveWindow(qwidget);
- // If widget is fullscreen, hide status pane and button container
- // otherwise show them.
- CEikStatusPane* statusPane = S60->statusPane();
- CEikButtonGroupContainer* buttonGroup = S60->buttonGroupContainer();
- bool isFullscreen = qwidget->windowState() & Qt::WindowFullScreen;
- if (statusPane && (statusPane->IsVisible() == isFullscreen))
- statusPane->MakeVisible(!isFullscreen);
- if (buttonGroup && (buttonGroup->IsVisible() == isFullscreen))
- buttonGroup->MakeVisible(!isFullscreen);
- } else {
- QApplication::setActiveWindow(0);
- }
+ QEvent *deferredFocusEvent = new QEvent(QEvent::SymbianDeferredFocusChanged);
+ QApplication::postEvent(qwidget, deferredFocusEvent);
}
void QSymbianControl::HandleResourceChange(int resourceType)
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index baacdf52ec..f1094c5026 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -8018,6 +8018,12 @@ bool QWidget::event(QEvent *event)
d->needWindowChange = false;
break;
#endif
+ case QEvent::SymbianDeferredFocusChanged: {
+#ifdef Q_OS_SYMBIAN
+ d->handleSymbianDeferredFocusChanged();
+#endif
+ break;
+ }
#ifndef QT_NO_PROPERTIES
case QEvent::DynamicPropertyChange: {
const QByteArray &propName = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index 0ad02553bd..24e75036ce 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -279,6 +279,9 @@ public:
#ifdef Q_WS_S60
void s60UpdateIsOpaque();
#endif
+#ifdef Q_OS_SYMBIAN
+ void handleSymbianDeferredFocusChanged();
+#endif
void raise_sys();
void lower_sys();
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index c8bca6e21e..3c7e4246df 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -421,6 +421,32 @@ void QWidgetPrivate::setFocus_sys()
q->effectiveWinId()->SetFocus(true);
}
+void QWidgetPrivate::handleSymbianDeferredFocusChanged()
+{
+ Q_Q(QWidget);
+ WId control = q->internalWinId();
+ if (!control) {
+ // This could happen if the widget was reparented, while the focuschange
+ // was in the event queue.
+ return;
+ }
+
+ if (control->IsFocused()) {
+ QApplication::setActiveWindow(q);
+ // If widget is fullscreen, hide status pane and button container
+ // otherwise show them.
+ CEikStatusPane* statusPane = S60->statusPane();
+ CEikButtonGroupContainer* buttonGroup = S60->buttonGroupContainer();
+ bool isFullscreen = q->windowState() & Qt::WindowFullScreen;
+ if (statusPane && (statusPane->IsVisible() == isFullscreen))
+ statusPane->MakeVisible(!isFullscreen);
+ if (buttonGroup && (buttonGroup->IsVisible() == isFullscreen))
+ buttonGroup->MakeVisible(!isFullscreen);
+ } else {
+ QApplication::setActiveWindow(0);
+ }
+}
+
void QWidgetPrivate::raise_sys()
{
Q_Q(QWidget);
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index eccb21bbda..abff886738 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -6128,6 +6128,9 @@ void tst_QWidget::compatibilityChildInsertedEvents()
EventRecorder::EventList()
<< qMakePair(&widget, QEvent::PolishRequest)
<< qMakePair(&widget, QEvent::Type(QEvent::User + 1))
+#ifdef Q_OS_SYMBIAN
+ << qMakePair(&widget, QEvent::SymbianDeferredFocusChanged)
+#endif
#if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_QWS) || defined(Q_WS_S60)
<< qMakePair(&widget, QEvent::UpdateRequest)
#endif
@@ -6223,6 +6226,9 @@ void tst_QWidget::compatibilityChildInsertedEvents()
<< qMakePair(&widget, QEvent::PolishRequest)
<< qMakePair(&widget, QEvent::Type(QEvent::User + 1))
<< qMakePair(&widget, QEvent::Type(QEvent::User + 2))
+#ifdef Q_OS_SYMBIAN
+ << qMakePair(&widget, QEvent::SymbianDeferredFocusChanged)
+#endif
#if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_QWS) || defined(Q_WS_S60)
<< qMakePair(&widget, QEvent::UpdateRequest)
#endif
@@ -6318,6 +6324,9 @@ void tst_QWidget::compatibilityChildInsertedEvents()
<< qMakePair(&widget, QEvent::PolishRequest)
<< qMakePair(&widget, QEvent::Type(QEvent::User + 1))
<< qMakePair(&widget, QEvent::Type(QEvent::User + 2))
+#ifdef Q_OS_SYMBIAN
+ << qMakePair(&widget, QEvent::SymbianDeferredFocusChanged)
+#endif
#if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_QWS) || defined(Q_WS_S60)
<< qMakePair(&widget, QEvent::UpdateRequest)
#endif