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