File indexing completed on 2024-05-12 05:37:09

0001 /*
0002     SPDX-FileCopyrightText: 2008 Alain Boyer <alainboyer@gmail.com>
0003     SPDX-FileCopyrightText: 2009 Matthieu Gallien <matthieu_gallien@yahoo.fr>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "statusnotifieritemjob.h"
0009 #include <KWaylandExtras>
0010 #include <KWindowSystem>
0011 #include <memory>
0012 
0013 StatusNotifierItemJob::StatusNotifierItemJob(StatusNotifierItemSource *source, const QString &operation, QMap<QString, QVariant> &parameters, QObject *parent)
0014     : ServiceJob(source->objectName(), operation, parameters, parent)
0015     , m_source(source)
0016 {
0017     // Queue connection, so that all 'deleteLater' are performed before we use updated menu.
0018     connect(source, SIGNAL(contextMenuReady(QMenu *)), this, SLOT(contextMenuReady(QMenu *)), Qt::QueuedConnection);
0019     connect(source, &StatusNotifierItemSource::activateResult, this, &StatusNotifierItemJob::activateCallback);
0020 }
0021 
0022 StatusNotifierItemJob::~StatusNotifierItemJob()
0023 {
0024 }
0025 
0026 void StatusNotifierItemJob::start()
0027 {
0028     if (operationName() == QLatin1String("Scroll")) {
0029         performJob();
0030         return;
0031     }
0032 
0033     QWindow *window = nullptr;
0034     const quint32 launchedSerial = KWaylandExtras::lastInputSerial(window);
0035     auto conn = std::make_shared<QMetaObject::Connection>();
0036     *conn =
0037         connect(KWaylandExtras::self(), &KWaylandExtras::xdgActivationTokenArrived, this, [this, launchedSerial, conn](quint32 serial, const QString &token) {
0038             if (serial == launchedSerial) {
0039                 disconnect(*conn);
0040                 m_source->provideXdgActivationToken(token);
0041                 performJob();
0042             }
0043         });
0044     KWaylandExtras::requestXdgActivationToken(window, launchedSerial, {});
0045 }
0046 
0047 void StatusNotifierItemJob::performJob()
0048 {
0049     if (operationName() == QString::fromLatin1("Activate")) {
0050         m_source->activate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0051     } else if (operationName() == QString::fromLatin1("SecondaryActivate")) {
0052         m_source->secondaryActivate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0053         setResult(0);
0054     } else if (operationName() == QString::fromLatin1("ContextMenu")) {
0055         m_source->contextMenu(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0056     } else if (operationName() == QString::fromLatin1("Scroll")) {
0057         m_source->scroll(parameters()[QStringLiteral("delta")].toInt(), parameters()[QStringLiteral("direction")].toString());
0058         setResult(0);
0059     }
0060 }
0061 
0062 void StatusNotifierItemJob::activateCallback(bool success)
0063 {
0064     if (operationName() == QString::fromLatin1("Activate")) {
0065         setResult(QVariant(success));
0066     }
0067 }
0068 
0069 void StatusNotifierItemJob::contextMenuReady(QMenu *menu)
0070 {
0071     if (operationName() == QString::fromLatin1("ContextMenu")) {
0072         setResult(QVariant::fromValue((QObject *)menu));
0073     }
0074 }