File indexing completed on 2024-11-03 11:12:30

0001 /*
0002     SPDX-FileCopyrightText: 2022 Aleix Pol Gonzalez <aleixpol@kde.org>
0003     SPDX-FileCopyrightText: 2022 Ilya Fedin <fedin-ilja2010@ya.ru>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "qwayland-xdg-activation-v1.h"
0009 #include <QWaylandClientExtensionTemplate>
0010 #include <QtWidgets>
0011 #include <qpa/qplatformnativeinterface.h>
0012 
0013 class WaylandXdgActivationTokenV1 : public QObject, public QtWayland::xdg_activation_token_v1
0014 {
0015     Q_OBJECT
0016 public:
0017     void xdg_activation_token_v1_done(const QString &token) override
0018     {
0019         Q_EMIT done(token);
0020     }
0021 
0022 Q_SIGNALS:
0023     void done(const QString &token);
0024 };
0025 
0026 class WaylandXdgActivationV1 : public QWaylandClientExtensionTemplate<WaylandXdgActivationV1>, public QtWayland::xdg_activation_v1
0027 {
0028 public:
0029     WaylandXdgActivationV1()
0030         : QWaylandClientExtensionTemplate<WaylandXdgActivationV1>(1)
0031     {
0032         // QWaylandClientExtensionTemplate invokes this with a QueuedConnection but we want shortcuts
0033         // to be inhibited immediately.
0034         QMetaObject::invokeMethod(this, "addRegistryListener");
0035     }
0036 
0037     WaylandXdgActivationTokenV1 *requestXdgActivationToken(wl_seat *seat, struct ::wl_surface *surface, uint32_t serial, const QString &app_id)
0038     {
0039         auto wl = get_activation_token();
0040         auto provider = new WaylandXdgActivationTokenV1;
0041         provider->init(wl);
0042         if (surface) {
0043             provider->set_surface(surface);
0044         }
0045 
0046         if (!app_id.isEmpty()) {
0047             provider->set_app_id(app_id);
0048         }
0049 
0050         if (seat) {
0051             provider->set_serial(serial, seat);
0052         }
0053         provider->commit();
0054         return provider;
0055     }
0056 };
0057 
0058 int main(int argc, char *argv[])
0059 {
0060 
0061     QApplication app(argc, argv);
0062     QWidget window1(nullptr, Qt::Window);
0063     window1.setWindowTitle("Window 1");
0064     window1.setLayout(new QVBoxLayout);
0065     QPushButton p("Raise the Window 2");
0066     window1.layout()->addWidget(&p);
0067     window1.show();
0068 
0069     QWidget window2(nullptr, Qt::Window);
0070     window2.setWindowTitle("Window 2");
0071     window2.show();
0072 
0073     WaylandXdgActivationV1 activation;
0074     QObject::connect(&p, &QPushButton::clicked, &app, [&] {
0075         QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();
0076         auto seat = static_cast<wl_seat *>(native->nativeResourceForIntegration("wl_seat"));
0077         wl_surface *surface = reinterpret_cast<wl_surface *>(native->nativeResourceForWindow(QByteArrayLiteral("surface"), window1.windowHandle()));
0078         auto req = activation.requestXdgActivationToken(seat, surface, 0, {});
0079         QObject::connect(req, &WaylandXdgActivationTokenV1::done, &app, [&activation, &window2](const QString &token) {
0080             window2.show();
0081             QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();
0082             wl_surface *surface = reinterpret_cast<wl_surface *>(native->nativeResourceForWindow(QByteArrayLiteral("surface"), window2.windowHandle()));
0083             activation.activate(token, surface);
0084         });
0085     });
0086 
0087     return app.exec();
0088 }
0089 
0090 #include "xdgactivationtest-qt5.moc"