diff --git a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml --- a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml +++ b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml @@ -68,7 +68,14 @@ var operation = service.operationDescription("Activate"); operation.x = pos.x; operation.y = pos.y; - service.startOperationCall(operation); + var job = service.startOperationCall(operation); + job.finished.connect(function () { + if (!job.result) { + // On error try to invoke the context menu. + // Workaround primarily for apps using libappindicator. + contextMenu(mouse); + } + }); break; } case Qt.MiddleButton: diff --git a/dataengines/statusnotifieritem/statusnotifieritemjob.h b/dataengines/statusnotifieritem/statusnotifieritemjob.h --- a/dataengines/statusnotifieritem/statusnotifieritemjob.h +++ b/dataengines/statusnotifieritem/statusnotifieritemjob.h @@ -44,6 +44,7 @@ void start() override; private Q_SLOTS: + void activateCallback(bool success); void contextMenuReady(QMenu *menu); private: diff --git a/dataengines/statusnotifieritem/statusnotifieritemjob.cpp b/dataengines/statusnotifieritem/statusnotifieritemjob.cpp --- a/dataengines/statusnotifieritem/statusnotifieritemjob.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemjob.cpp @@ -25,6 +25,7 @@ m_source(source) { connect(source, SIGNAL(contextMenuReady(QMenu*)), this, SLOT(contextMenuReady(QMenu*))); + connect(source, SIGNAL(activateResult(bool)), this, SLOT(activateCallback(bool))); } StatusNotifierItemJob::~StatusNotifierItemJob() @@ -35,7 +36,6 @@ { if (operationName() == QString::fromLatin1("Activate")) { m_source->activate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt()); - setResult(0); } else if (operationName() == QString::fromLatin1("SecondaryActivate")) { m_source->secondaryActivate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt()); setResult(0); @@ -47,6 +47,13 @@ } } +void StatusNotifierItemJob::activateCallback(bool success) +{ + if (operationName() == QString::fromLatin1("Activate")) { + setResult(QVariant(success)); + } +} + void StatusNotifierItemJob::contextMenuReady(QMenu *menu) { if (operationName() == QString::fromLatin1("ContextMenu")) { diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.h b/dataengines/statusnotifieritem/statusnotifieritemsource.h --- a/dataengines/statusnotifieritem/statusnotifieritemsource.h +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.h @@ -50,6 +50,7 @@ Q_SIGNALS: void contextMenuReady(QMenu *menu); + void activateResult(bool success); private Q_SLOTS: void contextMenuReady(); @@ -60,6 +61,7 @@ void performRefresh(); void syncStatus(QString); void refreshCallback(QDBusPendingCallWatcher *); + void activateCallback(QDBusPendingCallWatcher *); private: diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp --- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp @@ -469,10 +469,23 @@ void StatusNotifierItemSource::activate(int x, int y) { if (m_statusNotifierItemInterface && m_statusNotifierItemInterface->isValid()) { - m_statusNotifierItemInterface->call(QDBus::NoBlock, QStringLiteral("Activate"), x, y); + QDBusMessage message = QDBusMessage::createMethodCall(m_statusNotifierItemInterface->service(), + m_statusNotifierItemInterface->path(), m_statusNotifierItemInterface->interface(), QStringLiteral("Activate")); + + message << x << y; + QDBusPendingCall call = m_statusNotifierItemInterface->connection().asyncCall(message); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, &StatusNotifierItemSource::activateCallback); } } +void StatusNotifierItemSource::activateCallback(QDBusPendingCallWatcher *call) +{ + QDBusPendingReply reply = *call; + emit activateResult(!reply.isError()); + call->deleteLater(); +} + void StatusNotifierItemSource::secondaryActivate(int x, int y) { if (m_statusNotifierItemInterface && m_statusNotifierItemInterface->isValid()) {