Implement xdgshell v3

This commit is contained in:
Jan Blackquill 2021-01-06 01:08:25 +00:00
parent 26b249061e
commit a92b465f8f
3 changed files with 91 additions and 0 deletions

View file

@ -99,11 +99,72 @@ private Q_SLOTS:
void testXdgWindowGeometryInteractiveResize(); void testXdgWindowGeometryInteractiveResize();
void testXdgWindowGeometryFullScreen(); void testXdgWindowGeometryFullScreen();
void testXdgWindowGeometryMaximize(); void testXdgWindowGeometryMaximize();
void testXdgWindowReactive();
void testXdgWindowRepositioning();
void testPointerInputTransform(); void testPointerInputTransform();
void testReentrantSetFrameGeometry(); void testReentrantSetFrameGeometry();
void testDoubleMaximize(); void testDoubleMaximize();
}; };
void TestXdgShellClient::testXdgWindowReactive()
{
QScopedPointer<Test::XdgPositioner> positioner(Test::createXdgPositioner());
positioner->set_size(10, 10);
positioner->set_anchor_rect(10, 10, 10, 10);
positioner->set_reactive();
QScopedPointer<Surface> rootSurface(Test::createSurface());
QScopedPointer<Surface> childSurface(Test::createSurface());
QScopedPointer<Test::XdgToplevel> root(Test::createXdgToplevelSurface(rootSurface.data()));
QScopedPointer<Test::XdgPopup> popup(Test::createXdgPopupSurface(childSurface.data(), root->xdgSurface(), positioner.data()));
auto rootClient = Test::renderAndWaitForShown(rootSurface.data(), QSize(100, 100), Qt::cyan);
auto childClient = Test::renderAndWaitForShown(childSurface.data(), QSize(10, 10), Qt::cyan);
QVERIFY(rootClient);
QVERIFY(childClient);
QSignalSpy frameGeometryChangedSpy(childClient, &AbstractClient::frameGeometryChanged);
QVERIFY(frameGeometryChangedSpy.isValid());
rootClient->move(rootClient->x()+20, rootClient->y()+20);
QVERIFY(frameGeometryChangedSpy.wait());
QCOMPARE(frameGeometryChangedSpy.count(), 1);
}
void TestXdgShellClient::testXdgWindowRepositioning()
{
QScopedPointer<Test::XdgPositioner> positioner(Test::createXdgPositioner());
positioner->set_size(10, 10);
positioner->set_anchor_rect(10, 10, 10, 10);
QScopedPointer<Test::XdgPositioner> otherPositioner(Test::createXdgPositioner());
otherPositioner->set_size(50, 50);
otherPositioner->set_anchor_rect(10, 10, 10, 10);
QScopedPointer<Surface> rootSurface(Test::createSurface());
QScopedPointer<Surface> childSurface(Test::createSurface());
QScopedPointer<Test::XdgToplevel> root(Test::createXdgToplevelSurface(rootSurface.data()));
QScopedPointer<Test::XdgPopup> popup(Test::createXdgPopupSurface(childSurface.data(), root->xdgSurface(), positioner.data()));
auto rootClient = Test::renderAndWaitForShown(rootSurface.data(), QSize(100, 100), Qt::cyan);
auto childClient = Test::renderAndWaitForShown(childSurface.data(), QSize(10, 10), Qt::cyan);
QVERIFY(rootClient);
QVERIFY(childClient);
QSignalSpy reconfigureSpy(popup.data(), &Test::XdgPopup::configureRequested);
QVERIFY(reconfigureSpy.isValid());
popup->reposition(otherPositioner->object(), 500000);
QVERIFY(reconfigureSpy.wait());
QCOMPARE(reconfigureSpy.count(), 1);
}
void TestXdgShellClient::initTestCase() void TestXdgShellClient::initTestCase()
{ {
qRegisterMetaType<KWin::Deleted*>(); qRegisterMetaType<KWin::Deleted*>();

View file

@ -1705,10 +1705,37 @@ XdgPopupClient::XdgPopupClient(XdgPopupInterface *shellSurface)
this, &XdgPopupClient::handleGrabRequested); this, &XdgPopupClient::handleGrabRequested);
connect(shellSurface, &XdgPopupInterface::initializeRequested, connect(shellSurface, &XdgPopupInterface::initializeRequested,
this, &XdgPopupClient::initialize); this, &XdgPopupClient::initialize);
connect(shellSurface, &XdgPopupInterface::repositionRequested,
this, &XdgPopupClient::handleRepositionRequested);
connect(shellSurface, &XdgPopupInterface::destroyed, connect(shellSurface, &XdgPopupInterface::destroyed,
this, &XdgPopupClient::destroyClient); this, &XdgPopupClient::destroyClient);
} }
void XdgPopupClient::handlePositionerBindings()
{
if (m_shellSurface->positioner().isReactive()) {
connect(transientFor(), &AbstractClient::frameGeometryChanged,
this, &XdgPopupClient::relayout, Qt::UniqueConnection);
} else {
disconnect(transientFor(), &AbstractClient::frameGeometryChanged,
this, &XdgPopupClient::relayout);
}
}
void XdgPopupClient::handleRepositionRequested(quint32 token)
{
handlePositionerBindings();
m_shellSurface->sendRepositioned(token);
relayout();
}
void XdgPopupClient::relayout()
{
GeometryUpdatesBlocker blocker(this);
Placement::self()->place(this, QRect());
scheduleConfigure(ConfigureRequired);
}
XdgPopupClient::~XdgPopupClient() XdgPopupClient::~XdgPopupClient()
{ {
} }

View file

@ -249,7 +249,10 @@ protected:
private: private:
void handleGrabRequested(KWaylandServer::SeatInterface *seat, quint32 serial); void handleGrabRequested(KWaylandServer::SeatInterface *seat, quint32 serial);
void handlePositionerBindings();
void handleRepositionRequested(quint32 token);
void initialize(); void initialize();
void relayout();
KWaylandServer::XdgPopupInterface *m_shellSurface; KWaylandServer::XdgPopupInterface *m_shellSurface;
bool m_haveExplicitGrab = false; bool m_haveExplicitGrab = false;