Rework tray icon activation behavior yet again
[quassel.git] / src / qtui / systraynotificationbackend.cpp
index 1c97d4f..fa7b245 100644 (file)
@@ -1,24 +1,22 @@
 /***************************************************************************
-*   Copyright (C) 2005-09 by the Quassel Project                          *
-*   devel@quassel-irc.org                                                 *
-*                                                                         *
-*   This program 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) version 3.                                           *
-*                                                                         *
-*   This program is distributed in the hope that it will be useful,       *
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-*   GNU General Public License for more details.                          *
-*                                                                         *
-*   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.             *
-***************************************************************************/
-
-#ifndef QT_NO_SYSTEMTRAYICON
+ *   Copyright (C) 2005-2010 by the Quassel Project                        *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program 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) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   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.             *
+ ***************************************************************************/
 
 #include "systraynotificationbackend.h"
 
@@ -33,7 +31,8 @@
 #include "systemtray.h"
 
 SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
-  : AbstractNotificationBackend(parent)
+  : AbstractNotificationBackend(parent),
+  _blockActivation(false)
 {
   NotificationSettings notificationSettings;
   _showBubble = notificationSettings.value("Systray/ShowBubble", true).toBool();
@@ -43,8 +42,10 @@ SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
   notificationSettings.notify("Systray/Animate", this, SLOT(animateChanged(const QVariant &)));
 
   connect(QtUi::mainWindow()->systemTray(), SIGNAL(messageClicked()), SLOT(notificationActivated()));
-  connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
-                                            SLOT(notificationActivated(QSystemTrayIcon::ActivationReason)));
+  connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(SystemTray::ActivationReason)),
+                                            SLOT(notificationActivated(SystemTray::ActivationReason)));
+
+  QApplication::instance()->installEventFilter(this);
 }
 
 void SystrayNotificationBackend::notify(const Notification &notification) {
@@ -88,24 +89,35 @@ void SystrayNotificationBackend::showBubble() {
 void SystrayNotificationBackend::closeBubble() {
   // there really seems to be no sane way to close the bubble... :(
 #ifdef Q_WS_X11
-  QtUi::mainWindow()->systemTray()->showMessage("", "", QSystemTrayIcon::NoIcon, 1);
+  QtUi::mainWindow()->systemTray()->showMessage("", "", SystemTray::NoIcon, 1);
 #endif
 }
 
 void SystrayNotificationBackend::notificationActivated() {
-  if(QtUi::mainWindow()->systemTray()->isAlerted()) {
-    QtUi::mainWindow()->systemTray()->setInhibitActivation();
-    uint id = _notifications.count()? _notifications.last().notificationId : 0;
-    emit activated(id);
+  if(!_blockActivation) {
+    if(QtUi::mainWindow()->systemTray()->isAlerted()) {
+      _blockActivation = true; // prevent double activation because both tray icon and bubble might send a signal
+      uint id = _notifications.count()? _notifications.last().notificationId : 0;
+      emit activated(id);
+    } else
+      GraphicalUi::toggleMainWidget();
   }
 }
 
-void SystrayNotificationBackend::notificationActivated(QSystemTrayIcon::ActivationReason reason) {
-  if(reason == QSystemTrayIcon::Trigger) {
+void SystrayNotificationBackend::notificationActivated(SystemTray::ActivationReason reason) {
+  if(reason == SystemTray::Trigger) {
     notificationActivated();
   }
 }
 
+// moving the mouse or releasing the button means that we're not dealing with a double activation
+bool SystrayNotificationBackend::eventFilter(QObject *obj, QEvent *event) {
+  if(event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonRelease) {
+    _blockActivation = false;
+  }
+  return AbstractNotificationBackend::eventFilter(obj, event);
+}
+
 void SystrayNotificationBackend::showBubbleChanged(const QVariant &v) {
   _showBubble = v.toBool();
 }
@@ -165,5 +177,3 @@ void SystrayNotificationBackend::ConfigWidget::save() {
   s.setValue("Systray/ShowBubble", _showBubbleBox->isChecked());
   load();
 }
-
-#endif /* QT_NO_SYSTEMTRAYICON */