/***************************************************************************
-* 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. *
-***************************************************************************/
+ * 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"
#include "systemtray.h"
SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
- : AbstractNotificationBackend(parent)
+ : AbstractNotificationBackend(parent),
+ _blockActivation(false)
{
NotificationSettings notificationSettings;
_showBubble = notificationSettings.value("Systray/ShowBubble", true).toBool();
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 ¬ification) {
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();
}