From 2734df9d7442a0c38d7e690e28d019c79037c5f3 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 8 Nov 2022 20:32:58 +0200 Subject: [PATCH] kdeplasma-addons: check for MPRIS interface instead of relying on categories generally speaking trying to guess MPRIS interfaces is brute-force guess - it works kinda. the check that was used before this change however does not account for applications that are not categorized as audio or music player but do have MPRIS interface (chromium does). side note: tested only the MPRIS v2 interface Signed-off-by: Ivailo Monev --- .../applets/icontasks/mediabuttons.cpp | 83 ++++++++++++---------- kdeplasma-addons/applets/icontasks/mediabuttons.h | 8 +-- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/kdeplasma-addons/applets/icontasks/mediabuttons.cpp b/kdeplasma-addons/applets/icontasks/mediabuttons.cpp index ed71d4ec..4c87abec 100644 --- a/kdeplasma-addons/applets/icontasks/mediabuttons.cpp +++ b/kdeplasma-addons/applets/icontasks/mediabuttons.cpp @@ -35,6 +35,7 @@ #include #include #include +#include K_GLOBAL_STATIC(MediaButtons, mediaBtns) @@ -137,12 +138,9 @@ void MediaButtons::setEnabled(bool en) m_watcher->setConnection(QDBusConnection::sessionBus()); m_watcher->setWatchMode(QDBusServiceWatcher::WatchForOwnerChange); connect(m_watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), this, SLOT(serviceOwnerChanged(QString, QString, QString))); - connect(KSycoca::self(), SIGNAL(databaseChanged(QStringList)), SLOT(sycocaChanged(QStringList))); readConfig(); - updateApps(); } else if (m_watcher) { disconnect(m_watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), this, SLOT(serviceOwnerChanged(QString, QString, QString))); - disconnect(KSycoca::self(), SIGNAL(databaseChanged(QStringList)), this, SLOT(sycocaChanged(QStringList))); foreach (Interface * iface, m_interfaces.values()) { delete iface; @@ -154,13 +152,6 @@ void MediaButtons::setEnabled(bool en) } } -void MediaButtons::sycocaChanged(const QStringList &types) -{ - if (types.contains("apps") || types.contains("xdgdata-apps")) { - updateApps(); - } -} - void MediaButtons::serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner) { bool isV2 = name.startsWith(constV2Prefix); @@ -247,50 +238,48 @@ void MediaButtons::readConfig() QStringList files(KGlobal::dirs()->findAllResources("data", "kdeplasma-addons/mediabuttonsrc")); - foreach (QString file, files) { + foreach (const QString &file, files) { KConfig cfg(file); KConfigGroup ag(&cfg, "Aliases"); KConfigGroup gen(&cfg, "General"); m_ignore += gen.readEntry("Ignore", QStringList()).toSet(); - m_customMediaApps = gen.readEntry("CustomMediaApps", QStringList()).toSet(); - foreach (const QString & key, ag.keyList()) { - foreach (const QString & alias, ag.readEntry(key, QStringList())) { + foreach (const QString &key, ag.keyList()) { + foreach (const QString &alias, ag.readEntry(key, QStringList())) { m_aliases[alias.toLower()] = key.toLower(); } } } } -void MediaButtons::updateApps() +bool MediaButtons::isMediaApp(const QString &desktopEntry) { if (!m_enabled) { - return; + return false; } - KService::List services = KServiceTypeTrader::self()->query("Application", QString("exist Exec and (exist Categories and ( ('AudioVideo' ~subin Categories) or ('Music' ~subin Categories) ) )")); - QStringList prefixes = QStringList() << constV2Prefix << constV1Prefix; - - m_mediaApps.clear(); - m_mediaApps = m_aliases.keys().toSet(); - foreach (const KSharedPtr srv, services) { - QString name = srv->desktopEntryName(); - - if (name.startsWith("kde4-")) { - name = name.mid(5); - } + QString name = desktopEntry; + if (m_aliases.contains(name)) { + name = m_aliases[name]; + } - if (m_aliases.contains(name)) { - name = m_aliases[name]; - } + if (m_ignore.contains(name)) { + return false; + } - if (m_ignore.contains(name)) { - continue; - } + MediaButtons::Interface *i = getV2Interface(name); + // qDebug() << Q_FUNC_INFO << desktopEntry << i; + if (i) { + return true; + } - m_mediaApps.insert(name.toLower()); + i = getV1Interface(name); + // qDebug() << Q_FUNC_INFO << desktopEntry << i; + if (i) { + return i; } - m_mediaApps += m_customMediaApps; + + return false; } MediaButtons::Interface * MediaButtons::getInterface(const QString &name, int pid) @@ -303,20 +292,20 @@ MediaButtons::Interface * MediaButtons::getInterface(const QString &name, int pi } names << name << name + "." + QString::number(pid) << name + "-" + QString::number(pid); - foreach (QString n, names) { + foreach (const QString &n, names) { if (m_interfaces.contains(n)) { return m_interfaces[n]; } } - foreach (QString n, names) { + foreach (const QString &n, names) { MediaButtons::Interface *i = getV2Interface(n); if (i) { return i; } } - foreach (QString n, names) { + foreach (const QString &n, names) { MediaButtons::Interface *i = getV1Interface(n); if (i) { return i; @@ -338,7 +327,23 @@ MediaButtons::Interface * MediaButtons::getV2Interface(const QString &name) } } - return 0; + QDBusReply registeredReply = QDBusConnection::sessionBus().interface()->registeredServiceNames(); + if (!registeredReply.isValid()) { + return nullptr; + } + foreach (const QString &value, registeredReply.value()) { + if (value.startsWith(constV2Prefix + name + QLatin1Char('.'))) { + serviceOwnerChanged(value, QString(), QLatin1String("X")); + // qDebug() << Q_FUNC_INFO << value << m_interfaces; + QString unsuffixedName = value.mid(constV2Prefix.size(), value.size() - constV2Prefix.size()); + if (m_interfaces.contains(unsuffixedName)) { + m_watcher->addWatchedService(value); + return m_interfaces[unsuffixedName]; + } + } + } + + return nullptr; } MediaButtons::Interface * MediaButtons::getV1Interface(const QString &name) diff --git a/kdeplasma-addons/applets/icontasks/mediabuttons.h b/kdeplasma-addons/applets/icontasks/mediabuttons.h index 8c2ca094..cecd8a6d 100644 --- a/kdeplasma-addons/applets/icontasks/mediabuttons.h +++ b/kdeplasma-addons/applets/icontasks/mediabuttons.h @@ -69,21 +69,17 @@ public: bool isEnabled() const { return m_enabled; } - bool isMediaApp(const QString &desktopEntry) const { - return m_mediaApps.contains(desktopEntry); - } + bool isMediaApp(const QString &desktopEntry); void next(const QString &name, int pid = 0); void previous(const QString &name, int pid = 0); void playPause(const QString &name, int pid = 0); QString playbackStatus(const QString &name, int pid = 0); private Q_SLOTS: - void sycocaChanged(const QStringList &types); void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); private: void readConfig(); - void updateApps(); Interface * getInterface(const QString &name, int pid); Interface * getV2Interface(const QString &name); Interface * getV1Interface(const QString &name); @@ -93,8 +89,6 @@ private: QMap m_interfaces; QMap m_aliases; QSet m_ignore; - QSet m_mediaApps; - QSet m_customMediaApps; bool m_enabled; }; -- 2.11.0