From: Manuel Nickschas Date: Mon, 5 Jan 2009 13:00:20 +0000 (+0100) Subject: Notification backends now can emit a signal activated() that tells MainWin to raise... X-Git-Tag: 0.4.0~266 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=b324a124e384bd8c9f54d97c5b5d6a5cc50fd91b Notification backends now can emit a signal activated() that tells MainWin to raise itself For now, this signal is emitted by systray, dbus and knotify. Unfortunately, raise() does not seem to work with kwin and (according to docs) neither on Windows. Furthermore, my knotify seems to be broken and doesn't signal a click at all. Thus, this whole thing got "limited" testing by me :) Take it as "might work under some circumstances in some environments". Feedback welcome. --- diff --git a/src/qtui/desktopnotificationbackend.cpp b/src/qtui/desktopnotificationbackend.cpp index e959f528..f174217c 100644 --- a/src/qtui/desktopnotificationbackend.cpp +++ b/src/qtui/desktopnotificationbackend.cpp @@ -148,6 +148,7 @@ void DesktopNotificationBackend::desktopNotificationClosed(uint id, uint reason) void DesktopNotificationBackend::desktopNotificationInvoked(uint id, const QString & action) { Q_UNUSED(id); Q_UNUSED(action); + emit activated(); } SettingsPage *DesktopNotificationBackend::createConfigWidget() const { diff --git a/src/qtui/knotificationbackend.cpp b/src/qtui/knotificationbackend.cpp index c55bf31c..baf0f150 100644 --- a/src/qtui/knotificationbackend.cpp +++ b/src/qtui/knotificationbackend.cpp @@ -38,14 +38,19 @@ KNotificationBackend::KNotificationBackend(QObject *parent) : AbstractNotificati void KNotificationBackend::notify(const Notification &n) { //QString title = Client::networkModel()->networkName(n.bufferId) + " - " + Client::networkModel()->bufferName(n.bufferId); QString message = QString("<%1> %2").arg(n.sender, n.message); - KNotification::event("Highlight", message, DesktopIcon("dialog-information"), QtUi::mainWindow(), - KNotification::Persistent|KNotification::RaiseWidgetOnActivation|KNotification::CloseWhenWidgetActivated); + KNotification *notification = KNotification::event("Highlight", message, DesktopIcon("dialog-information"), QtUi::mainWindow(), + KNotification::Persistent|KNotification::RaiseWidgetOnActivation|KNotification::CloseWhenWidgetActivated); + connect(notification, SIGNAL(activated()), SLOT(notificationActivated())); } void KNotificationBackend::close(uint notificationId) { Q_UNUSED(notificationId); } +void KNotificationBackend::notificationActivated() { + emit activated(); +} + SettingsPage *KNotificationBackend::createConfigWidget() const { return new ConfigWidget(); } diff --git a/src/qtui/knotificationbackend.h b/src/qtui/knotificationbackend.h index 706478e6..98c42d98 100644 --- a/src/qtui/knotificationbackend.h +++ b/src/qtui/knotificationbackend.h @@ -37,6 +37,9 @@ public: void close(uint notificationId); virtual SettingsPage *createConfigWidget() const; +private slots: + void notificationActivated(); + private: class ConfigWidget; }; diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 01fb3b75..e7205af9 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -116,20 +116,6 @@ MainWin::MainWin(QWidget *parent) installEventFilter(new JumpKeyHandler(this)); -#ifndef HAVE_KDE - QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); - QtUi::registerNotificationBackend(new SystrayNotificationBackend(this)); -# ifdef HAVE_PHONON - QtUi::registerNotificationBackend(new PhononNotificationBackend(this)); -# endif -# ifdef HAVE_DBUS - QtUi::registerNotificationBackend(new DesktopNotificationBackend(this)); -# endif - -#else /* HAVE_KDE */ - QtUi::registerNotificationBackend(new KNotificationBackend(this)); -#endif /* HAVE_KDE */ - QtUiApplication* app = qobject_cast qApp; connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&))); connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&))); @@ -166,6 +152,20 @@ void MainWin::init() { setupSystray(); setupTitleSetter(); +#ifndef HAVE_KDE + QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); + QtUi::registerNotificationBackend(new SystrayNotificationBackend(this)); +# ifdef HAVE_PHONON + QtUi::registerNotificationBackend(new PhononNotificationBackend(this)); +# endif +# ifdef HAVE_DBUS + QtUi::registerNotificationBackend(new DesktopNotificationBackend(this)); +# endif + +#else /* HAVE_KDE */ + QtUi::registerNotificationBackend(new KNotificationBackend(this)); +#endif /* HAVE_KDE */ + // restore mainwin state restoreState(s.value("MainWinState").toByteArray()); diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index 1b513a76..231bbf4b 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -32,16 +32,18 @@ #include "util.h" QHash QtUi::_actionCollections; +QPointer QtUi::_instance = 0; QPointer QtUi::_mainWin = 0; QList QtUi::_notificationBackends; QList QtUi::_notifications; QtUiStyle *QtUi::_style = 0; QtUi::QtUi() : AbstractUi() { - if(_style != 0) { + if(_instance != 0) { qWarning() << "QtUi has been instantiated again!"; return; } + _instance = this; _actionProvider = new NetworkModelActionProvider(this); @@ -93,6 +95,7 @@ void QtUi::disconnectedFromCore() { void QtUi::registerNotificationBackend(AbstractNotificationBackend *backend) { if(!_notificationBackends.contains(backend)) { _notificationBackends.append(backend); + instance()->connect(backend, SIGNAL(activated()), SLOT(notificationActivated())); } } @@ -147,3 +150,8 @@ const QList &QtUi::activeNotification return _notifications; } +void QtUi::notificationActivated() { + // this might not work with some window managers + _mainWin->raise(); + _mainWin->activateWindow(); +} diff --git a/src/qtui/qtui.h b/src/qtui/qtui.h index 9a00ef4e..af267cad 100644 --- a/src/qtui/qtui.h +++ b/src/qtui/qtui.h @@ -46,6 +46,7 @@ public: MessageModel *createMessageModel(QObject *parent); AbstractMessageProcessor *createMessageProcessor(QObject *parent); + inline static QtUi *instance(); inline static QtUiStyle *style(); inline static MainWin *mainWindow(); @@ -75,10 +76,12 @@ public slots: protected slots: void connectedToCore(); void disconnectedFromCore(); + void notificationActivated(); private: AbstractActionProvider *_actionProvider; + static QPointer _instance; static QPointer _mainWin; static QHash _actionCollections; static QtUiStyle *_style; @@ -86,6 +89,7 @@ private: static QList _notifications; }; +QtUi *QtUi::instance() { return _instance ? _instance.data() : new QtUi(); } QtUiStyle *QtUi::style() { return _style; } MainWin *QtUi::mainWindow() { return _mainWin; } AbstractActionProvider *QtUi::actionProvider() const { return _actionProvider; } diff --git a/src/qtui/systraynotificationbackend.cpp b/src/qtui/systraynotificationbackend.cpp index e9929805..f761e251 100644 --- a/src/qtui/systraynotificationbackend.cpp +++ b/src/qtui/systraynotificationbackend.cpp @@ -41,6 +41,7 @@ SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent) _iconActive = false; connect(&_animationTimer, SIGNAL(timeout()), SLOT(blink())); + connect(QtUi::mainWindow()->systemTrayIcon(), SIGNAL(messageClicked()), this, SIGNAL(activated())); } void SystrayNotificationBackend::notify(const Notification ¬ification) { diff --git a/src/uisupport/abstractnotificationbackend.h b/src/uisupport/abstractnotificationbackend.h index 982855ff..8e95c918 100644 --- a/src/uisupport/abstractnotificationbackend.h +++ b/src/uisupport/abstractnotificationbackend.h @@ -54,6 +54,11 @@ public: * In case you need to communicate with the configWidget directly, make your connections here */ virtual SettingsPage *createConfigWidget() const = 0; + +signals: + //! May be emitted by the notification to tell the MainWin to raise itself + void activated(); + }; #endif