cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / src / qtui / statusnotifieritemdbus.cpp
index ac2d773..fb10ce1 100644 (file)
@@ -4,9 +4,9 @@
  *   Quasselfied 2010 by Manuel Nickschas <sputnick@quassel-irc.org>       *
  *                                                                         *
  *   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        *
  *   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 <QApplication>
 #include <QDBusConnection>
-#include <QPixmap>
 #include <QImage>
-#include <QApplication>
 #include <QMenu>
-#include <QMovie>
-
-#ifdef HAVE_KDE
-#  include <KWindowInfo>
-#  include <KWindowSystem>
-#endif
+#include <QPixmap>
 
-#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<DBusImageStruct>());
-    for (int i=0; i<iconVector.size(); ++i) {
-        argument << iconVector[i];
+    for (const auto& i : iconVector) {
+        argument << i;
     }
     argument.endArray();
     return argument;
 }
 
 // Retrieve the ImageVector data from the D-BUS argument
-const QDBusArgument &operator>>(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 QStringorientation)
 {
     Q_UNUSED(delta)
     Q_UNUSED(orientation)