From 3b129ea8f24bb87c946e3879f74a8437be27376c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sat, 28 Apr 2012 18:41:32 +0200
Subject: Add a show/hide menu to the system tray on Ubuntu.

Resolves: #1112

diff --git a/Swift/QtUI/QtSystemTray.cpp b/Swift/QtUI/QtSystemTray.cpp
index 123e6a3..bc8e40a 100644
--- a/Swift/QtUI/QtSystemTray.cpp
+++ b/Swift/QtUI/QtSystemTray.cpp
@@ -4,22 +4,41 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
+#pragma GCC diagnostic ignored "-Wredundant-decls"
+
 #include "Swift/QtUI/QtSystemTray.h"
 
+#include <QtDebug>
+#include <QDBusInterface>
 #include <QIcon>
 #include <QPixmap>
 #include <QResource>
+#include <QMenu>
+#include <QAction>
 
 namespace Swift {
-QtSystemTray::QtSystemTray() : QObject(), onlineIcon_(":icons/online.png"), awayIcon_(":icons/away.png"), dndIcon_(":icons/dnd.png"), offlineIcon_(":icons/offline.png"), newMessageIcon_(":icons/new-chat.png"), throbberMovie_(":/icons/connecting.mng"), unreadMessages_(false), connecting_(false) {
+QtSystemTray::QtSystemTray() : QObject(), trayMenu_(0), onlineIcon_(":icons/online.png"), awayIcon_(":icons/away.png"), dndIcon_(":icons/dnd.png"), offlineIcon_(":icons/offline.png"), newMessageIcon_(":icons/new-chat.png"), throbberMovie_(":/icons/connecting.mng"), unreadMessages_(false), connecting_(false) {
 	trayIcon_ = new QSystemTrayIcon(offlineIcon_);
 	trayIcon_->setToolTip("Swift");
 	connect(trayIcon_, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(handleIconActivated(QSystemTrayIcon::ActivationReason)));
 	connect(&throbberMovie_, SIGNAL(frameChanged(int)), this, SLOT(handleThrobberFrameChanged(int)));
+#ifdef Q_WS_X11
+	bool isUnity = QDBusInterface("com.canonical.Unity.Launcher", "/com/canonical/Unity/Launcher").isValid();
+	if (isUnity) {
+		// Add an activation menu, because this is the only way to get the application to the
+		// front on Unity. See the README for sni-qt (which handles Qt tray icons for Unity)
+		trayMenu_ = new QMenu();
+		QAction* showAction = new QAction(QString("Show/Hide"), this);
+		connect(showAction, SIGNAL(triggered()), SIGNAL(clicked()));
+		trayMenu_->addAction(showAction);
+		trayIcon_->setContextMenu(trayMenu_);
+	}
+#endif
 	trayIcon_->show();
 }
 
 QtSystemTray::~QtSystemTray() {
+	delete trayMenu_;
 	delete trayIcon_;
 }
 
diff --git a/Swift/QtUI/QtSystemTray.h b/Swift/QtUI/QtSystemTray.h
index cc7321b..8691e19 100644
--- a/Swift/QtUI/QtSystemTray.h
+++ b/Swift/QtUI/QtSystemTray.h
@@ -12,8 +12,10 @@
 #include <QMovie>
 
 class QIcon;
+class QMenu;
 
 namespace Swift {
+
 	class QtSystemTray : public QObject, public SystemTray {
 		Q_OBJECT
 		public:
@@ -35,6 +37,7 @@ namespace Swift {
 			void updateStatusIcon();
 			StatusShow::Type statusType_;
 			QSystemTrayIcon* trayIcon_;
+			QMenu* trayMenu_;
 			QIcon onlineIcon_;
 			QIcon awayIcon_;
 			QIcon dndIcon_;
-- 
cgit v0.10.2-6-g49f6