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.
LegacySystemTray::LegacySystemTray(QWidget *parent)
: SystemTray(parent),
_blinkState(false),
- _isVisible(true),
_lastMessageId(0)
{
#ifndef HAVE_KDE
}
void LegacySystemTray::setVisible(bool visible) {
- _isVisible = visible;
+ SystemTray::setVisible(visible);
if(mode() == Legacy) {
- if(visible)
+ if(shouldBeVisible())
_trayIcon->show();
else
_trayIcon->hide();
if(mode() == Legacy) {
return _trayIcon->isVisible();
}
- return false;
+ return SystemTray::isVisible();
}
void LegacySystemTray::setMode(Mode mode_) {
if(mode() == Legacy) {
syncLegacyIcon();
- if(_isVisible)
+ if(shouldBeVisible())
_trayIcon->show();
+ else
+ _trayIcon->hide();
if(state() == NeedsAttention)
_blinkTimer.start();
} else {
private:
QTimer _blinkTimer;
bool _blinkState;
- bool _isVisible;
uint _lastMessageId;
#ifdef HAVE_KDE
// inlines
-bool LegacySystemTray::isSystemTrayAvailable() const { return QSystemTrayIcon::isSystemTrayAvailable(); }
+bool LegacySystemTray::isSystemTrayAvailable() const {
+ return mode() == Legacy ? QSystemTrayIcon::isSystemTrayAvailable()
+ : SystemTray::isSystemTrayAvailable();
+}
#endif /* QT_NO_SYSTEMTRAYICON */
</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>
qDBusRegisterMetaType<DBusToolTipStruct>();
_statusNotifierItemDBus = new StatusNotifierItemDBus(this);
+
connect(this, SIGNAL(toolTipChanged(QString,QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip()));
connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon()));
}
}
+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_);
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");
}
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);
{
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
}
QString StatusNotifierItemDBus::Status() const
- {
+{
return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state());
}
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
*/
: QObject(parent),
_mode(Invalid),
_state(Passive),
+ _shouldBeVisible(true),
_passiveIcon(DesktopIcon("quassel_inactive")),
_activeIcon(DesktopIcon("quassel")),
_needsAttentionIcon(DesktopIcon("quassel_message")),
}
void SystemTray::setVisible(bool visible) {
- Q_UNUSED(visible)
+ _shouldBeVisible = visible;
}
void SystemTray::setToolTip(const QString &title, const QString &subtitle) {
protected:
virtual void setMode(Mode mode);
inline Mode mode() const;
+ inline bool shouldBeVisible() const;
virtual Icon stateIcon() const;
Icon stateIcon(State state) const;
private:
Mode _mode;
State _state;
+ bool _shouldBeVisible;
QString _toolTipTitle, _toolTipSubTitle;
Icon _passiveIcon, _activeIcon, _needsAttentionIcon;
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; }