X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fstatusnotifieritem.cpp;h=791bd28d27ce954a097dacff377f7acdc867531a;hp=08197f8adbe933aa2d6a394daa36a6def3d94978;hb=ccb52c8272c65ec0f07fe79c763035a71b98d264;hpb=e313b91867c9c85ecb96e98616cd99df807d1a34 diff --git a/src/qtui/statusnotifieritem.cpp b/src/qtui/statusnotifieritem.cpp index 08197f8a..791bd28d 100644 --- a/src/qtui/statusnotifieritem.cpp +++ b/src/qtui/statusnotifieritem.cpp @@ -33,6 +33,7 @@ #include "statusnotifieritemdbus.h" const int StatusNotifierItem::_protocolVersion = 0; +const QString StatusNotifierItem::_statusNotifierWatcherServiceName("org.kde.StatusNotifierWatcher"); #ifdef HAVE_DBUSMENU # include "dbusmenuexporter.h" @@ -87,8 +88,11 @@ void StatusNotifierItem::init() { connect(this, SIGNAL(toolTipChanged(QString,QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip())); connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); - connect(QDBusConnection::sessionBus().interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), - SLOT(serviceChange(QString,QString,QString))); + QDBusServiceWatcher *watcher = new QDBusServiceWatcher(_statusNotifierWatcherServiceName, + QDBusConnection::sessionBus(), + QDBusServiceWatcher::WatchForOwnerChange, + this); + connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), SLOT(serviceChange(QString,QString,QString))); setMode(StatusNotifier); @@ -117,13 +121,17 @@ void StatusNotifierItem::init() { void StatusNotifierItem::registerToDaemon() { if(!_statusNotifierWatcher) { - QString interface("org.kde.StatusNotifierWatcher"); - _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(interface, "/StatusNotifierWatcher", QDBusConnection::sessionBus()); + _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(_statusNotifierWatcherServiceName, + "/StatusNotifierWatcher", + QDBusConnection::sessionBus()); + connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostRegistered()), SLOT(checkForRegisteredHosts())); + connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostUnregistered()), SLOT(checkForRegisteredHosts())); } if(_statusNotifierWatcher->isValid() && _statusNotifierWatcher->property("ProtocolVersion").toInt() == _protocolVersion) { _statusNotifierWatcher->RegisterStatusNotifierItem(_statusNotifierItemDBus->service()); + checkForRegisteredHosts(); } else { //qDebug() << "StatusNotifierWatcher not reachable!"; @@ -131,46 +139,27 @@ void StatusNotifierItem::registerToDaemon() { } } -// FIXME remove deprecated slot with Qt 4.6 void StatusNotifierItem::serviceChange(const QString& name, const QString& oldOwner, const QString& newOwner) { - bool legacy = false; - if(name == "org.kde.StatusNotifierWatcher") { - if(newOwner.isEmpty()) { - //unregistered - //qDebug() << "Connection to the StatusNotifierWatcher lost"; - legacy = true; - } else if(oldOwner.isEmpty()) { - //registered - legacy = false; - } - } else if(name.startsWith(QLatin1String("org.kde.StatusNotifierHost-"))) { - if(newOwner.isEmpty() && (!_statusNotifierWatcher || - !_statusNotifierWatcher->property("IsStatusNotifierHostRegistered").toBool())) { - //qDebug() << "Connection to the last StatusNotifierHost lost"; - legacy = true; - } else if(oldOwner.isEmpty()) { - //qDebug() << "New StatusNotifierHost"; - legacy = false; - } - } else { - return; - } - - // qDebug() << "Service " << name << "status change, old owner:" << oldOwner << "new:" << newOwner; - - if(legacy == (mode() == Legacy)) { - return; - } - - if(legacy) { + Q_UNUSED(name); + if(newOwner.isEmpty()) { //unregistered + //qDebug() << "Connection to the StatusNotifierWatcher lost"; + delete _statusNotifierWatcher; + _statusNotifierWatcher = 0; setMode(Legacy); - } else { + } else if(oldOwner.isEmpty()) { //registered setMode(StatusNotifier); } } +void StatusNotifierItem::checkForRegisteredHosts() { + if(!_statusNotifierWatcher || !_statusNotifierWatcher->property("IsStatusNotifierHostRegistered").toBool()) + setMode(Legacy); + else + setMode(StatusNotifier); +} + bool StatusNotifierItem::isSystemTrayAvailable() const { if(mode() == StatusNotifier) return true; // else it should be set to legacy on registration @@ -186,9 +175,17 @@ bool StatusNotifierItem::isVisible() const { } void StatusNotifierItem::setMode(Mode mode_) { + if(mode_ == mode()) + return; + + if(mode_ != StatusNotifier) { + _statusNotifierItemDBus->unregisterService(); + } + StatusNotifierItemParent::setMode(mode_); if(mode() == StatusNotifier) { + _statusNotifierItemDBus->registerService(); registerToDaemon(); } } @@ -201,6 +198,9 @@ void StatusNotifierItem::setState(State state_) { } void StatusNotifierItem::setVisible(bool visible) { + if(visible == isVisible()) + return; + LegacySystemTray::setVisible(visible); if(mode() == StatusNotifier) {