Add QPlatformScreen::windows() helper to return all windows on screen

Change-Id: Ib55b37b64ed0890ca777dfea8c4d702e267c34bf
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
This commit is contained in:
Tor Arne Vestbø 2018-08-06 18:37:14 +02:00
parent be35539123
commit e7063e6cc6
2 changed files with 17 additions and 9 deletions

View File

@ -103,6 +103,20 @@ QWindow *QPlatformScreen::topLevelAt(const QPoint & pos) const
return 0; return 0;
} }
/*!
Return all windows residing on this screen.
*/
QWindowList QPlatformScreen::windows() const
{
QWindowList windows;
for (QWindow *window : QGuiApplication::allWindows()) {
if (platformScreenForWindow(window) != this)
continue;
windows.append(window);
}
return windows;
}
/*! /*!
Find the sibling screen corresponding to \a globalPos. Find the sibling screen corresponding to \a globalPos.
@ -369,25 +383,17 @@ QPlatformCursor *QPlatformScreen::cursor() const
*/ */
void QPlatformScreen::resizeMaximizedWindows() void QPlatformScreen::resizeMaximizedWindows()
{ {
QList<QWindow*> windows = QGuiApplication::allWindows();
// 'screen()' still has the old geometry info while 'this' has the new geometry info // 'screen()' still has the old geometry info while 'this' has the new geometry info
const QRect oldGeometry = screen()->geometry(); const QRect oldGeometry = screen()->geometry();
const QRect oldAvailableGeometry = screen()->availableGeometry(); const QRect oldAvailableGeometry = screen()->availableGeometry();
const QRect newGeometry = deviceIndependentGeometry(); const QRect newGeometry = deviceIndependentGeometry();
const QRect newAvailableGeometry = QHighDpi::fromNative(availableGeometry(), QHighDpiScaling::factor(this), newGeometry.topLeft()); const QRect newAvailableGeometry = QHighDpi::fromNative(availableGeometry(), QHighDpiScaling::factor(this), newGeometry.topLeft());
// make sure maximized and fullscreen windows are updated for (QWindow *w : windows()) {
for (int i = 0; i < windows.size(); ++i) {
QWindow *w = windows.at(i);
// Skip non-platform windows, e.g., offscreen windows. // Skip non-platform windows, e.g., offscreen windows.
if (!w->handle()) if (!w->handle())
continue; continue;
if (platformScreenForWindow(w) != this)
continue;
if (w->windowState() & Qt::WindowMaximized || w->geometry() == oldAvailableGeometry) if (w->windowState() & Qt::WindowMaximized || w->geometry() == oldAvailableGeometry)
w->setGeometry(newAvailableGeometry); w->setGeometry(newAvailableGeometry);
else if (w->windowState() & Qt::WindowFullScreen || w->geometry() == oldGeometry) else if (w->windowState() & Qt::WindowFullScreen || w->geometry() == oldGeometry)

View File

@ -123,6 +123,8 @@ public:
virtual void setOrientationUpdateMask(Qt::ScreenOrientations mask); virtual void setOrientationUpdateMask(Qt::ScreenOrientations mask);
virtual QWindow *topLevelAt(const QPoint &point) const; virtual QWindow *topLevelAt(const QPoint &point) const;
QWindowList windows() const;
virtual QList<QPlatformScreen *> virtualSiblings() const; virtual QList<QPlatformScreen *> virtualSiblings() const;
const QPlatformScreen *screenForPosition(const QPoint &point) const; const QPlatformScreen *screenForPosition(const QPoint &point) const;