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> ¶meters, 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 }