File indexing completed on 2024-05-12 17:08:50

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 <KWindowSystem>
0010 #include <QSharedPointer>
0011 
0012 StatusNotifierItemJob::StatusNotifierItemJob(StatusNotifierItemSource *source, const QString &operation, QMap<QString, QVariant> &parameters, QObject *parent)
0013     : ServiceJob(source->objectName(), operation, parameters, parent)
0014     , m_source(source)
0015 {
0016     // Queue connection, so that all 'deleteLater' are performed before we use updated menu.
0017     connect(source, SIGNAL(contextMenuReady(QMenu *)), this, SLOT(contextMenuReady(QMenu *)), Qt::QueuedConnection);
0018     connect(source, &StatusNotifierItemSource::activateResult, this, &StatusNotifierItemJob::activateCallback);
0019 }
0020 
0021 StatusNotifierItemJob::~StatusNotifierItemJob()
0022 {
0023 }
0024 
0025 void StatusNotifierItemJob::start()
0026 {
0027     if (operationName() == QLatin1String("Scroll")) {
0028         performJob();
0029         return;
0030     }
0031 
0032     QWindow *window = nullptr;
0033     const quint32 launchedSerial = KWindowSystem::lastInputSerial(window);
0034     auto conn = QSharedPointer<QMetaObject::Connection>::create();
0035     *conn = connect(KWindowSystem::self(), &KWindowSystem::xdgActivationTokenArrived, this, [this, launchedSerial, conn](quint32 serial, const QString &token) {
0036         if (serial == launchedSerial) {
0037             disconnect(*conn);
0038             m_source->provideXdgActivationToken(token);
0039             performJob();
0040         }
0041     });
0042     KWindowSystem::requestXdgActivationToken(window, launchedSerial, {});
0043 }
0044 
0045 void StatusNotifierItemJob::performJob()
0046 {
0047     if (operationName() == QString::fromLatin1("Activate")) {
0048         m_source->activate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0049     } else if (operationName() == QString::fromLatin1("SecondaryActivate")) {
0050         m_source->secondaryActivate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0051         setResult(0);
0052     } else if (operationName() == QString::fromLatin1("ContextMenu")) {
0053         m_source->contextMenu(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt());
0054     } else if (operationName() == QString::fromLatin1("Scroll")) {
0055         m_source->scroll(parameters()[QStringLiteral("delta")].toInt(), parameters()[QStringLiteral("direction")].toString());
0056         setResult(0);
0057     }
0058 }
0059 
0060 void StatusNotifierItemJob::activateCallback(bool success)
0061 {
0062     if (operationName() == QString::fromLatin1("Activate")) {
0063         setResult(QVariant(success));
0064     }
0065 }
0066 
0067 void StatusNotifierItemJob::contextMenuReady(QMenu *menu)
0068 {
0069     if (operationName() == QString::fromLatin1("ContextMenu")) {
0070         setResult(QVariant::fromValue((QObject *)menu));
0071     }
0072 }