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"
43 __inline int toInt(WId wid)
45 return (int)((__int64)wid);
49 __inline int toInt(WId wid)
55 // Marshall the ImageStruct data into a D-BUS argument
56 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageStruct &icon)
58 argument.beginStructure();
59 argument << icon.width;
60 argument << icon.height;
61 argument << icon.data;
62 argument.endStructure();
66 // Retrieve the ImageStruct data from the D-BUS argument
67 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageStruct &icon)
73 argument.beginStructure();
77 argument.endStructure();
87 // Marshall the ImageVector data into a D-BUS argument
88 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageVector &iconVector)
90 argument.beginArray(qMetaTypeId<DBusImageStruct>());
91 for (int i=0; i<iconVector.size(); ++i) {
92 argument << iconVector[i];
98 // Retrieve the ImageVector data from the D-BUS argument
99 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageVector &iconVector)
101 argument.beginArray();
104 while ( !argument.atEnd() ) {
105 DBusImageStruct element;
107 iconVector.append(element);
116 // Marshall the ToolTipStruct data into a D-BUS argument
117 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTipStruct &toolTip)
119 argument.beginStructure();
120 argument << toolTip.icon;
121 argument << toolTip.image;
122 argument << toolTip.title;
123 argument << toolTip.subTitle;
124 argument.endStructure();
128 // Retrieve the ToolTipStruct data from the D-BUS argument
129 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTipStruct &toolTip)
132 DBusImageVector image;
136 argument.beginStructure();
140 argument >> subTitle;
141 argument.endStructure();
144 toolTip.image = image;
145 toolTip.title = title;
146 toolTip.subTitle = subTitle;
152 int StatusNotifierItemDBus::s_serviceCount = 0;
154 StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem *parent)
156 m_statusNotifierItem(parent),
157 m_service(QString("org.kde.StatusNotifierItem-%1-%2")
158 .arg(QCoreApplication::applicationPid())
159 .arg(++s_serviceCount)),
160 m_dbus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, m_service))
162 new StatusNotifierItemAdaptor(this);
163 //qDebug() << "service is" << m_service;
165 m_dbus.registerObject("/StatusNotifierItem", this);
168 StatusNotifierItemDBus::~StatusNotifierItemDBus()
173 // FIXME: prevent double registrations, also test this on platforms != KDE
175 void StatusNotifierItemDBus::registerService()
177 //qDebug() << "registering to" << m_service;
178 m_dbus.registerService(m_service);
182 void StatusNotifierItemDBus::unregisterService()
184 //qDebug() << "unregistering from" << m_service;
185 if(m_dbus.isConnected()) {
186 m_dbus.unregisterService(m_service);
190 QString StatusNotifierItemDBus::service() const
196 //Values and calls have been adapted to Quassel
198 QString StatusNotifierItemDBus::Category() const
200 return QString("Communications"); // no need to make this configurable for Quassel
203 QString StatusNotifierItemDBus::Title() const
205 return m_statusNotifierItem->title();
208 QString StatusNotifierItemDBus::Id() const
210 return QString("QuasselIRC");
213 QString StatusNotifierItemDBus::Status() const
215 return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state());
218 int StatusNotifierItemDBus::WindowId() const
220 return toInt(QtUi::mainWindow()->winId());
225 //We don't need to support serialized icon data in Quassel
227 QString StatusNotifierItemDBus::IconName() const
229 return m_statusNotifierItem->iconName();
232 DBusImageVector StatusNotifierItemDBus::IconPixmap() const
234 return DBusImageVector();
237 QString StatusNotifierItemDBus::OverlayIconName() const
242 DBusImageVector StatusNotifierItemDBus::OverlayIconPixmap() const
244 return DBusImageVector();
247 //Requesting attention icon and movie
249 QString StatusNotifierItemDBus::AttentionIconName() const
251 return m_statusNotifierItem->attentionIconName();
254 DBusImageVector StatusNotifierItemDBus::AttentionIconPixmap() const
256 return DBusImageVector();
259 QString StatusNotifierItemDBus::AttentionMovieName() const
267 DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const
269 DBusToolTipStruct toolTip;
270 toolTip.icon = m_statusNotifierItem->toolTipIconName();
271 toolTip.image = DBusImageVector();
272 toolTip.title = m_statusNotifierItem->toolTipTitle();
273 toolTip.subTitle = m_statusNotifierItem->toolTipSubTitle();
280 void StatusNotifierItemDBus::ContextMenu(int x, int y)
282 if (!m_statusNotifierItem->trayMenu()) {
286 //TODO: nicer placement, possible?
287 if (!m_statusNotifierItem->trayMenu()->isVisible()) {
289 m_statusNotifierItem->trayMenu()->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
291 m_statusNotifierItem->trayMenu()->popup(QPoint(x,y));
293 KWindowSystem::setState(m_statusNotifierItem->trayMenu()->winId(), NET::SkipTaskbar|NET::SkipPager|NET::KeepAbove);
294 KWindowSystem::setType(m_statusNotifierItem->trayMenu()->winId(), NET::PopupMenu);
295 KWindowSystem::forceActiveWindow(m_statusNotifierItem->trayMenu()->winId());
298 m_statusNotifierItem->trayMenu()->hide();
302 void StatusNotifierItemDBus::Activate(int x, int y)
304 m_statusNotifierItem->activated(QPoint(x,y));
307 void StatusNotifierItemDBus::SecondaryActivate(int x, int y)
311 // emit m_statusNotifierItem->secondaryActivateRequested(QPoint(x,y));
314 void StatusNotifierItemDBus::Scroll(int delta, const QString &orientation)
317 Q_UNUSED(orientation)
318 // Qt::Orientation dir = (orientation.toLower() == "horizontal" ? Qt::Horizontal : Qt::Vertical);
319 // emit m_statusNotifierItem->scrollRequested(delta, dir);