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:
parent
84209cf53b
commit
b74257332f
@ -56,10 +56,11 @@ QWaylandXdgSurface::Toplevel::Toplevel(QWaylandXdgSurface *xdgSurface)
|
|||||||
: QtWayland::xdg_toplevel(xdgSurface->get_toplevel())
|
: QtWayland::xdg_toplevel(xdgSurface->get_toplevel())
|
||||||
, m_xdgSurface(xdgSurface)
|
, m_xdgSurface(xdgSurface)
|
||||||
{
|
{
|
||||||
if (auto *decorationManager = m_xdgSurface->m_shell->decorationManager())
|
|
||||||
m_decoration = decorationManager->createToplevelDecoration(object());
|
|
||||||
|
|
||||||
QWindow *window = xdgSurface->window()->window();
|
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());
|
requestWindowStates(window->windowStates());
|
||||||
requestWindowFlags(window->flags());
|
requestWindowFlags(window->flags());
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,7 @@ private slots:
|
|||||||
void initTestCase();
|
void initTestCase();
|
||||||
void cleanup() { QTRY_VERIFY2(isClean(), qPrintable(dirtyMessage())); }
|
void cleanup() { QTRY_VERIFY2(isClean(), qPrintable(dirtyMessage())); }
|
||||||
void clientSidePreferredByCompositor();
|
void clientSidePreferredByCompositor();
|
||||||
|
void initialFramelessWindowHint();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_xdgdecorationv1::initTestCase()
|
void tst_xdgdecorationv1::initTestCase()
|
||||||
@ -182,5 +183,22 @@ void tst_xdgdecorationv1::clientSidePreferredByCompositor()
|
|||||||
QTRY_VERIFY(!window.frameMargins().isNull());
|
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)
|
QCOMPOSITOR_TEST_MAIN(tst_xdgdecorationv1)
|
||||||
#include "tst_xdgdecorationv1.moc"
|
#include "tst_xdgdecorationv1.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user