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.cpp b/dataengines/statusnotifieritem/statusnotifieritemjob.cpp --- a/dataengines/statusnotifieritem/statusnotifieritemjob.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemjob.cpp @@ -34,8 +34,8 @@ void StatusNotifierItemJob::start() { if (operationName() == QString::fromLatin1("Activate")) { - m_source->activate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt()); - setResult(0); + bool error = m_source->activate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt()); + setResult(QVariant(error)); } else if (operationName() == QString::fromLatin1("SecondaryActivate")) { m_source->secondaryActivate(parameters()[QStringLiteral("x")].toInt(), parameters()[QStringLiteral("y")].toInt()); setResult(0); diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.h b/dataengines/statusnotifieritem/statusnotifieritemsource.h --- a/dataengines/statusnotifieritem/statusnotifieritemsource.h +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.h @@ -43,7 +43,7 @@ ~StatusNotifierItemSource() override; Plasma::Service *createService(); - void activate(int x, int y); + bool activate(int x, int y); void secondaryActivate(int x, int y); void scroll(int delta, const QString &direction); void contextMenu(int x, int y); diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp --- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp +++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp @@ -466,11 +466,13 @@ //hopefully huge and enormous not necessary right now, since it's quite costly } -void StatusNotifierItemSource::activate(int x, int y) +bool StatusNotifierItemSource::activate(int x, int y) { if (m_statusNotifierItemInterface && m_statusNotifierItemInterface->isValid()) { - m_statusNotifierItemInterface->call(QDBus::NoBlock, QStringLiteral("Activate"), x, y); + m_statusNotifierItemInterface->call(QDBus::BlockWithGui, QStringLiteral("Activate"), x, y); + return m_statusNotifierItemInterface->lastError().isValid(); } + return true; } void StatusNotifierItemSource::secondaryActivate(int x, int y)