You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.1 KiB
135 lines
5.1 KiB
/*************************************************************************** |
|
* Copyright 2009 by Marco Martin <notmart@gmail.com> * |
|
* * |
|
* This program is free software; you can redistribute it and/or modify * |
|
* it under the terms of the GNU General Public License as published by * |
|
* the Free Software Foundation; either version 2 of the License, or * |
|
* (at your option) any later version. * |
|
* * |
|
* This program is distributed in the hope that it will be useful, * |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of * |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
|
* GNU General Public License for more details. * |
|
* * |
|
* You should have received a copy of the GNU General Public License * |
|
* along with this program; if not, write to the * |
|
* Free Software Foundation, Inc., * |
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * |
|
***************************************************************************/ |
|
|
|
#include "statusnotifierwatcher.h" |
|
|
|
#include <QDBusConnection> |
|
#include <QDBusServiceWatcher> |
|
#include <QDebug> |
|
|
|
#include <kpluginfactory.h> |
|
|
|
#include "statusnotifierwatcheradaptor.h" |
|
#include "statusnotifieritem_interface.h" |
|
|
|
K_PLUGIN_CLASS_WITH_JSON(StatusNotifierWatcher, "statusnotifierwatcher.json") |
|
|
|
StatusNotifierWatcher::StatusNotifierWatcher(QObject *parent, const QList<QVariant>&) |
|
: KDEDModule(parent) |
|
{ |
|
setModuleName(QStringLiteral("StatusNotifierWatcher")); |
|
new StatusNotifierWatcherAdaptor(this); |
|
QDBusConnection dbus = QDBusConnection::sessionBus(); |
|
dbus.registerObject(QStringLiteral("/StatusNotifierWatcher"), this); |
|
dbus.registerService(QStringLiteral("org.kde.StatusNotifierWatcher")); |
|
|
|
m_serviceWatcher = new QDBusServiceWatcher(this); |
|
m_serviceWatcher->setConnection(dbus); |
|
m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); |
|
|
|
connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &StatusNotifierWatcher::serviceUnregistered); |
|
} |
|
|
|
StatusNotifierWatcher::~StatusNotifierWatcher() |
|
{ |
|
QDBusConnection dbus = QDBusConnection::sessionBus(); |
|
dbus.unregisterService(QStringLiteral("org.kde.StatusNotifierWatcher")); |
|
} |
|
|
|
|
|
void StatusNotifierWatcher::RegisterStatusNotifierItem(const QString &serviceOrPath) |
|
{ |
|
QString service; |
|
QString path; |
|
if (serviceOrPath.startsWith(QLatin1Char('/'))) { |
|
service = message().service(); |
|
path = serviceOrPath; |
|
} else { |
|
service = serviceOrPath; |
|
path = QStringLiteral("/StatusNotifierItem"); |
|
} |
|
QString notifierItemId = service + path; |
|
if (QDBusConnection::sessionBus().interface()->isServiceRegistered(service).value() && |
|
!m_registeredServices.contains(notifierItemId)) { |
|
qDebug()<<"Registering" << notifierItemId << "to system tray"; |
|
|
|
//check if the service has registered a SystemTray object |
|
org::kde::StatusNotifierItem trayclient(service, path, |
|
QDBusConnection::sessionBus()); |
|
if (trayclient.isValid()) { |
|
m_registeredServices.append(notifierItemId); |
|
m_serviceWatcher->addWatchedService(service); |
|
emit StatusNotifierItemRegistered(notifierItemId); |
|
} |
|
} |
|
} |
|
|
|
QStringList StatusNotifierWatcher::RegisteredStatusNotifierItems() const |
|
{ |
|
return m_registeredServices; |
|
} |
|
|
|
|
|
void StatusNotifierWatcher::serviceUnregistered(const QString& name) |
|
{ |
|
qDebug()<<"Service "<< name << "unregistered"; |
|
m_serviceWatcher->removeWatchedService(name); |
|
|
|
QString match = name + QLatin1Char('/'); |
|
QStringList::Iterator it = m_registeredServices.begin(); |
|
while (it != m_registeredServices.end()) { |
|
if (it->startsWith(match)) { |
|
QString name = *it; |
|
it = m_registeredServices.erase(it); |
|
emit StatusNotifierItemUnregistered(name); |
|
} else { |
|
++it; |
|
} |
|
} |
|
|
|
if (m_statusNotifierHostServices.contains(name)) { |
|
m_statusNotifierHostServices.remove(name); |
|
emit StatusNotifierHostUnregistered(); |
|
} |
|
} |
|
|
|
void StatusNotifierWatcher::RegisterStatusNotifierHost(const QString &service) |
|
{ |
|
if (service.contains(QStringLiteral("org.kde.StatusNotifierHost-")) && |
|
QDBusConnection::sessionBus().interface()->isServiceRegistered(service).value() && |
|
!m_statusNotifierHostServices.contains(service)) { |
|
qDebug()<<"Registering"<<service<<"as system tray"; |
|
|
|
m_statusNotifierHostServices.insert(service); |
|
m_serviceWatcher->addWatchedService(service); |
|
emit StatusNotifierHostRegistered(); |
|
} |
|
} |
|
|
|
bool StatusNotifierWatcher::IsStatusNotifierHostRegistered() const |
|
{ |
|
return !m_statusNotifierHostServices.isEmpty(); |
|
} |
|
|
|
int StatusNotifierWatcher::ProtocolVersion() const |
|
{ |
|
return 0; |
|
} |
|
|
|
#include "statusnotifierwatcher.moc"
|
|
|