Fix visibility issues with StatusNotifier
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 13 Apr 2010 15:03:46 +0000 (17:03 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 13 Apr 2010 15:06:15 +0000 (17:06 +0200)
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
src/qtui/legacysystemtray.h
src/qtui/settingspages/appearancesettingspage.ui
src/qtui/statusnotifieritem.cpp
src/qtui/statusnotifieritem.h
src/qtui/statusnotifieritemdbus.cpp
src/qtui/statusnotifieritemdbus.h
src/qtui/systemtray.cpp
src/qtui/systemtray.h

index 9176dbd..d58d1d4 100644 (file)
@@ -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 {
index c6cb91b..1a187c8 100644 (file)
@@ -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 */
 
index c2a643b..ee53a24 100644 (file)
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>useSystemTrayIcon</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>animateSystrayIcon</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>125</x>
+     <y>144</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>122</x>
+     <y>203</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
 </ui>
index dc2e65c..8d7972f 100644 (file)
@@ -54,6 +54,7 @@ void StatusNotifierItem::init() {
   qDBusRegisterMetaType<DBusToolTipStruct>();
 
   _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");
 }
index 3bed80f..1ca4e4a 100644 (file)
@@ -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);
 
index 430bd61..5e67e69 100644 (file)
@@ -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());
 }
 
index 670a7c7..2fcefda 100644 (file)
@@ -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
      */
index 7fb36ce..03d9629 100644 (file)
@@ -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) {
index ad7a9ff..4a2a805 100644 (file)
@@ -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; }