diff --git a/src/kdbusservice.h b/src/kdbusservice.h --- a/src/kdbusservice.h +++ b/src/kdbusservice.h @@ -115,7 +115,14 @@ * The exit value of a @c Unique instance can be set from the running * instance with setExitValue(), the default value is @c 0. */ - NoExitOnFailure = 4 + NoExitOnFailure = 4, + /** + * Indicates that if there's already a unique service running, to be quit and replaced + * with our own. + * + * @since 5.62 + */ + Replace = 8 }; Q_ENUM(StartupOption) diff --git a/src/kdbusservice.cpp b/src/kdbusservice.cpp --- a/src/kdbusservice.cpp +++ b/src/kdbusservice.cpp @@ -74,7 +74,7 @@ int exitValue; }; -KDBusService::KDBusService(StartupOptions options, QObject *parent) +KDBusService::KDBusService(KDBusService::StartupOptions options, QObject* parent) : QObject(parent), d(new KDBusServicePrivate) { new KDBusServiceAdaptor(this); @@ -106,6 +106,20 @@ } } + if (options & Replace) { + auto message = QDBusMessage::createMethodCall(d->serviceName, + QStringLiteral("/MainApplication"), + QStringLiteral("org.qtproject.Qt.QCoreApplication"), + QStringLiteral("quit")); + + auto replyMessage = QDBusConnection::sessionBus().call(message); + if (replyMessage.type() == QDBusMessage::ErrorMessage) { + qCritical() << "failed to quit service" << d->serviceName << replyMessage; + } else while (QDBusConnection::sessionBus().interface()->isServiceRegistered(d->serviceName)) { + QCoreApplication::processEvents(QEventLoop::AllEvents); + } + } + QDBusConnection::sessionBus().registerObject(QStringLiteral("/MainApplication"), QCoreApplication::instance(), QDBusConnection::ExportAllSlots | QDBusConnection::ExportScriptableProperties |