1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/*
* SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
*
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "startupnotifier.h"
#include <KApplicationTrader>
#include <KWayland/Client/connection_thread.h>
#include <KWayland/Client/plasmawindowmanagement.h>
#include <KWayland/Client/registry.h>
#include <KWindowSystem>
#include <QDebug>
StartupNotifier::StartupNotifier(QObject *parent)
: QObject(parent)
{
if (!KWindowSystem::isPlatformWayland()) {
return;
}
using namespace KWayland::Client;
ConnectionThread *connection = ConnectionThread::fromApplication(this);
if (!connection) {
return;
}
Registry *registry = new Registry(this);
registry->create(connection);
connect(registry, &Registry::plasmaActivationFeedbackAnnounced, this, [this, registry](quint32 name, quint32 version) {
auto iface = registry->createPlasmaActivationFeedback(name, version, this);
connect(iface, &PlasmaActivationFeedback::activation, this, [this](PlasmaActivation *activation) {
connect(activation, &PlasmaActivation::applicationId, this, [this](const QString &appId) {
const auto servicesFound = KApplicationTrader::query([&appId](const KService::Ptr &service) {
if (service->exec().isEmpty())
return false;
if (service->desktopEntryName().compare(appId, Qt::CaseInsensitive) == 0)
return true;
const auto idWithoutDesktop = QString(appId).remove(QStringLiteral(".desktop"));
if (service->desktopEntryName().compare(idWithoutDesktop, Qt::CaseInsensitive) == 0)
return true;
const auto renamedFrom = service->property<QStringList>(QStringLiteral("X-Flatpak-RenamedFrom"));
if (renamedFrom.contains(appId, Qt::CaseInsensitive) || renamedFrom.contains(idWithoutDesktop, Qt::CaseInsensitive))
return true;
return false;
});
if (!servicesFound.isEmpty()) {
Q_EMIT activationStarted(appId, servicesFound.constFirst()->icon());
} else {
qDebug() << "Could not find" << appId;
}
});
connect(activation, &PlasmaActivation::finished, this, &StartupNotifier::activationFinished);
});
});
registry->setup();
}
bool StartupNotifier::isValid() const
{
return KWindowSystem::isPlatformWayland();
}
#include "moc_startupnotifier.cpp"
|