X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fstatusnotifieritem.cpp;h=f3b362e9c451a6c189e2564e5da20cc4df4853dd;hb=d4b64322860b0dfcc9e1340a3b3a0b0df3e2eb81;hp=f3b462bca820b8cf80bedd3ef2a50cafbaf1eead;hpb=39dffd095bb5dbca49199d2173438c7f90c4e6fa;p=quassel.git diff --git a/src/qtui/statusnotifieritem.cpp b/src/qtui/statusnotifieritem.cpp index f3b462bc..f3b362e9 100644 --- a/src/qtui/statusnotifieritem.cpp +++ b/src/qtui/statusnotifieritem.cpp @@ -23,16 +23,19 @@ #ifdef HAVE_DBUS +#include "statusnotifieritem.h" + #include #include #include +#include #include #include #include +#include "icon.h" #include "qtui.h" #include "quassel.h" -#include "statusnotifieritem.h" #include "statusnotifieritemdbus.h" constexpr int kProtocolVersion {0}; @@ -69,9 +72,7 @@ protected: StatusNotifierItem::StatusNotifierItem(QWidget *parent) : StatusNotifierItemParent(parent) -#if QT_VERSION >= 0x050000 , _iconThemeDir{QDir::tempPath() + QLatin1String{"/quassel-sni-XXXXXX"}} -#endif { static bool registered = []() -> bool { qDBusRegisterMetaType(); @@ -90,30 +91,28 @@ StatusNotifierItem::StatusNotifierItem(QWidget *parent) trayMenu()->installEventFilter(this); // Create a temporary directory that holds copies of the tray icons. That way, visualizers can find our icons. - // For Qt4 the relevant icons are installed in hicolor already, so nothing to be done. -#if QT_VERSION >= 0x050000 if (_iconThemeDir.isValid()) { _iconThemePath = _iconThemeDir.path(); } else { qWarning() << "Could not create temporary directory for themed tray icons!"; } -#endif - connect(QtUi::instance(), SIGNAL(iconThemeRefreshed()), this, SLOT(refreshIcons())); + connect(this, SIGNAL(iconsChanged()), this, SLOT(refreshIcons())); refreshIcons(); // Our own SNI service _statusNotifierItemDBus = new StatusNotifierItemDBus(this); + connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewIcon())); + connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); connect(this, SIGNAL(toolTipChanged(QString, QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip())); - connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); // Service watcher to keep track of the StatusNotifierWatcher service - QDBusServiceWatcher *watcher = new QDBusServiceWatcher(kSniWatcherService, - QDBusConnection::sessionBus(), - QDBusServiceWatcher::WatchForOwnerChange, - this); - connect(watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), SLOT(serviceChange(QString, QString, QString))); + _serviceWatcher = new QDBusServiceWatcher(kSniWatcherService, + QDBusConnection::sessionBus(), + QDBusServiceWatcher::WatchForOwnerChange, + this); + connect(_serviceWatcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), SLOT(serviceChange(QString, QString, QString))); // Client instance for StatusNotifierWatcher _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(kSniWatcherService, @@ -188,15 +187,15 @@ void StatusNotifierItem::onDBusError(const QDBusError &error) setMode(Mode::Legacy); } + void StatusNotifierItem::refreshIcons() { -#if QT_VERSION >= 0x050000 if (!_iconThemePath.isEmpty()) { QDir baseDir{_iconThemePath + "/hicolor"}; baseDir.removeRecursively(); for (auto &&trayState : { State::Active, State::Passive, State::NeedsAttention }) { auto iconName = SystemTray::iconName(trayState); - QIcon icon = QIcon::fromTheme(iconName); + QIcon icon = icon::get(iconName); if (!icon.isNull()) { for (auto &&size : icon.availableSizes()) { auto pixDir = QString{"%1/%2x%3/status"}.arg(baseDir.absolutePath()).arg(size.width()).arg(size.height()); @@ -218,7 +217,7 @@ void StatusNotifierItem::refreshIcons() } } } -#endif + if (_statusNotifierItemDBus) { emit _statusNotifierItemDBus->NewIcon(); emit _statusNotifierItemDBus->NewAttentionIcon(); @@ -239,11 +238,11 @@ bool StatusNotifierItem::isSystemTrayAvailable() const void StatusNotifierItem::onModeChanged(Mode mode) { if (mode == Mode::StatusNotifier) { - _statusNotifierItemDBus->registerService(); + _statusNotifierItemDBus->registerTrayIcon(); registerToWatcher(); } else { - _statusNotifierItemDBus->unregisterService(); + _statusNotifierItemDBus->unregisterTrayIcon(); } } @@ -251,7 +250,6 @@ void StatusNotifierItem::onModeChanged(Mode mode) void StatusNotifierItem::onStateChanged(State state) { if (mode() == Mode::StatusNotifier) { - emit _statusNotifierItemDBus->NewIcon(); emit _statusNotifierItemDBus->NewStatus(metaObject()->enumerator(metaObject()->indexOfEnumerator("State")).valueToKey(state)); } } @@ -261,11 +259,11 @@ void StatusNotifierItem::onVisibilityChanged(bool isVisible) { if (mode() == Mode::StatusNotifier) { if (isVisible) { - _statusNotifierItemDBus->registerService(); + _statusNotifierItemDBus->registerTrayIcon(); registerToWatcher(); } else { - _statusNotifierItemDBus->unregisterService(); + _statusNotifierItemDBus->unregisterTrayIcon(); } } } @@ -279,23 +277,13 @@ QString StatusNotifierItem::title() const QString StatusNotifierItem::iconName() const { - if (state() == Passive) { - return SystemTray::iconName(State::Passive); - } - else { - return SystemTray::iconName(State::Active); - } + return currentIconName(); } QString StatusNotifierItem::attentionIconName() const { - if (animationEnabled()) { - return SystemTray::iconName(State::NeedsAttention); - } - else { - return SystemTray::iconName(State::NeedsAttention); - } + return currentAttentionIconName(); } @@ -327,18 +315,9 @@ void StatusNotifierItem::activated(const QPoint &pos) bool StatusNotifierItem::eventFilter(QObject *watched, QEvent *event) { if (mode() == StatusNotifier) { - //FIXME: ugly ugly workaround to weird QMenu's focus problems -#ifdef HAVE_KDE4 - if (watched == trayMenu() && - (event->type() == QEvent::WindowDeactivate || (event->type() == QEvent::MouseButtonRelease && static_cast(event)->button() == Qt::LeftButton))) { - // put at the back of event queue to let the action activate anyways - QTimer::singleShot(0, trayMenu(), SLOT(hide())); - } -#else if (watched == trayMenu() && event->type() == QEvent::HoverLeave) { trayMenu()->hide(); } -#endif } return StatusNotifierItemParent::eventFilter(watched, event); } @@ -348,12 +327,9 @@ void StatusNotifierItem::showMessage(const QString &title, const QString &messag { QString message = message_; if (_notificationsClient->isValid()) { - if (_notificationsClientSupportsMarkup) -#if QT_VERSION < 0x050000 - message = Qt::escape(message); -#else + if (_notificationsClientSupportsMarkup) { message = message.toHtmlEscaped(); -#endif + } QStringList actions; if (_notificationsClientSupportsActions)