+ KRun::run(
+ command,
+ urls,
+ window,
+ QApplication::applicationDisplayName(),
+ QApplication::windowIcon().name()
+ );
+}
+
+bool Dolphin::attachToExistingInstance(const QList<QUrl>& urls, bool openFiles, bool splitView, const QString& preferredService)
+{
+ if (KWindowSystem::isPlatformWayland()) {
+ // TODO: once Wayland clients can raise or activate themselves remove this conditional
+ return false;
+ }
+
+ const QStringList services = QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
+
+ // Don't match the service without trailing "-" (unique instance)
+ const QString pattern = QStringLiteral("org.kde.dolphin-");
+ const QString myPid = QString::number(QCoreApplication::applicationPid());
+ QVector<QPair<QSharedPointer<QDBusInterface>, QStringList>> dolphinServices;
+ if (!preferredService.isEmpty()) {
+ QSharedPointer<QDBusInterface> preferred(
+ new QDBusInterface(preferredService,
+ QStringLiteral("/dolphin/Dolphin_1"),
+ QStringLiteral("org.kde.dolphin.MainWindow"))
+ );
+ if (preferred->isValid()) {
+ dolphinServices.append(qMakePair(preferred, QStringList() ));
+ }
+ }
+
+ // find all dolphin instances
+ for (const QString& service : services) {
+ if (service.startsWith(pattern) && !service.endsWith(myPid)) {
+ // Check if instance can handle our URLs
+ QSharedPointer<QDBusInterface> instance(
+ new QDBusInterface(service,
+ QStringLiteral("/dolphin/Dolphin_1"),
+ QStringLiteral("org.kde.dolphin.MainWindow"))
+ );
+ if (!instance->isValid()) {
+ continue;
+ }
+ dolphinServices.append(qMakePair(instance, QStringList()));
+ }
+ }
+
+ if (dolphinServices.isEmpty()) {
+ return false;
+ }
+
+ QStringList newUrls;
+
+ // check to see if any instances already have any of the given URLs open
+ for (const QString& url : QUrl::toStringList(urls)) {
+ bool urlFound = false;
+ for (auto& service: dolphinServices) {
+ QDBusReply<bool> isUrlOpen = service.first->call(QStringLiteral("isUrlOpen"), url);
+ if (isUrlOpen.isValid() && isUrlOpen.value()) {
+ service.second.append(url);
+ urlFound = true;
+ break;
+ }
+ }
+ if (!urlFound) {
+ newUrls.append(url);
+ }
+ }
+ dolphinServices.front().second << newUrls;