1 /***************************************************************************
2 * The original file is part of the KDE libraries *
3 * Copyright (C) 2009 by Marco Martin <notmart@gmail.com> *
4 * Quasselfied 2010 by Manuel Nickschas <sputnick@quassel-irc.org> *
6 * This file is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
20 ***************************************************************************/
24 #include "statusnotifieritemdbus.h"
25 #include "statusnotifieritem.h"
27 #include <QDBusConnection>
30 #include <QApplication>
35 # include <KWindowInfo>
36 # include <KWindowSystem>
39 #include "statusnotifierwatcher.h"
40 #include "statusnotifieritemadaptor.h"
42 // Marshall the ImageStruct data into a D-BUS argument
43 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageStruct &icon)
45 argument.beginStructure();
46 argument << icon.width;
47 argument << icon.height;
48 argument << icon.data;
49 argument.endStructure();
53 // Retrieve the ImageStruct data from the D-BUS argument
54 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageStruct &icon)
60 argument.beginStructure();
64 argument.endStructure();
74 // Marshall the ImageVector data into a D-BUS argument
75 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageVector &iconVector)
77 argument.beginArray(qMetaTypeId<DBusImageStruct>());
78 for (int i=0; i<iconVector.size(); ++i) {
79 argument << iconVector[i];
85 // Retrieve the ImageVector data from the D-BUS argument
86 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageVector &iconVector)
88 argument.beginArray();
91 while ( !argument.atEnd() ) {
92 DBusImageStruct element;
94 iconVector.append(element);
103 // Marshall the ToolTipStruct data into a D-BUS argument
104 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTipStruct &toolTip)
106 argument.beginStructure();
107 argument << toolTip.icon;
108 argument << toolTip.image;
109 argument << toolTip.title;
110 argument << toolTip.subTitle;
111 argument.endStructure();
115 // Retrieve the ToolTipStruct data from the D-BUS argument
116 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTipStruct &toolTip)
119 DBusImageVector image;
123 argument.beginStructure();
127 argument >> subTitle;
128 argument.endStructure();
131 toolTip.image = image;
132 toolTip.title = title;
133 toolTip.subTitle = subTitle;
139 int StatusNotifierItemDBus::s_serviceCount = 0;
141 StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem *parent)
143 m_statusNotifierItem(parent),
144 m_service(QString("org.kde.StatusNotifierItem-%1-%2")
145 .arg(QCoreApplication::applicationPid())
146 .arg(++s_serviceCount)),
147 m_dbus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, m_service))
149 new StatusNotifierItemAdaptor(this);
150 qDebug() << "service is" << m_service;
151 m_dbus.registerService(m_service);
152 m_dbus.registerObject("/StatusNotifierItem", this);
155 StatusNotifierItemDBus::~StatusNotifierItemDBus()
157 m_dbus.unregisterService(m_service);
160 QString StatusNotifierItemDBus::service() const
166 //Values and calls have been adapted to Quassel
168 QString StatusNotifierItemDBus::Category() const
170 return QString("Communications"); // no need to make this configurable for Quassel
173 QString StatusNotifierItemDBus::Title() const
175 return m_statusNotifierItem->title();
178 QString StatusNotifierItemDBus::Id() const
180 return QString("QuasselIRC");
183 QString StatusNotifierItemDBus::Status() const
185 return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state());
188 int StatusNotifierItemDBus::WindowId() const
190 return (int)QtUi::mainWindow()->winId();
195 //We don't need to support serialized icon data in Quassel
197 QString StatusNotifierItemDBus::IconName() const
199 return m_statusNotifierItem->iconName();
202 DBusImageVector StatusNotifierItemDBus::IconPixmap() const
204 return DBusImageVector();
207 QString StatusNotifierItemDBus::OverlayIconName() const
212 DBusImageVector StatusNotifierItemDBus::OverlayIconPixmap() const
214 return DBusImageVector();
217 //Requesting attention icon and movie
219 QString StatusNotifierItemDBus::AttentionIconName() const
221 return m_statusNotifierItem->attentionIconName();
224 DBusImageVector StatusNotifierItemDBus::AttentionIconPixmap() const
226 return DBusImageVector();
229 QString StatusNotifierItemDBus::AttentionMovieName() const
237 DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const
239 DBusToolTipStruct toolTip;
240 toolTip.icon = m_statusNotifierItem->toolTipIconName();
241 toolTip.image = DBusImageVector();
242 toolTip.title = m_statusNotifierItem->toolTipTitle();
243 toolTip.subTitle = m_statusNotifierItem->toolTipSubTitle();
250 void StatusNotifierItemDBus::ContextMenu(int x, int y)
252 if (!m_statusNotifierItem->trayMenu()) {
256 //TODO: nicer placement, possible?
257 if (!m_statusNotifierItem->trayMenu()->isVisible()) {
259 m_statusNotifierItem->trayMenu()->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
261 m_statusNotifierItem->trayMenu()->popup(QPoint(x,y));
263 KWindowSystem::setState(m_statusNotifierItem->trayMenu()->winId(), NET::SkipTaskbar|NET::SkipPager|NET::KeepAbove);
264 KWindowSystem::setType(m_statusNotifierItem->trayMenu()->winId(), NET::PopupMenu);
265 KWindowSystem::forceActiveWindow(m_statusNotifierItem->trayMenu()->winId());
268 m_statusNotifierItem->trayMenu()->hide();
272 void StatusNotifierItemDBus::Activate(int x, int y)
274 m_statusNotifierItem->activated(QPoint(x,y));
277 void StatusNotifierItemDBus::SecondaryActivate(int x, int y)
281 // emit m_statusNotifierItem->secondaryActivateRequested(QPoint(x,y));
284 void StatusNotifierItemDBus::Scroll(int delta, const QString &orientation)
287 Q_UNUSED(orientation)
288 // Qt::Orientation dir = (orientation.toLower() == "horizontal" ? Qt::Horizontal : Qt::Vertical);
289 // emit m_statusNotifierItem->scrollRequested(delta, dir);