From 36e8b4acbff3f1830421d010b14e47da3d9ce61e Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 13 Apr 2010 17:03:46 +0200 Subject: [PATCH] Fix visibility issues with StatusNotifier Properly handle registration on DBus according to the "Show tray icon" setting. Also, clean up a isVisible() and isSystemTrayAvailable() a bit across the hierarchy. Fixes #930. --- src/qtui/legacysystemtray.cpp | 11 +++---- src/qtui/legacysystemtray.h | 6 ++-- .../settingspages/appearancesettingspage.ui | 16 ++++++++++ src/qtui/statusnotifieritem.cpp | 30 +++++++++++++++++++ src/qtui/statusnotifieritem.h | 4 +++ src/qtui/statusnotifieritemdbus.cpp | 23 ++++++++++++-- src/qtui/statusnotifieritemdbus.h | 10 +++++++ src/qtui/systemtray.cpp | 3 +- src/qtui/systemtray.h | 3 ++ 9 files changed, 95 insertions(+), 11 deletions(-) diff --git a/src/qtui/legacysystemtray.cpp b/src/qtui/legacysystemtray.cpp index 9176dbd7..d58d1d46 100644 --- a/src/qtui/legacysystemtray.cpp +++ b/src/qtui/legacysystemtray.cpp @@ -27,7 +27,6 @@ LegacySystemTray::LegacySystemTray(QWidget *parent) : SystemTray(parent), _blinkState(false), - _isVisible(true), _lastMessageId(0) { #ifndef HAVE_KDE @@ -78,9 +77,9 @@ void LegacySystemTray::syncLegacyIcon() { } void LegacySystemTray::setVisible(bool visible) { - _isVisible = visible; + SystemTray::setVisible(visible); if(mode() == Legacy) { - if(visible) + if(shouldBeVisible()) _trayIcon->show(); else _trayIcon->hide(); @@ -91,7 +90,7 @@ bool LegacySystemTray::isVisible() const { if(mode() == Legacy) { return _trayIcon->isVisible(); } - return false; + return SystemTray::isVisible(); } void LegacySystemTray::setMode(Mode mode_) { @@ -99,8 +98,10 @@ void LegacySystemTray::setMode(Mode mode_) { if(mode() == Legacy) { syncLegacyIcon(); - if(_isVisible) + if(shouldBeVisible()) _trayIcon->show(); + else + _trayIcon->hide(); if(state() == NeedsAttention) _blinkTimer.start(); } else { diff --git a/src/qtui/legacysystemtray.h b/src/qtui/legacysystemtray.h index c6cb91bf..1a187c8e 100644 --- a/src/qtui/legacysystemtray.h +++ b/src/qtui/legacysystemtray.h @@ -66,7 +66,6 @@ private slots: private: QTimer _blinkTimer; bool _blinkState; - bool _isVisible; uint _lastMessageId; #ifdef HAVE_KDE @@ -79,7 +78,10 @@ private: // inlines -bool LegacySystemTray::isSystemTrayAvailable() const { return QSystemTrayIcon::isSystemTrayAvailable(); } +bool LegacySystemTray::isSystemTrayAvailable() const { + return mode() == Legacy ? QSystemTrayIcon::isSystemTrayAvailable() + : SystemTray::isSystemTrayAvailable(); +} #endif /* QT_NO_SYSTEMTRAYICON */ diff --git a/src/qtui/settingspages/appearancesettingspage.ui b/src/qtui/settingspages/appearancesettingspage.ui index c2a643b9..ee53a24f 100644 --- a/src/qtui/settingspages/appearancesettingspage.ui +++ b/src/qtui/settingspages/appearancesettingspage.ui @@ -459,5 +459,21 @@ + + useSystemTrayIcon + toggled(bool) + animateSystrayIcon + setEnabled(bool) + + + 125 + 144 + + + 122 + 203 + + + diff --git a/src/qtui/statusnotifieritem.cpp b/src/qtui/statusnotifieritem.cpp index dc2e65c7..8d7972f4 100644 --- a/src/qtui/statusnotifieritem.cpp +++ b/src/qtui/statusnotifieritem.cpp @@ -54,6 +54,7 @@ void StatusNotifierItem::init() { qDBusRegisterMetaType(); _statusNotifierItemDBus = new StatusNotifierItemDBus(this); + connect(this, SIGNAL(toolTipChanged(QString,QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip())); connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); @@ -134,6 +135,20 @@ void StatusNotifierItem::serviceChange(const QString& name, const QString& oldOw } } +bool StatusNotifierItem::isSystemTrayAvailable() const { + if(mode() == StatusNotifier) + return true; // else it should be set to legacy on registration + + return StatusNotifierItemParent::isSystemTrayAvailable(); +} + +bool StatusNotifierItem::isVisible() const { + if(mode() == StatusNotifier) + return shouldBeVisible(); // we don't have a way to check, so we need to trust everything went right + + return StatusNotifierItemParent::isVisible(); +} + void StatusNotifierItem::setMode(Mode mode_) { StatusNotifierItemParent::setMode(mode_); @@ -149,6 +164,21 @@ void StatusNotifierItem::setState(State state_) { emit _statusNotifierItemDBus->NewIcon(); } +void StatusNotifierItem::setVisible(bool visible) { + LegacySystemTray::setVisible(visible); + + if(mode() == StatusNotifier) { + if(shouldBeVisible()) { + _statusNotifierItemDBus->registerService(); + registerToDaemon(); + } else { + _statusNotifierItemDBus->unregisterService(); + _statusNotifierWatcher->deleteLater(); + _statusNotifierWatcher = 0; + } + } +} + QString StatusNotifierItem::title() const { return QString("Quassel IRC"); } diff --git a/src/qtui/statusnotifieritem.h b/src/qtui/statusnotifieritem.h index 3bed80fa..1ca4e4a4 100644 --- a/src/qtui/statusnotifieritem.h +++ b/src/qtui/statusnotifieritem.h @@ -46,8 +46,12 @@ public: explicit StatusNotifierItem(QWidget *parent); virtual ~StatusNotifierItem(); + virtual bool isSystemTrayAvailable() const; + virtual bool isVisible() const; + public slots: virtual void setState(State state); + virtual void setVisible(bool visible); virtual void showMessage(const QString &title, const QString &message, MessageIcon icon = Information, int msTimeout = 10000, uint notificationId = 0); virtual void closeMessage(uint notificationId); diff --git a/src/qtui/statusnotifieritemdbus.cpp b/src/qtui/statusnotifieritemdbus.cpp index 430bd610..5e67e698 100644 --- a/src/qtui/statusnotifieritemdbus.cpp +++ b/src/qtui/statusnotifieritemdbus.cpp @@ -148,13 +148,30 @@ StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem *parent) { new StatusNotifierItemAdaptor(this); //qDebug() << "service is" << m_service; - m_dbus.registerService(m_service); + registerService(); m_dbus.registerObject("/StatusNotifierItem", this); } StatusNotifierItemDBus::~StatusNotifierItemDBus() { - m_dbus.unregisterService(m_service); + unregisterService(); +} + +// FIXME: prevent double registrations, also test this on platforms != KDE +// +void StatusNotifierItemDBus::registerService() +{ + //qDebug() << "registering to" << m_service; + m_dbus.registerService(m_service); +} + +// FIXME: see above +void StatusNotifierItemDBus::unregisterService() +{ + //qDebug() << "unregistering from" << m_service; + if(m_dbus.isConnected()) { + m_dbus.unregisterService(m_service); + } } QString StatusNotifierItemDBus::service() const @@ -181,7 +198,7 @@ QString StatusNotifierItemDBus::Id() const } QString StatusNotifierItemDBus::Status() const - { +{ return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state()); } diff --git a/src/qtui/statusnotifieritemdbus.h b/src/qtui/statusnotifieritemdbus.h index 670a7c76..2fcefdae 100644 --- a/src/qtui/statusnotifieritemdbus.h +++ b/src/qtui/statusnotifieritemdbus.h @@ -69,6 +69,16 @@ public: StatusNotifierItemDBus(StatusNotifierItem *parent); ~StatusNotifierItemDBus(); + /** + * Register the service to DBus + */ + void registerService(); + + /** + * Unregister the service from DBus + */ + void unregisterService(); + /** * @return the service this object is registered on the bus under */ diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index 7fb36ce2..03d9629a 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -38,6 +38,7 @@ SystemTray::SystemTray(QWidget *parent) : QObject(parent), _mode(Invalid), _state(Passive), + _shouldBeVisible(true), _passiveIcon(DesktopIcon("quassel_inactive")), _activeIcon(DesktopIcon("quassel")), _needsAttentionIcon(DesktopIcon("quassel_message")), @@ -138,7 +139,7 @@ void SystemTray::setAlert(bool alerted) { } void SystemTray::setVisible(bool visible) { - Q_UNUSED(visible) + _shouldBeVisible = visible; } void SystemTray::setToolTip(const QString &title, const QString &subtitle) { diff --git a/src/qtui/systemtray.h b/src/qtui/systemtray.h index ad7a9ff1..4a2a8059 100644 --- a/src/qtui/systemtray.h +++ b/src/qtui/systemtray.h @@ -94,6 +94,7 @@ protected slots: protected: virtual void setMode(Mode mode); inline Mode mode() const; + inline bool shouldBeVisible() const; virtual Icon stateIcon() const; Icon stateIcon(State state) const; @@ -111,6 +112,7 @@ private slots: private: Mode _mode; State _state; + bool _shouldBeVisible; QString _toolTipTitle, _toolTipSubTitle; Icon _passiveIcon, _activeIcon, _needsAttentionIcon; @@ -127,6 +129,7 @@ bool SystemTray::isSystemTrayAvailable() const { return false; } bool SystemTray::isAlerted() const { return state() == NeedsAttention; } SystemTray::Mode SystemTray::mode() const { return _mode; } SystemTray::State SystemTray::state() const { return _state; } +bool SystemTray::shouldBeVisible() const { return _shouldBeVisible; } QMenu *SystemTray::trayMenu() const { return _trayMenu; } QString SystemTray::toolTipTitle() const { return _toolTipTitle; } QString SystemTray::toolTipSubTitle() const { return _toolTipSubTitle; } -- 2.20.1