summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2011-05-21 21:31:46 +0200
committerLars Knoll <lars.knoll@nokia.com>2011-05-22 13:52:17 +0200
commitfd7bfc618430bbd5e9d4118d264179c22abf3f4a (patch)
treeb1afcabe36dffba2358eea8e17b189d6b771d743 /src/gui/kernel
parent121cc4d955fe4aa3b0f9de0d61bf1ff9f6e944ab (diff)
Add QGuiApp::topLevelAt and fix visibility flag
Add and remove windows to the list of top level windows. Correctly set the visibility flag for windows and implement a QGuiApplication::topLevelAt() method that uses the QPlatformScreen.
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qguiapplication.cpp21
-rw-r--r--src/gui/kernel/qguiapplication.h1
-rw-r--r--src/gui/kernel/qwindow.cpp10
3 files changed, 30 insertions, 2 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 5bc6d1b2e0..c809e772c4 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -183,6 +183,27 @@ QWindowList QGuiApplication::topLevelWindows()
return QGuiApplicationPrivate::window_list;
}
+QWindow *QGuiApplication::topLevelAt(const QPoint &pos)
+{
+ QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
+
+ QList<QPlatformScreen *> screens = pi->screens();
+ QList<QPlatformScreen *>::const_iterator screen = screens.constBegin();
+ QList<QPlatformScreen *>::const_iterator end = screens.constEnd();
+
+ // The first screen in a virtual environment should know about all top levels
+ if (pi->isVirtualDesktop())
+ return (*screen)->topLevelAt(pos);
+
+ while (screen != end) {
+ if ((*screen)->geometry().contains(pos))
+ return (*screen)->topLevelAt(pos);
+ ++screen;
+ }
+ return 0;
+}
+
+
static void init_platform(const QString &name, const QString &platformPluginPath)
{
QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, platformPluginPath);
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index f12214dee1..4557b946a8 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -80,6 +80,7 @@ public:
virtual ~QGuiApplication();
static QWindowList topLevelWindows();
+ static QWindow *topLevelAt(const QPoint &pos);
static QWindow *activeWindow();
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index fef579b6b0..5efd087b09 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -58,21 +58,27 @@ QWindow::QWindow(QWindow *parent)
{
Q_D(QWindow);
d->parentWindow = parent;
+ QGuiApplicationPrivate::window_list.prepend(this);
}
QWindow::~QWindow()
{
if (QGuiApplicationPrivate::active_window == this)
QGuiApplicationPrivate::active_window = 0;
+ QGuiApplicationPrivate::window_list.removeAll(this);
destroy();
}
void QWindow::setVisible(bool visible)
{
Q_D(QWindow);
- if (!d->platformWindow) {
+
+ if (d->visible == visible)
+ return;
+ d->visible = visible;
+
+ if (!d->platformWindow)
create();
- }
d->platformWindow->setVisible(visible);
}