/* SPDX-FileCopyrightText: 2020 Vlad Zahorodnii SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL */ #include "qwayland-xdg-shell.h" #include "qwayland-xx-session-management-v1.h" #include #include #include #include #include #include #include #include #include #include class XdgSessionManagerV1 : public QWaylandClientExtensionTemplate, public QtWayland::xx_session_manager_v1 { public: XdgSessionManagerV1() : QWaylandClientExtensionTemplate(1) { initialize(); } }; class XdgSessionV1 : public QtWayland::xx_session_v1 { public: ~XdgSessionV1() override { destroy(); } protected: void xx_session_v1_created(const QString &id) override { qDebug() << "xx_session_v1 created" << id; } void xx_session_v1_restored() override { qDebug() << "xx_session_v1 restored"; } }; class XdgToplevelSessionV1 : public QtWayland::xx_toplevel_session_v1 { public: ~XdgToplevelSessionV1() override { destroy(); } protected: void xx_toplevel_session_v1_restored(struct ::xdg_toplevel *surface) override { qDebug() << "xx_toplevel_session_v1 restored"; } }; class XdgSessionDemo : public QObject { Q_OBJECT public: ~XdgSessionDemo(); void setSessionId(const QString &sessionId); void setToplevelId(const QString &toplevelId); void start(); private: QString m_sessionId; QString m_toplevelId; XdgSessionManagerV1 m_sessionManager; XdgSessionV1 m_session; XdgToplevelSessionV1 m_toplevelSession; }; XdgSessionDemo::~XdgSessionDemo() { } void XdgSessionDemo::setSessionId(const QString &sessionId) { m_sessionId = sessionId; } void XdgSessionDemo::setToplevelId(const QString &toplevelId) { m_toplevelId = toplevelId; } void XdgSessionDemo::start() { QWidget *window = new QWidget(nullptr); if (!m_sessionManager.isActive()) { qCritical() << "No session manager available, this test cannot do nothing useful"; } if (m_sessionId.isEmpty()) { m_session.init(m_sessionManager.get_session(XdgSessionManagerV1::reason_launch, QString())); } else { m_session.init(m_sessionManager.get_session(XdgSessionManagerV1::reason_session_restore, m_sessionId)); } window->resize(200, 200); Q_ASSERT(!m_toplevelId.isEmpty()); window->createWinId(); if (auto waylandWindow = window->windowHandle()->nativeInterface()) { connect(waylandWindow, &QNativeInterface::Private::QWaylandWindow::surfaceRoleCreated, this, [this, waylandWindow]() { auto topLevelObject = waylandWindow->surfaceRole(); Q_ASSERT(topLevelObject); m_toplevelSession.init(m_session.restore_toplevel(topLevelObject, m_toplevelId)); }); } else { qCritical() << "No wayland window interface available"; } window->show(); } int main(int argc, char **argv) { QApplication app(argc, argv); QCommandLineParser parser; parser.addHelpOption(); QCommandLineOption sessionIdOption(QStringLiteral("session-id"), QStringLiteral("The session id"), QStringLiteral("session-id")); parser.addOption(sessionIdOption); QCommandLineOption toplevelIdOption(QStringLiteral("toplevel-id"), QStringLiteral("The toplevel id"), QStringLiteral("toplevel-id")); toplevelIdOption.setDefaultValue(QStringLiteral("main")); parser.addOption(toplevelIdOption); parser.process(app); XdgSessionDemo client; client.setSessionId(parser.value(sessionIdOption)); client.setToplevelId(parser.value(toplevelIdOption)); client.start(); return app.exec(); } #include "xdgsessiontest.moc"