File indexing completed on 2024-04-28 05:49:32
0001 /* 0002 SPDX-FileCopyrightText: 2009 Joseph Wenninger <jowenn@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "katerunninginstanceinfo.h" 0008 0009 #include <QCoreApplication> 0010 #include <QDBusConnectionInterface> 0011 #include <QDBusReply> 0012 #include <QFileInfo> 0013 #include <QRegularExpression> 0014 #include <QStringList> 0015 0016 KateRunningInstanceInfo::KateRunningInstanceInfo(const QString &serviceName_) 0017 : serviceName(serviceName_) 0018 , dbus_if(new QDBusInterface(serviceName_, 0019 QStringLiteral("/MainApplication"), 0020 QString(), // I don't know why it does not work if I specify org.kde.Kate.Application here 0021 QDBusConnection::sessionBus())) 0022 { 0023 // get the last used timestamp, if that is not valid, we can ignore the rest 0024 const QVariant a_l = dbus_if->property("lastActivationChange"); 0025 if (!a_l.isValid()) { 0026 return; 0027 } 0028 lastActivationChange = a_l.toLongLong(); 0029 0030 // get the active session 0031 const QVariant a_s = dbus_if->property("activeSession"); 0032 if (a_s.isValid()) { 0033 sessionName = a_s.toString(); 0034 } 0035 } 0036 0037 std::vector<KateRunningInstanceInfo> fillinRunningKateAppInstances() 0038 { 0039 // if we have no dbus, nothing to do 0040 std::vector<KateRunningInstanceInfo> instances; 0041 auto i = QDBusConnection::sessionBus().interface(); 0042 if (!i) { 0043 return instances; 0044 } 0045 0046 // get all instances 0047 const QDBusReply<QStringList> servicesReply = i->registeredServiceNames(); 0048 if (!servicesReply.isValid()) { 0049 return instances; 0050 } 0051 0052 // try to filter out the current instance 0053 const bool inSandbox = QFileInfo::exists(QStringLiteral("/flatpak-info")); 0054 const QString my_pid = inSandbox ? QDBusConnection::sessionBus().baseService().replace(QRegularExpression(QStringLiteral("[\\.:]")), QStringLiteral("_")) 0055 : QString::number(QCoreApplication::applicationPid()); 0056 for (const QString &s : servicesReply.value()) { 0057 if (s.startsWith(QLatin1String("org.kde.kate")) && !s.endsWith(my_pid)) { 0058 // ignore instancer we not even can query the lastActivationChange 0059 KateRunningInstanceInfo instance(s); 0060 if (instance.lastActivationChange > 0) { 0061 instances.push_back(std::move(instance)); 0062 } 0063 } 0064 } 0065 return instances; 0066 }