#ifdef HAVE_DBUS
-#include "statusnotifieritem.h"
-#include "statusnotifieritemdbus.h"
-
#include <QApplication>
#include <QMenu>
#include <QMouseEvent>
#include <QTextDocument>
+#include "quassel.h"
+#include "statusnotifieritem.h"
+#include "statusnotifieritemdbus.h"
+
const int StatusNotifierItem::_protocolVersion = 0;
+#ifdef HAVE_DBUSMENU
+# include "dbusmenuexporter.h"
+
+/**
+ * Specialization to provide access to icon names
+ */
+class QuasselDBusMenuExporter : public DBusMenuExporter {
+public:
+ QuasselDBusMenuExporter(const QString &dbusObjectPath, QMenu *menu, const QDBusConnection &dbusConnection)
+ : DBusMenuExporter(dbusObjectPath, menu, dbusConnection)
+ {}
+
+protected:
+ virtual QString iconNameForAction(QAction *action) { // TODO Qt 4.7: fixme when we have converted our iconloader
+ Icon icon(action->icon());
+#if QT_VERSION >= 0x040701
+ // QIcon::name() is in the 4.7 git branch, but it is not in 4.7 TP.
+ // If you get a build error here, you need to update your pre-release
+ // of Qt 4.7.
+ return icon.isNull() ? QString() : icon.name();
+#else
+ return QString();
+#endif
+ }
+};
+
+#endif /* HAVE_DBUSMENU */
+
StatusNotifierItem::StatusNotifierItem(QWidget *parent)
: StatusNotifierItemParent(parent),
_statusNotifierItemDBus(0),
qDBusRegisterMetaType<DBusToolTipStruct>();
_statusNotifierItemDBus = new StatusNotifierItemDBus(this);
+
connect(this, SIGNAL(toolTipChanged(QString,QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip()));
connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon()));
StatusNotifierItemParent::init();
trayMenu()->installEventFilter(this);
+
+ // use the appdata icon folder for now
+ _iconThemePath = Quassel::findDataFilePath("icons");
+
+#ifdef HAVE_DBUSMENU
+ _menuObjectPath = "/MenuBar";
+ new QuasselDBusMenuExporter(menuObjectPath(), trayMenu(), _statusNotifierItemDBus->dbusConnection()); // will be added as menu child
+#endif
}
void StatusNotifierItem::registerToDaemon() {
if(!_statusNotifierWatcher) {
QString interface("org.kde.StatusNotifierWatcher");
- _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(interface, "/StatusNotifierWatcher",
- QDBusConnection::sessionBus());
+ _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(interface, "/StatusNotifierWatcher", QDBusConnection::sessionBus());
}
if(_statusNotifierWatcher->isValid()
&& _statusNotifierWatcher->property("ProtocolVersion").toInt() == _protocolVersion) {
}
}
+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");
}
return QString("quassel");
}
+QString StatusNotifierItem::iconThemePath() const {
+ return _iconThemePath;
+}
+
+QString StatusNotifierItem::menuObjectPath() const {
+ return _menuObjectPath;
+}
+
void StatusNotifierItem::activated(const QPoint &pos) {
Q_UNUSED(pos)
activate(Trigger);