X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fqtui%2Fsystemtray.cpp;h=8c34655044f9fb3eb676995f9b4949b657c15004;hb=3efffa2c3f687b21c8040e9a7ee3830e8f539abf;hp=acb68b1937a9546422cbcefcce3b8de436b2964f;hpb=5a470c1acab34c95d957bf81dce7e7cd330a2c58;p=quassel.git diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index acb68b19..8c346550 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -18,6 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#ifndef QT_NO_SYSTEMTRAYICON + #include #include "systemtray.h" @@ -31,23 +33,36 @@ SystemTray::SystemTray(QObject *parent) : QObject(parent), _state(Inactive), _alert(false), + _inhibitActivation(false), _currentIdx(0) { loadAnimations(); _currentIdx = _idxOffEnd; - _trayIcon = new QSystemTrayIcon(_phases.at(_currentIdx), this); + +#ifndef HAVE_KDE + _trayIcon = new QSystemTrayIcon(_phases.at(_currentIdx), QtUi::mainWindow()); +#else + _trayIcon = new KSystemTrayIcon(_phases.at(_currentIdx), QtUi::mainWindow()); + // We don't want to trigger a minimize if a highlight is pending, so we brutally remove the internal connection for that + disconnect(_trayIcon, SIGNAL(activated( QSystemTrayIcon::ActivationReason)), + _trayIcon, SLOT(activateOrHide(QSystemTrayIcon::ActivationReason))); +#endif _animationTimer.setInterval(150); _animationTimer.setSingleShot(false); connect(&_animationTimer, SIGNAL(timeout()), SLOT(nextPhase())); ActionCollection *coll = QtUi::actionCollection("General"); - _trayMenu = new QMenu(); + _trayMenu = _trayIcon->contextMenu(); + if (!_trayMenu) + _trayMenu = new QMenu(); _trayMenu->addAction(coll->action("ConnectCore")); _trayMenu->addAction(coll->action("DisconnectCore")); _trayMenu->addAction(coll->action("CoreInfo")); +#ifndef HAVE_KDE _trayMenu->addSeparator(); _trayMenu->addAction(coll->action("Quit")); +#endif /* HAVE_KDE */ _trayIcon->setContextMenu(_trayMenu); @@ -56,7 +71,11 @@ SystemTray::SystemTray(QObject *parent) _trayIcon->show(); } - connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SIGNAL(activated(QSystemTrayIcon::ActivationReason))); + qApp->installEventFilter(this); + +#ifndef Q_WS_MAC + connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(on_activated(QSystemTrayIcon::ActivationReason))); +#endif connect(_trayIcon, SIGNAL(messageClicked()), SIGNAL(messageClicked())); } @@ -153,3 +172,28 @@ void SystemTray::setToolTip(const QString &tip) { void SystemTray::showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon icon, int millisecondsTimeoutHint) { _trayIcon->showMessage(title, message, icon, millisecondsTimeoutHint); } + +bool SystemTray::eventFilter(QObject *obj, QEvent *event) { + Q_UNUSED(obj); + if(event->type() == QEvent::MouseButtonRelease) { + _inhibitActivation = false; + } + return false; +} + +void SystemTray::on_activated(QSystemTrayIcon::ActivationReason reason) { + emit activated(reason); + + if(reason == QSystemTrayIcon::Trigger && !_inhibitActivation) { + +# ifdef HAVE_KDE + // the slot is private, but meh, who cares :) + QMetaObject::invokeMethod(_trayIcon, "activateOrHide", Q_ARG(QSystemTrayIcon::ActivationReason, QSystemTrayIcon::Trigger)); +# else + QtUi::mainWindow()->toggleMinimizedToTray(); +# endif + + } +} + +#endif /* QT_NO_SYSTEMTRAYICON */