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 ***************************************************************************/
22 #include "statusnotifieritemdbus.h"
23 #include "statusnotifieritem.h"
26 #include <QDBusConnection>
29 #include <QApplication>
34 # include <KWindowInfo>
35 # include <KWindowSystem>
38 #include "statusnotifierwatcher.h"
39 #include "statusnotifieritemadaptor.h"
41 // Marshall the ImageStruct data into a D-BUS argument
42 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageStruct &icon)
44 argument.beginStructure();
45 argument << icon.width;
46 argument << icon.height;
47 argument << icon.data;
48 argument.endStructure();
52 // Retrieve the ImageStruct data from the D-BUS argument
53 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageStruct &icon)
59 argument.beginStructure();
63 argument.endStructure();
73 // Marshall the ImageVector data into a D-BUS argument
74 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageVector &iconVector)
76 argument.beginArray(qMetaTypeId<DBusImageStruct>());
77 for (int i=0; i<iconVector.size(); ++i) {
78 argument << iconVector[i];
84 // Retrieve the ImageVector data from the D-BUS argument
85 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageVector &iconVector)
87 argument.beginArray();
90 while ( !argument.atEnd() ) {
91 DBusImageStruct element;
93 iconVector.append(element);
102 // Marshall the ToolTipStruct data into a D-BUS argument
103 const QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTipStruct &toolTip)
105 argument.beginStructure();
106 argument << toolTip.icon;
107 argument << toolTip.image;
108 argument << toolTip.title;
109 argument << toolTip.subTitle;
110 argument.endStructure();
114 // Retrieve the ToolTipStruct data from the D-BUS argument
115 const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTipStruct &toolTip)
118 DBusImageVector image;
122 argument.beginStructure();
126 argument >> subTitle;
127 argument.endStructure();
130 toolTip.image = image;
131 toolTip.title = title;
132 toolTip.subTitle = subTitle;
138 int StatusNotifierItemDBus::s_serviceCount = 0;
140 StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem *parent)
142 m_statusNotifierItem(parent),
143 m_service(QString("org.kde.StatusNotifierItem-%1-%2")
144 .arg(QCoreApplication::applicationPid())
145 .arg(++s_serviceCount)),
146 m_dbus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, m_service))
148 new StatusNotifierItemAdaptor(this);
149 qDebug() << "service is" << m_service;
150 m_dbus.registerService(m_service);
151 m_dbus.registerObject("/StatusNotifierItem", this);
154 StatusNotifierItemDBus::~StatusNotifierItemDBus()
156 m_dbus.unregisterService(m_service);
159 QString StatusNotifierItemDBus::service() const
165 //Values and calls have been adapted to Quassel
167 QString StatusNotifierItemDBus::Category() const
169 return QString("Communications"); // no need to make this configurable for Quassel
172 QString StatusNotifierItemDBus::Title() const
174 return m_statusNotifierItem->title();
177 QString StatusNotifierItemDBus::Id() const
179 return QString("QuasselIRC");
182 QString StatusNotifierItemDBus::Status() const
184 return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state());
187 int StatusNotifierItemDBus::WindowId() const
189 return (int)QtUi::mainWindow()->winId();
194 //We don't need to support serialized icon data in Quassel
196 QString StatusNotifierItemDBus::IconName() const
198 return m_statusNotifierItem->iconName();
201 DBusImageVector StatusNotifierItemDBus::IconPixmap() const
203 return DBusImageVector();
206 QString StatusNotifierItemDBus::OverlayIconName() const
211 DBusImageVector StatusNotifierItemDBus::OverlayIconPixmap() const
213 return DBusImageVector();
216 //Requesting attention icon and movie
218 QString StatusNotifierItemDBus::AttentionIconName() const
220 return m_statusNotifierItem->attentionIconName();
223 DBusImageVector StatusNotifierItemDBus::AttentionIconPixmap() const
225 return DBusImageVector();
228 QString StatusNotifierItemDBus::AttentionMovieName() const
236 DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const
238 DBusToolTipStruct toolTip;
239 toolTip.icon = m_statusNotifierItem->toolTipIconName();
240 toolTip.image = DBusImageVector();
241 toolTip.title = m_statusNotifierItem->toolTipTitle();
242 toolTip.subTitle = m_statusNotifierItem->toolTipSubTitle();
249 void StatusNotifierItemDBus::ContextMenu(int x, int y)
251 if (!m_statusNotifierItem->trayMenu()) {
255 //TODO: nicer placement, possible?
256 if (!m_statusNotifierItem->trayMenu()->isVisible()) {
258 m_statusNotifierItem->trayMenu()->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
260 m_statusNotifierItem->trayMenu()->popup(QPoint(x,y));
262 KWindowSystem::setState(m_statusNotifierItem->trayMenu()->winId(), NET::SkipTaskbar|NET::SkipPager|NET::KeepAbove);
263 KWindowSystem::setType(m_statusNotifierItem->trayMenu()->winId(), NET::PopupMenu);
264 KWindowSystem::forceActiveWindow(m_statusNotifierItem->trayMenu()->winId());
267 m_statusNotifierItem->trayMenu()->hide();
271 void StatusNotifierItemDBus::Activate(int x, int y)
273 m_statusNotifierItem->activated(QPoint(x,y));
276 void StatusNotifierItemDBus::SecondaryActivate(int x, int y)
280 // emit m_statusNotifierItem->secondaryActivateRequested(QPoint(x,y));
283 void StatusNotifierItemDBus::Scroll(int delta, const QString &orientation)
286 Q_UNUSED(orientation)
287 // Qt::Orientation dir = (orientation.toLower() == "horizontal" ? Qt::Horizontal : Qt::Vertical);
288 // emit m_statusNotifierItem->scrollRequested(delta, dir);