X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fstatusnotifieritemdbus.cpp;h=fb10ce128ad489ef0e50963dcb66c6068fffbd63;hp=430bd610078eeeba17445ba8ca9820e062a59150;hb=e38846f054ad1766f2e91992a57bbaffd33c7c06;hpb=bab0550b0e7d7a13dabb33ff4f8d0af7f1cc8e6e diff --git a/src/qtui/statusnotifieritemdbus.cpp b/src/qtui/statusnotifieritemdbus.cpp index 430bd610..fb10ce12 100644 --- a/src/qtui/statusnotifieritemdbus.cpp +++ b/src/qtui/statusnotifieritemdbus.cpp @@ -4,9 +4,9 @@ * Quasselfied 2010 by Manuel Nickschas * * * * This file is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * it under the terms of the GNU Library General Public License (LGPL) * + * as published by the Free Software Foundation; either version 2 of the * + * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -16,31 +16,39 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include "mainwin.h" -#include "qtui.h" #include "statusnotifieritemdbus.h" -#include "statusnotifieritem.h" +#include #include -#include #include -#include #include -#include - -#ifdef HAVE_KDE -# include -# include -#endif +#include -#include "statusnotifierwatcher.h" +#include "mainwin.h" +#include "qtui.h" +#include "statusnotifieritem.h" #include "statusnotifieritemadaptor.h" +#include "statusnotifierwatcher.h" + +#ifdef Q_OS_WIN64 +__inline int toInt(WId wid) +{ + return (int)((__int64)wid); +} + +#else +__inline int toInt(WId wid) +{ + return (int)wid; +} + +#endif // Marshall the ImageStruct data into a D-BUS argument -const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageStruct &icon) +const QDBusArgument& operator<<(QDBusArgument& argument, const DBusImageStruct& icon) { argument.beginStructure(); argument << icon.width; @@ -51,7 +59,7 @@ const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageStruct & } // Retrieve the ImageStruct data from the D-BUS argument -const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageStruct &icon) +const QDBusArgument& operator>>(const QDBusArgument& argument, DBusImageStruct& icon) { qint32 width; qint32 height; @@ -70,38 +78,36 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, DBusImageStruct & return argument; } - // Marshall the ImageVector data into a D-BUS argument -const QDBusArgument &operator<<(QDBusArgument &argument, const DBusImageVector &iconVector) +const QDBusArgument& operator<<(QDBusArgument& argument, const DBusImageVector& iconVector) { argument.beginArray(qMetaTypeId()); - for (int i=0; i>(const QDBusArgument &argument, DBusImageVector &iconVector) +const QDBusArgument& operator>>(const QDBusArgument& argument, DBusImageVector& iconVector) { argument.beginArray(); iconVector.clear(); - while ( !argument.atEnd() ) { - DBusImageStruct element; - argument >> element; - iconVector.append(element); + while (!argument.atEnd()) { + DBusImageStruct element; + argument >> element; + iconVector.append(element); } argument.endArray(); - return argument; } // Marshall the ToolTipStruct data into a D-BUS argument -const QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTipStruct &toolTip) +const QDBusArgument& operator<<(QDBusArgument& argument, const DBusToolTipStruct& toolTip) { argument.beginStructure(); argument << toolTip.icon; @@ -113,7 +119,7 @@ const QDBusArgument &operator<<(QDBusArgument &argument, const DBusToolTipStruct } // Retrieve the ToolTipStruct data from the D-BUS argument -const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTipStruct &toolTip) +const QDBusArgument& operator>>(const QDBusArgument& argument, DBusToolTipStruct& toolTip) { QString icon; DBusImageVector image; @@ -135,39 +141,54 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, DBusToolTipStruct return argument; } - int StatusNotifierItemDBus::s_serviceCount = 0; -StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem *parent) - : QObject(parent), - m_statusNotifierItem(parent), - m_service(QString("org.kde.StatusNotifierItem-%1-%2") - .arg(QCoreApplication::applicationPid()) - .arg(++s_serviceCount)), - m_dbus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, m_service)) +StatusNotifierItemDBus::StatusNotifierItemDBus(StatusNotifierItem* parent) + : QObject(parent) + , m_statusNotifierItem(parent) + , m_dbus( + QDBusConnection::connectToBus(QDBusConnection::SessionBus, + QString("org.kde.StatusNotifierItem-%1-%2").arg(QCoreApplication::applicationPid()).arg(++s_serviceCount))) { - new StatusNotifierItemAdaptor(this); - //qDebug() << "service is" << m_service; - m_dbus.registerService(m_service); - m_dbus.registerObject("/StatusNotifierItem", this); + new StatusNotifierItemAdaptor(this); } StatusNotifierItemDBus::~StatusNotifierItemDBus() { - m_dbus.unregisterService(m_service); + unregisterTrayIcon(); +} + +QDBusConnection StatusNotifierItemDBus::dbusConnection() const +{ + return m_dbus; +} + +// FIXME: prevent double registrations, also test this on platforms != KDE +// +void StatusNotifierItemDBus::registerTrayIcon() +{ + m_dbus.registerObject("/StatusNotifierItem", this); +} + +// FIXME: see above +void StatusNotifierItemDBus::unregisterTrayIcon() +{ + if (m_dbus.isConnected()) { + m_dbus.unregisterObject("/StatusNotifierItem"); + } } QString StatusNotifierItemDBus::service() const { - return m_service; + return m_dbus.baseService(); } -//DBUS slots -//Values and calls have been adapted to Quassel +// DBUS slots +// Values and calls have been adapted to Quassel QString StatusNotifierItemDBus::Category() const { - return QString("Communications"); // no need to make this configurable for Quassel + return QString("Communications"); // no need to make this configurable for Quassel } QString StatusNotifierItemDBus::Title() const @@ -181,18 +202,19 @@ QString StatusNotifierItemDBus::Id() const } QString StatusNotifierItemDBus::Status() const - { - return m_statusNotifierItem->metaObject()->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")).valueToKey(m_statusNotifierItem->state()); +{ + return m_statusNotifierItem->metaObject() + ->enumerator(m_statusNotifierItem->metaObject()->indexOfEnumerator("State")) + .valueToKey(m_statusNotifierItem->state()); } int StatusNotifierItemDBus::WindowId() const { - return (int)QtUi::mainWindow()->winId(); + return toInt(QtUi::mainWindow()->winId()); } - -//Icon -//We don't need to support serialized icon data in Quassel +// Icon +// We don't need to support serialized icon data in Quassel QString StatusNotifierItemDBus::IconName() const { @@ -214,7 +236,7 @@ DBusImageVector StatusNotifierItemDBus::OverlayIconPixmap() const return DBusImageVector(); } -//Requesting attention icon and movie +// Requesting attention icon and movie QString StatusNotifierItemDBus::AttentionIconName() const { @@ -231,8 +253,7 @@ QString StatusNotifierItemDBus::AttentionMovieName() const return QString(); } - -//ToolTip +// ToolTip DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const { @@ -245,7 +266,19 @@ DBusToolTipStruct StatusNotifierItemDBus::ToolTip() const return toolTip; } -//Interaction +QString StatusNotifierItemDBus::IconThemePath() const +{ + return m_statusNotifierItem->iconThemePath(); +} + +// Menu + +QDBusObjectPath StatusNotifierItemDBus::Menu() const +{ + return QDBusObjectPath(m_statusNotifierItem->menuObjectPath()); +} + +// Interaction void StatusNotifierItemDBus::ContextMenu(int x, int y) { @@ -253,25 +286,18 @@ void StatusNotifierItemDBus::ContextMenu(int x, int y) return; } - //TODO: nicer placement, possible? + // TODO: nicer placement, possible? if (!m_statusNotifierItem->trayMenu()->isVisible()) { -#ifdef HAVE_KDE - m_statusNotifierItem->trayMenu()->setWindowFlags(Qt::Window|Qt::FramelessWindowHint); -#endif - m_statusNotifierItem->trayMenu()->popup(QPoint(x,y)); -#ifdef HAVE_KDE - KWindowSystem::setState(m_statusNotifierItem->trayMenu()->winId(), NET::SkipTaskbar|NET::SkipPager|NET::KeepAbove); - KWindowSystem::setType(m_statusNotifierItem->trayMenu()->winId(), NET::PopupMenu); - KWindowSystem::forceActiveWindow(m_statusNotifierItem->trayMenu()->winId()); -#endif - } else { + m_statusNotifierItem->trayMenu()->popup(QPoint(x, y)); + } + else { m_statusNotifierItem->trayMenu()->hide(); } } void StatusNotifierItemDBus::Activate(int x, int y) { - m_statusNotifierItem->activated(QPoint(x,y)); + m_statusNotifierItem->activated(QPoint(x, y)); } void StatusNotifierItemDBus::SecondaryActivate(int x, int y) @@ -281,7 +307,7 @@ void StatusNotifierItemDBus::SecondaryActivate(int x, int y) // emit m_statusNotifierItem->secondaryActivateRequested(QPoint(x,y)); } -void StatusNotifierItemDBus::Scroll(int delta, const QString &orientation) +void StatusNotifierItemDBus::Scroll(int delta, const QString& orientation) { Q_UNUSED(delta) Q_UNUSED(orientation)