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 Library General Public License (LGPL) *
8 * as published by the Free Software Foundation; either version 2 of the *
9 * License, or (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;
167 StatusNotifierItemDBus::~StatusNotifierItemDBus()
172 QDBusConnection StatusNotifierItemDBus::dbusConnection() const
177 // FIXME: prevent double registrations, also test this on platforms != KDE
179 void StatusNotifierItemDBus::registerService()
181 //qDebug() << "registering to" << m_service;
182 m_dbus.registerService(m_service);
183 m_dbus.registerObject("/StatusNotifierItem", this);
187 void StatusNotifierItemDBus::unregisterService()
189 //qDebug() << "unregistering from" << m_service;
190 if(m_dbus.isConnected()) {
191 m_dbus.unregisterObject("/StatusNotifierItem");
192 m_dbus.unregisterService(m_service);
196 QString StatusNotifierItemDBus::service() const
202 //Values and calls have been adapted to Quassel
204 QString StatusNotifierItemDBus::Category() const
206 return QString("Communications"); // no need to make this configurable for Quassel
209 QString StatusNotifierItemDBus::Title() const
211 return m_statusNotifierItem->title();
214 QString StatusNotifierItemDBus::Id() const
216 return QString("QuasselIRC");
219 QString StatusNotifierItemDBus::Status() const
221 return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state());
224 int StatusNotifierItemDBus::WindowId() const
226 return toInt(QtUi::mainWindow()->winId());
231 //We don't need to support serialized icon data in Quassel
233 QString StatusNotifierItemDBus::IconName() const
235 return m_statusNotifierItem->iconName();
238 DBusImageVector StatusNotifierItemDBus::IconPixmap() const
240 return DBusImageVector();
243 QString StatusNotifierItemDBus::OverlayIconName() const
248 DBusImageVector StatusNotifierItemDBus::OverlayIconPixmap() const
250 return DBusImageVector();
253 //Requesting attention icon and movie
255 QString StatusNotifierItemDBus::AttentionIconName() const
257 return m_statusNotifierItem->attentionIconName();
260 DBusImageVector StatusNotifierItemDBus::AttentionIconPixmap() const
262 return DBusImageVector();
265 QString StatusNotifierItemDBus::AttentionMovieName() const
273 DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const
275 DBusToolTipStruct toolTip;
276 toolTip.icon = m_statusNotifierItem->toolTipIconName();
277 toolTip.image = DBusImageVector();
278 toolTip.title = m_statusNotifierItem->toolTipTitle();
279 toolTip.subTitle = m_statusNotifierItem->toolTipSubTitle();
284 QString StatusNotifierItemDBus::IconThemePath() const
286 return m_statusNotifierItem->iconThemePath();
291 QDBusObjectPath StatusNotifierItemDBus::Menu() const
293 return QDBusObjectPath(m_statusNotifierItem->menuObjectPath());
299 void StatusNotifierItemDBus::ContextMenu(int x, int y)
301 if (!m_statusNotifierItem->trayMenu()) {
305 //TODO: nicer placement, possible?
306 if (!m_statusNotifierItem->trayMenu()->isVisible()) {
308 m_statusNotifierItem->trayMenu()->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
310 m_statusNotifierItem->trayMenu()->popup(QPoint(x,y));
312 KWindowSystem::setState(m_statusNotifierItem->trayMenu()->winId(), NET::SkipTaskbar|NET::SkipPager|NET::KeepAbove);
313 KWindowSystem::setType(m_statusNotifierItem->trayMenu()->winId(), NET::PopupMenu);
314 KWindowSystem::forceActiveWindow(m_statusNotifierItem->trayMenu()->winId());
317 m_statusNotifierItem->trayMenu()->hide();
321 void StatusNotifierItemDBus::Activate(int x, int y)
323 m_statusNotifierItem->activated(QPoint(x,y));
326 void StatusNotifierItemDBus::SecondaryActivate(int x, int y)
330 // emit m_statusNotifierItem->secondaryActivateRequested(QPoint(x,y));
333 void StatusNotifierItemDBus::Scroll(int delta, const QString &orientation)
336 Q_UNUSED(orientation)
337 // Qt::Orientation dir = (orientation.toLower() == "horizontal" ? Qt::Horizontal : Qt::Vertical);
338 // emit m_statusNotifierItem->scrollRequested(delta, dir);