summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qapplication_qpa.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-05-30 14:16:43 +0200
committerLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-05-30 14:41:14 +0200
commite277d144259ce4e440cf789c83ba095b4c4d06a6 (patch)
treec51d4bf7d45f602c108c33eab60daee28fe7477f /src/widgets/kernel/qapplication_qpa.cpp
parentef8e5af1d219dd749ea306230cfd097cc2595cb4 (diff)
Add focus and modal dialog support.
Reviewed-by: Samuel Rødal
Diffstat (limited to 'src/widgets/kernel/qapplication_qpa.cpp')
-rw-r--r--src/widgets/kernel/qapplication_qpa.cpp42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/widgets/kernel/qapplication_qpa.cpp b/src/widgets/kernel/qapplication_qpa.cpp
index 4ed8eda460..0210c1474e 100644
--- a/src/widgets/kernel/qapplication_qpa.cpp
+++ b/src/widgets/kernel/qapplication_qpa.cpp
@@ -71,6 +71,8 @@ QT_BEGIN_NAMESPACE
static QString appName;
static QString appFont;
+extern bool app_do_modal;
+extern QWidgetList *qt_modal_stack;
QString QApplicationPrivate::appName() const
{
@@ -82,7 +84,7 @@ void QApplicationPrivate::createEventDispatcher()
QGuiApplicationPrivate::createEventDispatcher();
}
-static bool qt_try_modal(QWidget *widget, QEvent::Type type)
+bool qt_try_modal(QWidget *widget, QEvent::Type type)
{
QWidget * top = 0;
@@ -116,21 +118,16 @@ static bool qt_try_modal(QWidget *widget, QEvent::Type type)
return !block_event;
}
-
-
-void QApplicationPrivate::enterModal_sys(QWidget *)
+void QApplicationPrivate::enterModal_sys(QWidget *widget)
{
-#if 0
if (!qt_modal_stack)
qt_modal_stack = new QWidgetList;
qt_modal_stack->insert(0, widget);
app_do_modal = true;
-#endif
}
-void QApplicationPrivate::leaveModal_sys(QWidget *)
+void QApplicationPrivate::leaveModal_sys(QWidget *widget)
{
-#if 0
if (qt_modal_stack && qt_modal_stack->removeAll(widget)) {
if (qt_modal_stack->isEmpty()) {
delete qt_modal_stack;
@@ -138,15 +135,36 @@ void QApplicationPrivate::leaveModal_sys(QWidget *)
}
}
app_do_modal = qt_modal_stack != 0;
-#endif
}
bool QApplicationPrivate::modalState()
{
- return false;
-#if 0
return app_do_modal;
-#endif
+}
+
+QWidget *qt_tlw_for_window(QWindow *wnd)
+{
+ if (wnd)
+ foreach (QWidget *tlw, qApp->topLevelWidgets())
+ if (tlw->windowHandle() == wnd)
+ return tlw;
+ return 0;
+}
+
+void QApplicationPrivate::notifyActiveWindowChange(QWindow *previous)
+{
+ Q_UNUSED(previous);
+ Q_Q(QApplication);
+ QWindow *wnd = QGuiApplicationPrivate::active_window;
+ QWidget *tlw = qt_tlw_for_window(wnd);
+ if (!tlw)
+ return;
+ if (modalState()
+ && !qt_try_modal(tlw, QEvent::MouseButtonRelease)
+ && q->activeWindow())
+ q->activeWindow()->activateWindow();
+ else
+ q->setActiveWindow(tlw);
}
void QApplicationPrivate::closePopup(QWidget *popup)