Client: Don't allow decorations for frameless windows

This only fixes it for when Qt::FramelessWindowHint is set appropriately before
the window is shown.

[ChangeLog][QPA plugin] Windows with Qt::FramelessWindowHint no longer
create zxdg_toplevel_decoration_v1, as that allowed compositors to force
server-side decorations.

Fixes: QTBUG-80702
Change-Id: I47a582a59f6682a57128c0c9d4e4b9a6181925a4
Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
This commit is contained in:
Johan Klokkhammer Helsing 2020-02-11 14:28:32 +01:00
parent 84209cf53b
commit b74257332f
2 changed files with 22 additions and 3 deletions

View File

@ -56,10 +56,11 @@ QWaylandXdgSurface::Toplevel::Toplevel(QWaylandXdgSurface *xdgSurface)
: QtWayland::xdg_toplevel(xdgSurface->get_toplevel())
, m_xdgSurface(xdgSurface)
{
if (auto *decorationManager = m_xdgSurface->m_shell->decorationManager())
m_decoration = decorationManager->createToplevelDecoration(object());
QWindow *window = xdgSurface->window()->window();
if (auto *decorationManager = m_xdgSurface->m_shell->decorationManager()) {
if (!(window->flags() & Qt::FramelessWindowHint))
m_decoration = decorationManager->createToplevelDecoration(object());
}
requestWindowStates(window->windowStates());
requestWindowFlags(window->flags());
}

View File

@ -153,6 +153,7 @@ private slots:
void initTestCase();
void cleanup() { QTRY_VERIFY2(isClean(), qPrintable(dirtyMessage())); }
void clientSidePreferredByCompositor();
void initialFramelessWindowHint();
};
void tst_xdgdecorationv1::initTestCase()
@ -182,5 +183,22 @@ void tst_xdgdecorationv1::clientSidePreferredByCompositor()
QTRY_VERIFY(!window.frameMargins().isNull());
}
void tst_xdgdecorationv1::initialFramelessWindowHint()
{
QRasterWindow window;
window.setFlag(Qt::FramelessWindowHint, true);
window.show();
QCOMPOSITOR_TRY_COMPARE(get<XdgDecorationManagerV1>()->resourceMap().size(), 1);
QCOMPOSITOR_TRY_VERIFY(xdgToplevel());
exec([=]{
xdgToplevel()->sendCompleteConfigure();
});
QCOMPOSITOR_TRY_VERIFY(xdgSurface()->m_committedConfigureSerial);
// The client should not have create a decoration object, because that allows the compositor
// to override our decision and add server side decorations to our window.
QCOMPOSITOR_TRY_VERIFY(!toplevelDecoration());
}
QCOMPOSITOR_TEST_MAIN(tst_xdgdecorationv1)
#include "tst_xdgdecorationv1.moc"