only a backend can close a notification

This commit is contained in:
Patrick von Reth 2013-07-04 11:25:28 +02:00
parent 7e7173637b
commit 70c7e8a980
21 changed files with 202 additions and 108 deletions

View File

@ -0,0 +1,48 @@
/****************************************************************************************
* Copyright (c) 2013 Patrick von Reth <vonreth@kde.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) any later *
* version. *
* *
* 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, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef NOTIFICATIONENUMS_H
#define NOTIFICATIONENUMS_H
#include <QFlags>
namespace Snore{
namespace NotificationEnums{
namespace Prioritys{
enum priority{
LOW = -1,
NORMAL = 0,
HIGH = +1
};
Q_DECLARE_FLAGS(prioritys, priority)
Q_DECLARE_OPERATORS_FOR_FLAGS(prioritys)
}
namespace CloseReasons{
enum closeReason
{
NONE,
TIMED_OUT,
DISMISSED,
CLOSED
};
Q_DECLARE_FLAGS(closeReasons, closeReason)
Q_DECLARE_OPERATORS_FOR_FLAGS(closeReasons)
}
}
}
#endif // NOTIFICATIONENUMS_H

View File

@ -19,33 +19,11 @@
#include "../snore_exports.h"
#include "icon.h"
#include "NotificationEnums.h"
#include <QVariant>
namespace Snore{
namespace NotificationEnums{
namespace Prioritys{
enum priority{
LOW = -1,
NORMAL = 0,
HIGH = +1
};
Q_DECLARE_FLAGS(prioritys, priority)
Q_DECLARE_OPERATORS_FOR_FLAGS(prioritys)
}
namespace CloseReasons{
enum closeReason
{
NONE,
TIMED_OUT,
DISMISSED,
CLOSED
};
Q_DECLARE_FLAGS(closeReasons, closeReason)
Q_DECLARE_OPERATORS_FOR_FLAGS(closeReasons)
}
}
class SNORE_EXPORT Notification
{
public:
@ -70,12 +48,10 @@ public:
QString toString() const;
const uint &id() const;
void setId(const uint &id);
//timeout in seconds
//0 means sticky
const int &timeout() const;
void setActionInvoked ( Action *action );
void setActionInvoked ( const int &actionID);
const Action* actionInvoked() const;
void setSource(class SnoreFrontend *source)const;
class SnoreFrontend *source() const;
@ -99,12 +75,18 @@ public:
const QObject *data() const;
//protected://TODO::make only accesable from a backend
void setActionInvoked ( Action *action );
void setActionInvoked ( const int &actionID);
void setId(const uint &id);
private:
class NotificationData;
NotificationData* d;
static int notificationCount;
static int notificationMetaID;
};
}

View File

@ -84,7 +84,7 @@ void SnorePlugin::notificationTimedOut(){
m_timeouts.take(id)->deleteLater();
Notification n = snore()->getActiveNotificationByID(id);
if(n.isValid()){
snore()->closeNotification(n,NotificationEnums::CloseReasons::TIMED_OUT);
snore()->requestCloseNotification(n,NotificationEnums::CloseReasons::TIMED_OUT);
}
}

View File

@ -17,10 +17,10 @@
#ifndef SNORE_PLUGINS_H
#define SNORE_PLUGINS_H
#include "../snore_exports.h"
#include "../notification/notification.h"
#include <QPointer>
#include <QFlag>
#include <QHash>
#include <QTimer>
namespace Snore{
class Application;

View File

@ -17,6 +17,7 @@
#include "snorebackend.h"
#include "../snore.h"
#include "../application.h"
#include "../notification/notification.h"
#include <QTimer>
#include <QPluginLoader>
@ -41,17 +42,34 @@ bool SnoreBackend::init( SnoreCore *snore )
{
if(!SnorePlugin::init(snore))
return false;
connect( snore,SIGNAL( closeNotify( Snore::Notification ) ),this,SLOT( closeNotification( Snore::Notification) ) );
connect( snore,SIGNAL( applicationInitialized( Snore::Application* ) ),this,SLOT( registerApplication( Snore::Application* ) ) );
connect( snore,SIGNAL( applicationRemoved( Snore::Application* ) ),this,SLOT( unregisterApplication( Snore::Application* ) ) );
connect( snore,SIGNAL( applicationInitialized( Snore::Application* ) ),this,SLOT( slotRegisterApplication( Snore::Application* ) ) );
connect( snore,SIGNAL( applicationRemoved( Snore::Application* ) ),this,SLOT( slotUnregisterApplication( Snore::Application* ) ) );
foreach(Application *a,snore->aplications()){
this->registerApplication(a);
this->slotRegisterApplication(a);
}
return true;
}
bool SnoreBackend::requestCloseNotification ( Notification notification,NotificationEnums::CloseReasons::closeReasons reason )
{
if(slotCloseNotification(notification))
{
notification.setCloseReason(reason);
return true;
}
return false;
}
void SnoreBackend::closeNotification(Notification n, NotificationEnums::CloseReasons::closeReasons reason)
{
m_activeNotifications.remove(n.id());
n.setCloseReason(reason);
emit closeNotification(n);
}
SnoreSecondaryBackend::SnoreSecondaryBackend(const QString &name)
:SnoreBackend(name)
{
@ -65,9 +83,20 @@ SnoreSecondaryBackend::~SnoreSecondaryBackend()
bool SnoreSecondaryBackend::init(SnoreCore *snore)
{
connect( snore,SIGNAL( notify(SnoreCore::Notification) ),this,SLOT( notify( SnoreCore::Notification ) ) );
connect( snore,SIGNAL( slotNotify(SnoreCore::Notification) ),this,SLOT( slotNotify( SnoreCore::Notification ) ) );
return SnoreBackend::init(snore);
}
Snore::Notification SnoreBackend::getActiveNotificationByID(uint id)
{
return m_activeNotifications[id];
}
void SnoreBackend::addActiveNotification(Notification n)
{
m_activeNotifications[n.id()] = n;
}
}
#include "snorebackend.moc"

View File

@ -17,8 +17,8 @@
#ifndef SNORE_BACKEND_H
#define SNORE_BACKEND_H
#include "../snore_exports.h"
#include "../notification/notification.h"
#include "plugins.h"
#include "../notification/notification.h"
#include <QPointer>
#include <QFlag>
@ -27,7 +27,7 @@
namespace Snore{
class SnoreCore;
class SNORE_EXPORT SnoreBackend:public SnorePlugin
class SNORE_EXPORT SnoreBackend : public SnorePlugin
{
Q_OBJECT
Q_INTERFACES(Snore::SnorePlugin)
@ -36,13 +36,27 @@ public:
virtual ~SnoreBackend();
virtual bool init(SnoreCore *snore);
bool requestCloseNotification( Snore::Notification notification,NotificationEnums::CloseReasons::closeReasons reason );
Snore::Notification getActiveNotificationByID(uint id);
void addActiveNotification(Notification n);
signals:
void closeNotification( Snore::Notification );
public slots:
virtual void registerApplication ( Snore::Application *application ) = 0;
virtual void unregisterApplication ( Snore::Application *application ) = 0;
virtual uint notify ( Snore::Notification notification ) = 0;
virtual void closeNotification ( Snore::Notification notification ) =0;
virtual void slotRegisterApplication ( Snore::Application *application ) = 0;
virtual void slotUnregisterApplication ( Snore::Application *application ) = 0;
virtual uint slotNotify ( Snore::Notification notification ) = 0;
virtual bool slotCloseNotification ( Snore::Notification notification ) =0;
protected:
void closeNotification(Snore::Notification,Snore::NotificationEnums::CloseReasons::closeReasons);
private:
QHash<uint,Notification> m_activeNotifications;

View File

@ -39,7 +39,7 @@ bool SnoreFrontend::init( SnoreCore *snore )
{
if(!SnorePlugin::init(snore))
return false;
connect( snore,SIGNAL ( closeNotify( Snore::Notification ) ),this,SLOT ( notificationClosed( Snore::Notification) ) );
connect( snore,SIGNAL ( notificationClosed( Snore::Notification ) ),this,SLOT ( notificationClosed( Snore::Notification) ) );
return true;
}
}

View File

@ -46,6 +46,11 @@ QSettings *SnoreCore::cacheFile(){
#endif
}
void SnoreCore::slotNotificationClosed(Notification n)
{
emit notificationClosed(n);
}
QString const SnoreCore::version(){
static QString ver(QString().append(Version::major()).append(".").append(Version::minor()).append(Version::suffix()));
return ver;
@ -223,19 +228,13 @@ uint SnoreCore::broadcastNotification ( Notification notification )
qDebug()<<"Notification backend "<<m_notificationBackend<<" isnt initialized will snore will exit now";
qApp->quit();
}
notification.setId(m_notificationBackend->notify( notification ));
m_activeNotifications[notification.id()] = notification;
m_notificationBackend->slotNotify( notification );
m_notificationBackend->addActiveNotification(notification);
return notification.id();
}
return -1;
}
void SnoreCore::closeNotification ( Notification notification,const NotificationEnums::CloseReasons::closeReasons &reason )
{
notification.setCloseReason(reason);
m_activeNotifications.remove(notification.id());
emit closeNotify ( notification );
}
void SnoreCore::notificationActionInvoked ( Notification notification )
{
@ -299,8 +298,10 @@ void SnoreCore::setPrimaryNotificationBackend ( const QString &backend )
qDebug()<<"Failed to initialize"<<b->name();
return;
}
connect(b,SIGNAL(closeNotification(Snore::Notification)),this,SLOT(slotNotificationClosed(Snore::Notification)));
}
m_notificationBackend = b;
}
@ -318,7 +319,19 @@ QSystemTrayIcon *SnoreCore::trayIcon(){
Notification SnoreCore::getActiveNotificationByID(uint id)
{
return m_activeNotifications[id];
if(!m_notificationBackend->isInitialized()){
qDebug()<<"Notification backend "<<m_notificationBackend<<" isn't initialized will snore will exit now";
qApp->quit();
}
return m_notificationBackend->getActiveNotificationByID(id);
}
void SnoreCore::requestCloseNotification(Notification n, NotificationEnums::CloseReasons::closeReasons r)
{
if(m_notificationBackend->requestCloseNotification(n,r))
{
emit notificationClosed(n);
}
}
}

View File

@ -46,7 +46,6 @@ public:
uint broadcastNotification ( Notification notification );
void closeNotification ( Notification notification, const NotificationEnums::CloseReasons::closeReasons &reason );
void notificationActionInvoked ( Notification notification );
void addApplication ( Application *application );
@ -64,6 +63,9 @@ public:
Notification getActiveNotificationByID(uint id);
void requestCloseNotification(Notification,NotificationEnums::CloseReasons::closeReasons);
private:
@ -74,7 +76,6 @@ private:
static QDir *s_pluginDir;
ApplicationsList m_applications;
QHash<uint,Notification> m_activeNotifications;
QStringList m_notificationBackends;
@ -92,7 +93,10 @@ signals:
void applicationRemoved( Snore::Application* );
void notify( Snore::Notification noti );
void actionInvoked( Snore::Notification );
void closeNotify( Snore::Notification );
void notificationClosed(Snore::Notification );
private slots:
void slotNotificationClosed(Snore::Notification);
};

View File

@ -13,7 +13,8 @@ if( WITH_GROWL_BACKEND )
if(MINGW)
#fiexes a multiple defenition error with static boost
SET_TARGET_PROPERTIES(growl PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition)
SET_TARGET_PROPERTIES(growl PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition COMPILE_FLAGS
"-Wno-undef -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-local-typedefs -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-reorder -Wno-unused-variable -Wno-unused-function" )
endif(MINGW)
if(WIN32)

View File

@ -38,12 +38,12 @@ Growl::Growl():
Growl::~Growl(){
if(snore() != NULL){
foreach(Application *a,snore()->aplications()){
this->unregisterApplication(a);
this->slotUnregisterApplication(a);
}
}
}
void Growl::registerApplication(Application *application){
void Growl::slotRegisterApplication(Application *application){
gntp *growl = new gntp(application->name().toUtf8().constData(),application->icon().localUrl().toUtf8().constData());
@ -62,14 +62,14 @@ void Growl::registerApplication(Application *application){
m_applications.insert(application->name(),growl);
}
void Growl::unregisterApplication(Application *application){
void Growl::slotUnregisterApplication(Application *application){
gntp *growl = m_applications.take(application->name());
if(growl == NULL)
return;
delete growl;
}
uint Growl::notify(Notification notification){
uint Growl::slotNotify(Notification notification){
gntp *growl = m_applications.value(notification.application());
if(growl == NULL)
return -1;
@ -86,8 +86,9 @@ uint Growl::notify(Notification notification){
return m_id++;
}
void Growl::closeNotification(Notification notification){
bool Growl::slotCloseNotification(Notification notification){
Q_UNUSED(notification);
return false;
}
void Growl::gntpCallback(const int &id,const std::string &reason,const std::string &data){
@ -103,7 +104,7 @@ void Growl::gntpCallback(const int &id,const std::string &reason,const std::stri
n.setActionInvoked(QString(data.c_str()).toInt());
s_instance->snore()->notificationActionInvoked(n);
}
s_instance->snore()->closeNotification(n,r);
s_instance->closeNotification(n,r);
}

View File

@ -36,10 +36,10 @@ private:
QHash<QString,class gntp*> m_applications;
public slots:
void registerApplication(Snore::Application *application);
void unregisterApplication(Snore::Application *application);
uint notify(Snore::Notification notification);
void closeNotification(Snore::Notification notification);
void slotRegisterApplication(Snore::Application *application);
void slotUnregisterApplication(Snore::Application *application);
uint slotNotify(Snore::Notification notification);
bool slotCloseNotification(Snore::Notification notification);
};

View File

@ -1,12 +1,17 @@
if(WIN32)
message(STATUS "Adding Snarl notification backend")
set( SNARL_SRC
SnarlInterface.cpp
snarl.cpp
)
add_library(snarl MODULE ${SNARL_SRC} )
target_link_libraries(snarl snorecore ${QT_QTCORE_LIBRARY} )
if(MINGW)
set_target_properties(snarl PROPERTIES COMPILE_FLAGS "-Wno-conversion-null")
endif(MINGW)
install(TARGETS snarl ${SNORE_BACKEND_INSTALL_PATH})

View File

@ -1,7 +1,7 @@
#ifndef SNARL_INTERFACE_V42_H
#define SNARL_INTERFACE_V42_H
#ifdef __MINGW32__
#if defined(__MINGW32__) && !defined(MINGW_HAS_SECURE_API)
#define MINGW_HAS_SECURE_API
#endif

View File

@ -51,7 +51,7 @@ public:
int action = msg->wParam;
if(action == SnarlEnums::SnarlLaunched){
foreach(Application *a,m_snarl->snore()->aplications()){
m_snarl->registerApplication(a);
m_snarl->slotRegisterApplication(a);
}
}
@ -88,7 +88,7 @@ public:
qDebug()<<"Unknown snarl action found!!";
return false;
}
m_snarl->snore()->closeNotification(notification,reason);
m_snarl->closeNotification(notification,reason);
return true;
}
return false;
@ -112,7 +112,7 @@ SnarlBackend::~SnarlBackend()
{
if(snore() != NULL){
foreach(Application *a,snore()->aplications()){
this->unregisterApplication(a);
this->slotUnregisterApplication(a);
}
}
if(m_defautSnarlinetrface)
@ -130,7 +130,7 @@ bool SnarlBackend::init(SnoreCore *snore){
return SnoreBackend::init(snore);
}
void SnarlBackend::registerApplication(Application *application){
void SnarlBackend::slotRegisterApplication(Application *application){
SnarlInterface *snarlInterface = NULL;
if(m_applications.contains(application->name())){
snarlInterface = m_applications.value(application->name());
@ -154,7 +154,7 @@ void SnarlBackend::registerApplication(Application *application){
}
}
void SnarlBackend::unregisterApplication(Application *application){
void SnarlBackend::slotUnregisterApplication(Application *application){
SnarlInterface *snarlInterface = m_applications.take(application->name());
if(snarlInterface == NULL)
return;
@ -164,7 +164,7 @@ void SnarlBackend::unregisterApplication(Application *application){
delete snarlInterface;
}
uint SnarlBackend::notify(Notification notification){
uint SnarlBackend::slotNotify(Notification notification){
SnarlInterface *snarlInterface = m_applications.value(notification.application());
if(snarlInterface == NULL){
qDebug()<<notification.application()<<"not in snarl interfaces, defaulting";
@ -200,8 +200,9 @@ uint SnarlBackend::notify(Notification notification){
return id;
}
void SnarlBackend::closeNotification(Notification notification){
bool SnarlBackend::slotCloseNotification(Notification notification){
m_defautSnarlinetrface->Hide(notification.id());
return true;
}
#include "snarl.moc"

View File

@ -37,10 +37,10 @@ private:
Snarl::V42::SnarlInterface* m_defautSnarlinetrface;
public slots:
void registerApplication(Snore::Application *application);
void unregisterApplication(Snore::Application *application);
uint notify(Snore::Notification notification);
void closeNotification(Snore::Notification notification);
void slotRegisterApplication(Snore::Application *application);
void slotUnregisterApplication(Snore::Application *application);
uint slotNotify(Snore::Notification notification);
bool slotCloseNotification(Snore::Notification notification);
};

View File

@ -49,17 +49,17 @@ bool SnoreToast::init(SnoreCore *snore)
return SnoreBackend::init(snore);
}
void SnoreToast::registerApplication(Application *application)
void SnoreToast::slotRegisterApplication(Application *application)
{
Q_UNUSED(application)
}
void SnoreToast::unregisterApplication(Application *application)
void SnoreToast::slotUnregisterApplication(Application *application)
{
Q_UNUSED(application)
}
uint SnoreToast::notify(Notification notification)
uint SnoreToast::slotNotify(Notification notification)
{
QProcess *p = new QProcess(this);
@ -87,9 +87,10 @@ uint SnoreToast::notify(Notification notification)
}
void SnoreToast::closeNotification(Notification notification)
bool SnoreToast::slotCloseNotification(Notification notification)
{
Q_UNUSED(notification)
return false;
}
void SnoreToast::slotToastNotificationClosed(int code, QProcess::ExitStatus)
@ -123,7 +124,7 @@ void SnoreToast::slotToastNotificationClosed(int code, QProcess::ExitStatus)
break;
}
snore()->closeNotification(n,reason);
closeNotification(n,reason);
}

View File

@ -15,10 +15,10 @@ public:
// SnoreBackend interface
public slots:
void registerApplication(Snore::Application *application);
void unregisterApplication(Snore::Application *application);
uint notify(Snore::Notification notification);
void closeNotification(Snore::Notification notification);
void slotRegisterApplication(Snore::Application *application);
void slotUnregisterApplication(Snore::Application *application);
uint slotNotify(Snore::Notification notification);
bool slotCloseNotification(Snore::Notification notification);
private slots:
void slotToastNotificationClosed(int code, QProcess::ExitStatus);

View File

@ -12,9 +12,9 @@ Q_EXPORT_PLUGIN2(trayicon,TrayIconNotifer)
TrayIconNotifer::TrayIconNotifer () :
SnoreBackend ( "SystemTray" ),
m_trayIcon(NULL),
m_id ( 0 ),
m_displayed(-1),
m_trayIcon(NULL)
m_displayed(-1)
{
}
@ -27,16 +27,16 @@ bool TrayIconNotifer::init(SnoreCore *snore){
return SnoreBackend::init(snore);
}
void TrayIconNotifer::registerApplication ( Application *application )
void TrayIconNotifer::slotRegisterApplication ( Application *application )
{
Q_UNUSED ( application )
}
void TrayIconNotifer::unregisterApplication ( Application *application )
void TrayIconNotifer::slotUnregisterApplication ( Application *application )
{
Q_UNUSED ( application )
}
uint TrayIconNotifer::notify ( Notification notification )
uint TrayIconNotifer::slotNotify ( Notification notification )
{
m_notificationQue.append(notification);
if(m_lastNotify.elapsed()> Notification::DefaultTimeout * 1000){
@ -45,21 +45,17 @@ uint TrayIconNotifer::notify ( Notification notification )
return m_id++;
}
void TrayIconNotifer::closeNotification ( Notification notification )
bool TrayIconNotifer::slotCloseNotification( Notification notification )
{
Q_UNUSED ( notification )
}
bool TrayIconNotifer::isPrimaryNotificationBackend()
{
return true;
return false;
}
void TrayIconNotifer::displayNotification(){
qDebug()<<"Display"<<m_notificationQue.size();
Notification notification = m_notificationQue.takeFirst();
if(!m_notificationQue.isEmpty()){
QTimer::singleShot(notification.timeout()*1000,this,SLOT(closeNotification()));
QTimer::singleShot(notification.timeout()*1000,this,SLOT(slotCloseNotification()));
}
qDebug()<<"taking"<<notification.title();
@ -68,10 +64,10 @@ void TrayIconNotifer::displayNotification(){
m_lastNotify.restart();
}
void TrayIconNotifer::closeNotification(){
void TrayIconNotifer::slotCloseNotification(){
Notification n = snore()->getActiveNotificationByID(m_displayed);
if(n.isValid()){
snore()->closeNotification(n,NotificationEnums::CloseReasons::TIMED_OUT);
closeNotification(n,NotificationEnums::CloseReasons::TIMED_OUT);
}
displayNotification();
}
@ -85,7 +81,7 @@ void TrayIconNotifer::actionInvoked(){
n.setActionInvoked(n.actions().keys().first());
snore()->notificationActionInvoked(n);
}
snore()->closeNotification(n,NotificationEnums::CloseReasons::CLOSED);
closeNotification(n,NotificationEnums::CloseReasons::CLOSED);
}

View File

@ -18,13 +18,12 @@ class TrayIconNotifer:public Snore::SnoreBackend
public:
TrayIconNotifer ();
virtual bool init(Snore::SnoreCore *snore);
bool isPrimaryNotificationBackend();
public slots:
void registerApplication ( Snore::Application *application );
void unregisterApplication ( Snore::Application *application );
uint notify ( Snore::Notification notification );
void closeNotification ( Snore::Notification notification );
void slotRegisterApplication ( Snore::Application *application );
void slotUnregisterApplication ( Snore::Application *application );
uint slotNotify ( Snore::Notification notification );
bool slotCloseNotification ( Snore::Notification notification );
private:
QSystemTrayIcon *m_trayIcon;
@ -36,7 +35,7 @@ private:
private slots:
void displayNotification();
void actionInvoked();
void closeNotification();
void slotCloseNotification();
};
#endif // TRAYICONNOTIFER_H

View File

@ -107,7 +107,7 @@ void FreedesktopFrontend::CloseNotification(uint id){
Notification noti = snore()->getActiveNotificationByID(id);
if(noti.isValid())
{
snore()->closeNotification(noti,NotificationEnums::CloseReasons::TIMED_OUT);
snore()->requestCloseNotification(noti,NotificationEnums::CloseReasons::TIMED_OUT);
}
}