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(activateCallback(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 @@ -49,6 +49,7 @@ void contextMenu(int x, int y); Q_SIGNALS: + void activateCallback(bool success); void contextMenuReady(QMenu *menu); private Q_SLOTS: diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp --- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp @@ -469,7 +469,12 @@ void StatusNotifierItemSource::activate(int x, int y) { if (m_statusNotifierItemInterface && m_statusNotifierItemInterface->isValid()) { - m_statusNotifierItemInterface->call(QDBus::NoBlock, QStringLiteral("Activate"), x, y); + org::kde::StatusNotifierItem *snii = m_statusNotifierItemInterface; + m_statusNotifierItemInterface->call(QDBus::BlockWithGui, QStringLiteral("Activate"), x, y); + + if (m_statusNotifierItemInterface == snii && snii->isValid()) { + emit activateCallback(!m_statusNotifierItemInterface->lastError().isValid()); + } } }