client: Avoid roundtrip to handle xdgoutput race condition
The original bug was that we could get a surface enter event before the xdg output was fully ready, where we had a QPlatformScreen but no QScreen announced. A solution with a roundtrip was added, which works, but roundtrips cause other problems processing messages out of order and inhibts a move to synchronous delivery. As an alternative fix we move the problem from QWaylandWindow to QWaylandSurface and have that filter out not-ready QScreens. The best output is then re-evaluated whenever a screen is added. Change-Id: Iabc78917112aa8c58cad8e128c5bb3030f8c8f65 Reviewed-by: David Redondo <qt@david-redondo.de>
This commit is contained in:
parent
2f7a86fac3
commit
8457dd76e3
@ -15,6 +15,7 @@ QWaylandSurface::QWaylandSurface(QWaylandDisplay *display)
|
|||||||
: wl_surface(display->createSurface(this))
|
: wl_surface(display->createSurface(this))
|
||||||
{
|
{
|
||||||
connect(qApp, &QGuiApplication::screenRemoved, this, &QWaylandSurface::handleScreenRemoved);
|
connect(qApp, &QGuiApplication::screenRemoved, this, &QWaylandSurface::handleScreenRemoved);
|
||||||
|
connect(qApp, &QGuiApplication::screenAdded, this, &QWaylandSurface::screensChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
QWaylandSurface::~QWaylandSurface()
|
QWaylandSurface::~QWaylandSurface()
|
||||||
@ -24,7 +25,14 @@ QWaylandSurface::~QWaylandSurface()
|
|||||||
|
|
||||||
QWaylandScreen *QWaylandSurface::oldestEnteredScreen()
|
QWaylandScreen *QWaylandSurface::oldestEnteredScreen()
|
||||||
{
|
{
|
||||||
return m_screens.value(0, nullptr);
|
for (auto *screen : std::as_const(m_screens)) {
|
||||||
|
// only report valid screens
|
||||||
|
// we can have some ouptuts waiting for xdg output information
|
||||||
|
// that are valid QPlatformScreens, but not valid QScreens
|
||||||
|
if (screen->screen())
|
||||||
|
return screen;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QWaylandSurface *QWaylandSurface::fromWlSurface(::wl_surface *surface)
|
QWaylandSurface *QWaylandSurface::fromWlSurface(::wl_surface *surface)
|
||||||
|
@ -557,7 +557,6 @@ QPlatformScreen *QWaylandWindow::calculateScreenFromSurfaceEvents() const
|
|||||||
if (auto *screen = mSurface->oldestEnteredScreen())
|
if (auto *screen = mSurface->oldestEnteredScreen())
|
||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QPlatformWindow::screen();
|
return QPlatformWindow::screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,8 +1439,6 @@ void QWaylandWindow::handleScreensChanged()
|
|||||||
if (newScreen->screen() == window()->screen())
|
if (newScreen->screen() == window()->screen())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!newScreen->isPlaceholder() && !newScreen->QPlatformScreen::screen())
|
|
||||||
mDisplay->forceRoundTrip();
|
|
||||||
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||||
|
|
||||||
if (fixedToplevelPositions && !QPlatformWindow::parent() && window()->type() != Qt::Popup
|
if (fixedToplevelPositions && !QPlatformWindow::parent() && window()->type() != Qt::Popup
|
||||||
|
Loading…
x
Reference in New Issue
Block a user