+ trayMenu()->installEventFilter(this);
+
+ // Create a temporary directory that holds copies of the tray icons. That way, visualizers can find our icons.
+ if (_iconThemeDir.isValid()) {
+ _iconThemePath = _iconThemeDir.path();
+ }
+ else {
+ qWarning() << "Could not create temporary directory for themed tray icons!";
+ }
+
+ 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()));
+
+ // Service watcher to keep track of the StatusNotifierWatcher service
+ _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,
+ kSniWatcherPath,
+ QDBusConnection::sessionBus(),
+ this);
+ connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostRegistered()), SLOT(checkForRegisteredHosts()));
+ connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostUnregistered()), SLOT(checkForRegisteredHosts()));
+
+ // Client instance for notifications
+ _notificationsClient = new org::freedesktop::Notifications(kXdgNotificationsService,
+ kXdgNotificationsPath,
+ QDBusConnection::sessionBus(),
+ this);
+ connect(_notificationsClient, SIGNAL(NotificationClosed(uint, uint)), SLOT(notificationClosed(uint, uint)));
+ connect(_notificationsClient, SIGNAL(ActionInvoked(uint, QString)), SLOT(notificationInvoked(uint, QString)));
+
+ if (_notificationsClient->isValid()) {
+ QStringList desktopCapabilities = _notificationsClient->GetCapabilities();
+ _notificationsClientSupportsMarkup = desktopCapabilities.contains("body-markup");
+ _notificationsClientSupportsActions = desktopCapabilities.contains("actions");
+ }
+
+#ifdef HAVE_DBUSMENU
+ new QuasselDBusMenuExporter(menuObjectPath(), trayMenu(), _statusNotifierItemDBus->dbusConnection()); // will be added as menu child
+#endif