diff --git a/applets/kicker/plugin/actionlist.cpp b/applets/kicker/plugin/actionlist.cpp index f6ccccca4..b7697f627 100644 --- a/applets/kicker/plugin/actionlist.cpp +++ b/applets/kicker/plugin/actionlist.cpp @@ -403,6 +403,39 @@ bool handleAppstreamActions(const QStrin return false; } +// It is used for AltAppStarter to run applications as another user: +QVariantList altappstartActions(const KService::Ptr &service) +{ + QVariantList ret; + + const KService::Ptr altAppStartHandler = KApplicationTrader::preferredService(QStringLiteral("x-scheme-handler/altappstart")); + + if (!altAppStartHandler) { + if (!KProtocolInfo::isHelperProtocol(QStringLiteral("altappstart")) + || KProtocolInfo::exec(QStringLiteral("altappstart")).isEmpty()) { + return ret; + } + } + + QVariantMap altappstartAction = Kicker::createActionItem( + i18nc("@action opens the AltLinux Application Starter", "Run application as another user..."), + altAppStartHandler->icon(), + QStringLiteral("runApplicationViaAltAppStarter"), QVariant(QLatin1String("altappstart://") + service->desktopEntryName())); + ret << altappstartAction; + + return ret; +} + +// It is used for AltAppStarter to run applications as another user: +bool handleAltAppStartActions(const QString &actionId, const QVariant &argument) +{ + if (actionId == QLatin1String("runApplicationViaAltAppStarter")) { + return QDesktopServices::openUrl(QUrl(argument.toString())); + } + + return false; +} + QString resolvedServiceEntryPath(const KService::Ptr &service) { QString path = service->entryPath(); diff --git a/applets/kicker/plugin/actionlist.h b/applets/kicker/plugin/actionlist.h index db706d920..8ea3b64c8 100644 --- a/applets/kicker/plugin/actionlist.h +++ b/applets/kicker/plugin/actionlist.h @@ -68,6 +68,10 @@ bool handleEditApplicationAction(const QString &actionId, const KService::Ptr &s QVariantList appstreamActions(const KService::Ptr &service); bool handleAppstreamActions(const QString &actionId, const QVariant &argument); +// It is used for AltAppStarter to run applications as another user: +QVariantList altappstartActions(const KService::Ptr &service); +bool handleAltAppStartActions(const QString &actionId, const QVariant &argument); + QString resolvedServiceEntryPath(const KService::Ptr &service); } diff --git a/applets/kicker/plugin/appentry.cpp b/applets/kicker/plugin/appentry.cpp --- a/applets/kicker/plugin/appentry.cpp +++ b/applets/kicker/plugin/appentry.cpp @@ -186,6 +186,7 @@ QVariantList AppEntry::actions() const actionList << Kicker::createSeparatorActionItem(); actionList << Kicker::editApplicationAction(m_service); actionList << Kicker::appstreamActions(m_service); + actionList << Kicker::altappstartActions(m_service); // AltAppStarter } if (appletInterface) { @@ -238,6 +239,8 @@ bool AppEntry::run(const QString &action return true; } else if (Kicker::handleAppstreamActions(actionId, argument)) { return true; + } else if (Kicker::handleAltAppStartActions(actionId, argument)) { // AltAppStarter + return true; } else if (actionId == QLatin1String("_kicker_jumpListAction")) { auto job = new KIO::CommandLauncherJob(argument.toString()); job->setDesktopName(m_service->entryPath()); diff --git a/applets/kicker/plugin/runnermatchesmodel.cpp b/applets/kicker/plugin/runnermatchesmodel.cpp index b52bd868f..1d2540e1e 100644 --- a/applets/kicker/plugin/runnermatchesmodel.cpp +++ b/applets/kicker/plugin/runnermatchesmodel.cpp @@ -148,6 +148,7 @@ QVariant RunnerMatchesModel::data(const QModelIndex &index, int role) const if (service->isApplication()) { actionList << Kicker::editApplicationAction(service); actionList << Kicker::appstreamActions(service); + actionList << Kicker::altappstartActions(service); // AltAppStarter } } @@ -184,6 +185,8 @@ bool RunnerMatchesModel::trigger(int row, const QString &actionId, const QVarian return true; } else if (Kicker::handleAppstreamActions(actionId, argument)) { return true; + } else if (Kicker::handleAltAppStartActions(actionId, argument)) { // AltAppStarter + return true; } else if (actionId == QLatin1String("_kicker_jumpListAction")) { return KRun::run(argument.toString(), {}, nullptr, service ? service->name() : QString(), service ? service->icon() : QString()); } else if (actionId == QLatin1String("_kicker_recentDocument")