Code reformatted using kde-dev-scripts/astyle-kdelibs
This commit is contained in:
parent
e613f1de73
commit
0d46672737
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -26,7 +25,7 @@ Alert::Alert() :
|
|||
d(NULL)
|
||||
{}
|
||||
|
||||
Alert::Alert (const QString &name, const Icon &icon, bool active):
|
||||
Alert::Alert(const QString &name, const Icon &icon, bool active):
|
||||
d(new AlertData(name, icon, active))
|
||||
{}
|
||||
|
||||
|
@ -67,15 +66,11 @@ bool Alert::isValid() const
|
|||
return d;
|
||||
}
|
||||
|
||||
|
||||
QDebug operator<<(QDebug debug, const Alert &alert)
|
||||
{
|
||||
if(alert.isValid())
|
||||
{
|
||||
if (alert.isValid()) {
|
||||
debug << "Snore::Alert(" << alert.name() << ")" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
debug << "Snore::Alert(0x00)" ;
|
||||
}
|
||||
return debug.maybeSpace();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -49,7 +48,7 @@ public:
|
|||
* @todo is isActive of any use?
|
||||
*/
|
||||
|
||||
explicit Alert(const QString &name, const Icon &icon, bool active = true );
|
||||
explicit Alert(const QString &name, const Icon &icon, bool active = true);
|
||||
/**
|
||||
* Creates a copy of other
|
||||
* @param other
|
||||
|
@ -92,7 +91,6 @@ private:
|
|||
};
|
||||
}
|
||||
|
||||
QDebug SNORE_EXPORT operator<< ( QDebug debug, const Snore::Alert &alert );
|
||||
|
||||
QDebug SNORE_EXPORT operator<< (QDebug debug, const Snore::Alert &alert);
|
||||
|
||||
#endif // ALERT_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -20,15 +19,14 @@
|
|||
#include "application.h"
|
||||
#include "application_p.h"
|
||||
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
Application::Application():
|
||||
d(NULL)
|
||||
{}
|
||||
|
||||
Application::Application (const QString &name, const Icon &icon) :
|
||||
d(new ApplicationData(name,icon))
|
||||
Application::Application(const QString &name, const Icon &icon) :
|
||||
d(new ApplicationData(name, icon))
|
||||
|
||||
{
|
||||
}
|
||||
|
@ -84,19 +82,15 @@ const Hint &Application::constHints() const
|
|||
return d->m_hint;
|
||||
}
|
||||
|
||||
QDebug operator<< ( QDebug debug, const Snore::Application &app )
|
||||
QDebug operator<< (QDebug debug, const Snore::Application &app)
|
||||
{
|
||||
if(app.isValid())
|
||||
{
|
||||
if (app.isValid()) {
|
||||
debug << "Snore::Application(" << app.name() << ", ";
|
||||
foreach(const Alert &a, app.alerts())
|
||||
{
|
||||
foreach(const Alert & a, app.alerts()) {
|
||||
debug << a << ", ";
|
||||
}
|
||||
debug << ")" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
debug << "Snore::Application(0x00)" ;
|
||||
}
|
||||
return debug.maybeSpace();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -25,7 +24,8 @@
|
|||
#include "alert.h"
|
||||
|
||||
#include <QHash>
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
class ApplicationData;
|
||||
|
||||
|
@ -47,7 +47,7 @@ public:
|
|||
* @param icon
|
||||
* @see SnoreCore::registerApplication
|
||||
*/
|
||||
explicit Application ( const QString &name, const Icon &icon);
|
||||
explicit Application(const QString &name, const Icon &icon);
|
||||
|
||||
/**
|
||||
* The copy constructor
|
||||
|
@ -84,7 +84,7 @@ public:
|
|||
/**
|
||||
* Returns a QHash with the Alers registered with this Application
|
||||
*/
|
||||
const QHash<QString,Alert> &alerts() const;
|
||||
const QHash<QString, Alert> &alerts() const;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -108,16 +108,13 @@ public:
|
|||
const Hint &constHints() const;
|
||||
|
||||
private:
|
||||
QExplicitlySharedDataPointer<ApplicationData> d;
|
||||
|
||||
QExplicitlySharedDataPointer<ApplicationData> d;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
Q_DECLARE_METATYPE(Snore::Application)
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug debug, const Snore::Application &app );
|
||||
|
||||
|
||||
SNORE_EXPORT QDebug operator<< (QDebug debug, const Snore::Application &app);
|
||||
|
||||
#endif // APPLICATION_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -25,7 +24,7 @@ ApplicationData::ApplicationData(const QString &name, const Icon &icon):
|
|||
m_name(name),
|
||||
m_icon(icon)
|
||||
{
|
||||
Q_ASSERT_X(!name.isEmpty(),Q_FUNC_INFO, "invalid name detected");
|
||||
Q_ASSERT_X(!name.isEmpty(), Q_FUNC_INFO, "invalid name detected");
|
||||
}
|
||||
|
||||
ApplicationData::~ApplicationData()
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -35,7 +34,7 @@ public:
|
|||
|
||||
QString m_name;
|
||||
Icon m_icon;
|
||||
QHash<QString,Alert> m_alerts;
|
||||
QHash<QString, Alert> m_alerts;
|
||||
Hint m_hint;
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -33,19 +32,16 @@ void Hint::setValue(const QString &key, const QVariant &value)
|
|||
void Hint::setValue(const QString &key, QObject *value)
|
||||
{
|
||||
m_data.insert(key.toLower(), qVariantFromValue(value));
|
||||
value->setProperty("hint_key",key.toLower());
|
||||
connect(value, SIGNAL(destroyed()), this, SLOT(slotValueDestroyed()),Qt::DirectConnection );
|
||||
value->setProperty("hint_key", key.toLower());
|
||||
connect(value, SIGNAL(destroyed()), this, SLOT(slotValueDestroyed()), Qt::DirectConnection);
|
||||
}
|
||||
|
||||
QVariant Hint::value(const QString &k, const QVariant &defaultValue) const
|
||||
{
|
||||
QString key(k.toLower());
|
||||
if(m_data.contains(key))
|
||||
{
|
||||
if (m_data.contains(key)) {
|
||||
return m_data.value(key);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
@ -57,70 +53,58 @@ bool Hint::contains(const QString &key) const
|
|||
|
||||
void Hint::setPrivateValue(const void *owner, const QString &key, const QVariant &value) const
|
||||
{
|
||||
QPair<quintptr,QString> pk((quintptr)owner,key.toLower());
|
||||
QPair<quintptr, QString> pk((quintptr)owner, key.toLower());
|
||||
m_privateData.insert(pk, value);
|
||||
}
|
||||
|
||||
void Hint::setPrivateValue(const void *owner, const QString &key, QObject *value) const
|
||||
{
|
||||
QPair<quintptr,QString> pk((quintptr)owner,key.toLower());
|
||||
QPair<quintptr, QString> pk((quintptr)owner, key.toLower());
|
||||
m_privateData.insert(pk, qVariantFromValue(value));
|
||||
value->setProperty("hint_key",key.toLower());
|
||||
value->setProperty("hint_owner",(quintptr)owner);
|
||||
value->setProperty("hint_key", key.toLower());
|
||||
value->setProperty("hint_owner", (quintptr)owner);
|
||||
connect(value, SIGNAL(destroyed()), this, SLOT(slotValueDestroyed()), Qt::DirectConnection);
|
||||
}
|
||||
|
||||
|
||||
QVariant Hint::privateValue(const void *owner, const QString &k, const QVariant &defaultValue) const
|
||||
{
|
||||
QPair<quintptr,QString> key((quintptr)owner, k.toLower());
|
||||
if(m_privateData.contains(key))
|
||||
{
|
||||
QPair<quintptr, QString> key((quintptr)owner, k.toLower());
|
||||
if (m_privateData.contains(key)) {
|
||||
return m_privateData.value(key);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Hint::containsPrivateValue(const void *owner, const QString &key) const
|
||||
{
|
||||
QPair<quintptr,QString> pk((quintptr)owner,key.toLower());
|
||||
QPair<quintptr, QString> pk((quintptr)owner, key.toLower());
|
||||
return m_privateData.contains(pk);
|
||||
}
|
||||
|
||||
void Hint::slotValueDestroyed()
|
||||
{
|
||||
QObject * o = sender();
|
||||
QObject *o = sender();
|
||||
QString key = o->property("hint_key").toString();
|
||||
if(!o->property("hint_owner").isNull())
|
||||
{
|
||||
QPair<quintptr,QString> pk(o->property("hint_owner").value<quintptr>(), key);
|
||||
if (!o->property("hint_owner").isNull()) {
|
||||
QPair<quintptr, QString> pk(o->property("hint_owner").value<quintptr>(), key);
|
||||
m_privateData.remove(pk);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_data.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
QDebug operator<<( QDebug debug, const Snore::Hint &hint )
|
||||
QDebug operator<<(QDebug debug, const Snore::Hint &hint)
|
||||
{
|
||||
debug << "Snore::Hint(";
|
||||
for(QVariantHash::const_iterator it = hint.m_data.constBegin();it != hint.m_data.constEnd();++it)
|
||||
{
|
||||
if(it != hint.m_data.constBegin())
|
||||
{
|
||||
for (QVariantHash::const_iterator it = hint.m_data.constBegin(); it != hint.m_data.constEnd(); ++it) {
|
||||
if (it != hint.m_data.constBegin()) {
|
||||
debug << ", ";
|
||||
}
|
||||
debug << "(" << it.key() << ", " << it.value();
|
||||
}
|
||||
for(QHash< QPair<quintptr, QString>, QVariant>::const_iterator it = hint.m_privateData.constBegin();it != hint.m_privateData.constEnd();++it)
|
||||
{
|
||||
if(it != hint.m_privateData.constBegin())
|
||||
{
|
||||
for (QHash< QPair<quintptr, QString>, QVariant>::const_iterator it = hint.m_privateData.constBegin(); it != hint.m_privateData.constEnd(); ++it) {
|
||||
if (it != hint.m_privateData.constBegin()) {
|
||||
debug << ", ";
|
||||
}
|
||||
debug << "(" << it.key() << ", " << it.value();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -30,7 +29,7 @@ namespace Snore
|
|||
class Hint;
|
||||
}
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::Hint &);
|
||||
SNORE_EXPORT QDebug operator<< (QDebug, const Snore::Hint &);
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
@ -64,14 +63,14 @@ public:
|
|||
* @param key the key
|
||||
* @param defaultValue the fallback value
|
||||
*/
|
||||
QVariant value(const QString & key, const QVariant & defaultValue = QVariant() ) const;
|
||||
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param key the key
|
||||
* @return whether the key is set
|
||||
*/
|
||||
bool contains ( const QString & key ) const;
|
||||
bool contains(const QString &key) const;
|
||||
|
||||
/**
|
||||
* Sets the value for the key depending on the owner
|
||||
|
@ -95,7 +94,7 @@ public:
|
|||
* @param key the key
|
||||
* @param defaultValue the fallback value
|
||||
*/
|
||||
QVariant privateValue(const void *owner, const QString & key, const QVariant & defaultValue = QVariant() ) const;
|
||||
QVariant privateValue(const void *owner, const QString &key, const QVariant &defaultValue = QVariant()) const;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -103,23 +102,19 @@ public:
|
|||
* @param key the key
|
||||
* @return whether the key is set
|
||||
*/
|
||||
bool containsPrivateValue(const void *owner, const QString & key ) const;
|
||||
bool containsPrivateValue(const void *owner, const QString &key) const;
|
||||
|
||||
private slots:
|
||||
void slotValueDestroyed();
|
||||
|
||||
private:
|
||||
QVariantHash m_data;
|
||||
mutable QHash<QPair<quintptr,QString>, QVariant> m_privateData;
|
||||
mutable QHash<QPair<quintptr, QString>, QVariant> m_privateData;
|
||||
|
||||
friend SNORE_EXPORT QDebug (::operator<<) ( QDebug, const Snore::Hint &);
|
||||
friend SNORE_EXPORT QDebug(::operator<<)(QDebug, const Snore::Hint &);
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // HINT_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -29,50 +28,43 @@ using namespace Snore;
|
|||
class Loger
|
||||
{
|
||||
public:
|
||||
static int s_debugLevel;
|
||||
static int s_debugLevel;
|
||||
|
||||
|
||||
|
||||
static inline int debugLvl()
|
||||
{
|
||||
if(s_debugLevel == -1)
|
||||
static inline int debugLvl()
|
||||
{
|
||||
s_debugLevel = qgetenv("LIBSNORE_DEBUG_LVL").toInt();
|
||||
}
|
||||
return s_debugLevel;
|
||||
}
|
||||
|
||||
static inline bool isLogToFileEnabled()
|
||||
{
|
||||
static int s_logToFile = -1;
|
||||
if(s_logToFile == -1)
|
||||
{
|
||||
s_logToFile = qgetenv("LIBSNORE_LOG_TO_FILE").toInt();
|
||||
}
|
||||
return s_logToFile == 1;
|
||||
}
|
||||
|
||||
static inline QTextStream &logFile()
|
||||
{
|
||||
static QTextStream *s_out = NULL;
|
||||
static QFile *s_file = NULL;
|
||||
if(!s_out)
|
||||
{
|
||||
QString name = QString("%1/libsnore/%2-log.txt").arg(QDir::tempPath(), qApp->applicationName().isEmpty()?QString::number(qApp->applicationPid()):qApp->applicationName());
|
||||
|
||||
if(!qgetenv("LIBSNORE_LOGFILE").isNull())
|
||||
{
|
||||
name = QString(qgetenv("LIBSNORE_LOGFILE"));
|
||||
if (s_debugLevel == -1) {
|
||||
s_debugLevel = qgetenv("LIBSNORE_DEBUG_LVL").toInt();
|
||||
}
|
||||
std::cout << "Started logging to " << name.toUtf8().constData() << std::endl;
|
||||
|
||||
s_file = new QFile(name);
|
||||
s_file->open(QFile::WriteOnly);
|
||||
s_out = new QTextStream(s_file);
|
||||
return s_debugLevel;
|
||||
}
|
||||
return *s_out;
|
||||
}
|
||||
|
||||
static inline bool isLogToFileEnabled()
|
||||
{
|
||||
static int s_logToFile = -1;
|
||||
if (s_logToFile == -1) {
|
||||
s_logToFile = qgetenv("LIBSNORE_LOG_TO_FILE").toInt();
|
||||
}
|
||||
return s_logToFile == 1;
|
||||
}
|
||||
|
||||
static inline QTextStream &logFile()
|
||||
{
|
||||
static QTextStream *s_out = NULL;
|
||||
static QFile *s_file = NULL;
|
||||
if (!s_out) {
|
||||
QString name = QString("%1/libsnore/%2-log.txt").arg(QDir::tempPath(), qApp->applicationName().isEmpty() ? QString::number(qApp->applicationPid()) : qApp->applicationName());
|
||||
|
||||
if (!qgetenv("LIBSNORE_LOGFILE").isNull()) {
|
||||
name = QString(qgetenv("LIBSNORE_LOGFILE"));
|
||||
}
|
||||
std::cout << "Started logging to " << name.toUtf8().constData() << std::endl;
|
||||
|
||||
s_file = new QFile(name);
|
||||
s_file->open(QFile::WriteOnly);
|
||||
s_out = new QTextStream(s_file);
|
||||
}
|
||||
return *s_out;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
@ -86,13 +78,11 @@ SnoreLog::SnoreLog(SnoreDebugLevels lvl):
|
|||
|
||||
SnoreLog::~SnoreLog()
|
||||
{
|
||||
if(Loger::isLogToFileEnabled())
|
||||
{
|
||||
if (Loger::isLogToFileEnabled()) {
|
||||
Loger::logFile() << m_msg << "\n";
|
||||
Loger::logFile().flush();
|
||||
}
|
||||
if(Loger::debugLvl() >= m_lvl)
|
||||
{
|
||||
if (Loger::debugLvl() >= m_lvl) {
|
||||
std::cout << m_msg.toLatin1().constData() << std::endl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -23,8 +22,6 @@
|
|||
#include <QDebug>
|
||||
#include "snore_exports.h"
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
|
@ -32,8 +29,7 @@
|
|||
/**
|
||||
* SnoreDebugLevels enumerates all possible debugg levels.
|
||||
*/
|
||||
enum SnoreDebugLevels
|
||||
{
|
||||
enum SnoreDebugLevels {
|
||||
/**
|
||||
* The most important messages, will be diplayed if the debug level >= 1
|
||||
*/
|
||||
|
@ -51,7 +47,6 @@ enum SnoreDebugLevels
|
|||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Logg macro use to logg messages.
|
||||
* snoreDebug( SNORE_DEBUG ) << "Message" << notification;
|
||||
|
@ -63,7 +58,6 @@ enum SnoreDebugLevels
|
|||
#define snoreDebug(X) QNoDebug()
|
||||
#endif
|
||||
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
|
@ -95,9 +89,6 @@ private:
|
|||
QString m_msg;
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // SNORELOG_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -28,9 +27,9 @@ using namespace Snore;
|
|||
QByteArray Icon::dataFromImage(const QImage &image)
|
||||
{
|
||||
QByteArray data;
|
||||
QBuffer buffer( &data );
|
||||
buffer.open( QBuffer::WriteOnly );
|
||||
image.save( &buffer, "PNG" );
|
||||
QBuffer buffer(&data);
|
||||
buffer.open(QBuffer::WriteOnly);
|
||||
image.save(&buffer, "PNG");
|
||||
return data;
|
||||
}
|
||||
|
||||
|
@ -65,7 +64,8 @@ Icon::~Icon()
|
|||
|
||||
}
|
||||
|
||||
const QImage &Icon::image() const{
|
||||
const QImage &Icon::image() const
|
||||
{
|
||||
return d->image();
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ bool Icon::isValid() const
|
|||
|
||||
Icon Icon::scaled(const QSize &s) const
|
||||
{
|
||||
return Icon(image().scaled(s,Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
return Icon(image().scaled(s, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
}
|
||||
|
||||
QString Icon::url() const
|
||||
|
@ -94,14 +94,13 @@ QString Icon::url() const
|
|||
return d->m_url;
|
||||
}
|
||||
|
||||
|
||||
bool Snore::Icon::isRemoteFile() const
|
||||
{
|
||||
return d->m_isRemoteFile;
|
||||
}
|
||||
|
||||
QDebug operator<< ( QDebug debug, const Snore::Icon &icon )
|
||||
QDebug operator<< (QDebug debug, const Snore::Icon &icon)
|
||||
{
|
||||
debug << "Snore::Icon(" << (icon.url().isEmpty()?icon.d->m_localUrl:icon.url()) << ")" ;
|
||||
debug << "Snore::Icon(" << (icon.url().isEmpty() ? icon.d->m_localUrl : icon.url()) << ")" ;
|
||||
return debug.maybeSpace();
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,11 +23,12 @@
|
|||
#include <QSharedData>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Snore{
|
||||
class Icon;
|
||||
namespace Snore
|
||||
{
|
||||
class Icon;
|
||||
}
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::Icon &);
|
||||
SNORE_EXPORT QDebug operator<< (QDebug, const Snore::Icon &);
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
@ -113,10 +113,8 @@ public:
|
|||
|
||||
private:
|
||||
QExplicitlySharedDataPointer<IconData> d;
|
||||
friend SNORE_EXPORT QDebug (::operator<<) ( QDebug, const Snore::Icon &);
|
||||
friend SNORE_EXPORT QDebug(::operator<<)(QDebug, const Snore::Icon &);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif // NOTIFICATION_ICON_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -35,8 +34,7 @@ IconData::IconData(const QString &url):
|
|||
m_isLocalFile(false),
|
||||
m_isResource(m_url.startsWith(":/") || m_url.startsWith("qrc:/"))
|
||||
{
|
||||
if(!m_isResource && QFile::exists(url))
|
||||
{
|
||||
if (!m_isResource && QFile::exists(url)) {
|
||||
m_isLocalFile = true;
|
||||
m_localUrl = url;
|
||||
}
|
||||
|
@ -61,14 +59,10 @@ IconData::~IconData()
|
|||
const QImage &IconData::image()
|
||||
{
|
||||
QMutexLocker lock(&m_mutex);
|
||||
if(m_img.isNull())
|
||||
{
|
||||
if(!m_isRemoteFile )
|
||||
{
|
||||
if (m_img.isNull()) {
|
||||
if (!m_isRemoteFile) {
|
||||
m_img = QImage(m_url);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
download();
|
||||
}
|
||||
}
|
||||
|
@ -77,45 +71,37 @@ const QImage &IconData::image()
|
|||
|
||||
QString IconData::localUrl()
|
||||
{
|
||||
if(!m_isLocalFile && !s_localImageCache.contains(m_localUrl))
|
||||
{
|
||||
if (!m_isLocalFile && !s_localImageCache.contains(m_localUrl)) {
|
||||
QImage img = image();
|
||||
if(!s_localImageCache.contains(m_localUrl))//double check as image() could have called download
|
||||
{
|
||||
img.save(m_localUrl ,"PNG");
|
||||
if (!s_localImageCache.contains(m_localUrl)) { //double check as image() could have called download
|
||||
img.save(m_localUrl , "PNG");
|
||||
s_localImageCache.insert(m_localUrl);
|
||||
snoreDebug( SNORE_DEBUG ) << m_localUrl << "added to cache";
|
||||
snoreDebug(SNORE_DEBUG) << m_localUrl << "added to cache";
|
||||
}
|
||||
}
|
||||
return m_localUrl;
|
||||
}
|
||||
|
||||
|
||||
void IconData::download()
|
||||
{
|
||||
if(m_isRemoteFile)
|
||||
{
|
||||
if(!s_localImageCache.contains(m_localUrl))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Downloading:" << m_url;
|
||||
if (m_isRemoteFile) {
|
||||
if (!s_localImageCache.contains(m_localUrl)) {
|
||||
snoreDebug(SNORE_DEBUG) << "Downloading:" << m_url;
|
||||
QNetworkAccessManager manager;
|
||||
QEventLoop loop;
|
||||
QNetworkRequest request(m_url);
|
||||
request.setRawHeader("User-Agent", "SnoreNotify");
|
||||
QNetworkReply *reply = manager.get(request);
|
||||
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
|
||||
QTimer::singleShot(1000,&loop, SLOT(quit()));//timeout
|
||||
QTimer::singleShot(1000, &loop, SLOT(quit())); //timeout
|
||||
loop.exec();
|
||||
if(reply->isFinished())
|
||||
{
|
||||
if (reply->isFinished()) {
|
||||
m_img = QImage::fromData(reply->readAll(), "PNG");
|
||||
m_img.save(m_localUrl,"PNG");
|
||||
m_img.save(m_localUrl, "PNG");
|
||||
s_localImageCache.insert(m_localUrl);
|
||||
snoreDebug( SNORE_DEBUG ) << m_localUrl << "added to cache";
|
||||
snoreDebug(SNORE_DEBUG) << m_localUrl << "added to cache";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_img = QImage(m_localUrl);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -20,7 +19,6 @@
|
|||
#ifndef ICONDATA_H
|
||||
#define ICONDATA_H
|
||||
|
||||
|
||||
#include "notification.h"
|
||||
#include "snore_p.h"
|
||||
|
||||
|
@ -33,7 +31,8 @@
|
|||
|
||||
#include <QMutex>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
class IconData : public QSharedData
|
||||
{
|
||||
|
@ -46,7 +45,6 @@ public:
|
|||
QString localUrl();
|
||||
void download();
|
||||
|
||||
|
||||
QImage m_img;
|
||||
QString m_url;
|
||||
QString m_hash;
|
||||
|
@ -56,7 +54,6 @@ public:
|
|||
bool m_isRemoteFile;
|
||||
QMutex m_mutex;
|
||||
|
||||
|
||||
static QSet<QString> s_localImageCache;
|
||||
|
||||
private:
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,27 +26,25 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
|
||||
int Notification::m_defaultTimeout = 10;
|
||||
|
||||
|
||||
Notification::Notification () :
|
||||
Notification::Notification() :
|
||||
d(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
Notification::Notification(const Application &application, const Alert &alert, const QString &title, const QString &text, const Icon &icon, int timeout, Notification::Prioritys priority):
|
||||
d(new NotificationData(application,alert,title,text,icon,timeout,priority))
|
||||
d(new NotificationData(application, alert, title, text, icon, timeout, priority))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Notification::Notification(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout, Notification::Prioritys priority):
|
||||
d(new NotificationData(old,title,text,icon,timeout,priority))
|
||||
d(new NotificationData(old, title, text, icon, timeout, priority))
|
||||
{
|
||||
}
|
||||
|
||||
Notification::Notification ( const Notification &other ) :
|
||||
Notification::Notification(const Notification &other) :
|
||||
d(other.d)
|
||||
{
|
||||
}
|
||||
|
@ -117,7 +114,6 @@ bool Notification::isSticky() const
|
|||
return d->m_timeout == 0;
|
||||
}
|
||||
|
||||
|
||||
Notification::Prioritys Notification::priority() const
|
||||
{
|
||||
return d->m_priority;
|
||||
|
@ -125,16 +121,16 @@ Notification::Prioritys Notification::priority() const
|
|||
|
||||
void Notification::addAction(const Action &a)
|
||||
{
|
||||
d->m_actions.insert(a.id(),a);
|
||||
d->m_actions.insert(a.id(), a);
|
||||
}
|
||||
|
||||
|
||||
const QHash<int, Action> &Notification::actions() const
|
||||
{
|
||||
return d->m_actions;
|
||||
}
|
||||
|
||||
const Notification::CloseReasons &Notification::closeReason(){
|
||||
const Notification::CloseReasons &Notification::closeReason()
|
||||
{
|
||||
return d->m_closeReason;
|
||||
}
|
||||
|
||||
|
@ -167,7 +163,7 @@ void Notification::setDefaultTimeout(int defaultTimeout)
|
|||
m_defaultTimeout = defaultTimeout;
|
||||
}
|
||||
|
||||
QDataStream &operator<< ( QDataStream &stream, const Notification ¬i )
|
||||
QDataStream &operator<< (QDataStream &stream, const Notification ¬i)
|
||||
{
|
||||
stream << "Title: " << noti.title() << " Text: " << noti.text() << " ID: " << noti.id() ;
|
||||
return stream;
|
||||
|
@ -178,29 +174,27 @@ QDataStream &operator<< ( QDataStream &stream, const Notification ¬i )
|
|||
QDebug operator <<(QDebug debug, const Snore::Notification::CloseReasons &flags)
|
||||
{
|
||||
debug.nospace() << "CloseReasons(";
|
||||
switch(flags)
|
||||
{
|
||||
debugPrintEnum(Notification::NONE);
|
||||
debugPrintEnum(Notification::TIMED_OUT);
|
||||
debugPrintEnum(Notification::DISMISSED);
|
||||
debugPrintEnum(Notification::CLOSED);
|
||||
debugPrintEnum(Notification::REPLACED);
|
||||
switch (flags) {
|
||||
debugPrintEnum(Notification::NONE);
|
||||
debugPrintEnum(Notification::TIMED_OUT);
|
||||
debugPrintEnum(Notification::DISMISSED);
|
||||
debugPrintEnum(Notification::CLOSED);
|
||||
debugPrintEnum(Notification::REPLACED);
|
||||
default:
|
||||
debug << QByteArray::number(flags,16) << ")";
|
||||
debug << QByteArray::number(flags, 16) << ")";
|
||||
}
|
||||
return debug.space();
|
||||
}
|
||||
|
||||
QDebug operator<< ( QDebug debug, const Snore::Notification::Prioritys &flags)
|
||||
QDebug operator<< (QDebug debug, const Snore::Notification::Prioritys &flags)
|
||||
{
|
||||
debug.nospace() << "Prioritys(";
|
||||
switch(flags)
|
||||
{
|
||||
debugPrintEnum(Notification::LOW);
|
||||
debugPrintEnum(Notification::NORMAL);
|
||||
debugPrintEnum(Notification::HIGH);
|
||||
switch (flags) {
|
||||
debugPrintEnum(Notification::LOW);
|
||||
debugPrintEnum(Notification::NORMAL);
|
||||
debugPrintEnum(Notification::HIGH);
|
||||
default:
|
||||
debug << QByteArray::number(flags,16) << ")";
|
||||
debug << QByteArray::number(flags, 16) << ")";
|
||||
}
|
||||
return debug.space();
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -28,7 +27,6 @@
|
|||
#include <QVariant>
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
|
@ -41,7 +39,6 @@ class NotificationData;
|
|||
* @author Patrick von Reth \<vonreth at kde.org\>
|
||||
*/
|
||||
|
||||
|
||||
class SNORE_EXPORT Notification
|
||||
{
|
||||
friend class NotificationData;
|
||||
|
@ -49,11 +46,10 @@ public:
|
|||
/**
|
||||
* The reason why the Notification was closed.
|
||||
*/
|
||||
enum CloseReason
|
||||
{
|
||||
/**
|
||||
* The default value, the notification was not closed.
|
||||
*/
|
||||
enum CloseReason {
|
||||
/**
|
||||
* The default value, the notification was not closed.
|
||||
*/
|
||||
NONE = 0,
|
||||
|
||||
/**
|
||||
|
@ -86,8 +82,7 @@ public:
|
|||
* The Priority for the Notification.
|
||||
* Some notification systems support this flag to filter notifications or indicate different prioritys by color.
|
||||
*/
|
||||
enum Priority
|
||||
{
|
||||
enum Priority {
|
||||
/**
|
||||
* Indicates a low priority.
|
||||
*/
|
||||
|
@ -116,7 +111,7 @@ public:
|
|||
* @param timeout the timeout
|
||||
* @param priority the priority
|
||||
*/
|
||||
explicit Notification(const Application &application,const Alert &alert,const QString &title,const QString &text,const Icon &icon,int timeout = defaultTimeout(), Notification::Prioritys priority = NORMAL );
|
||||
explicit Notification(const Application &application, const Alert &alert, const QString &title, const QString &text, const Icon &icon, int timeout = defaultTimeout(), Notification::Prioritys priority = NORMAL);
|
||||
|
||||
/**
|
||||
* Creates and update Notification replacing an existing Notification
|
||||
|
@ -127,13 +122,13 @@ public:
|
|||
* @param timeout the timeout
|
||||
* @param priority the piority
|
||||
*/
|
||||
explicit Notification(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout = defaultTimeout(), Snore::Notification::Prioritys priority = NORMAL );
|
||||
explicit Notification(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout = defaultTimeout(), Snore::Notification::Prioritys priority = NORMAL);
|
||||
|
||||
/**
|
||||
* The copy constructor
|
||||
* @param other
|
||||
*/
|
||||
Notification(const Notification &other );
|
||||
Notification(const Notification &other);
|
||||
|
||||
/**
|
||||
* The copy operator
|
||||
|
@ -241,7 +236,6 @@ public:
|
|||
*/
|
||||
bool isValid() const;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the old notification to be replaced
|
||||
|
@ -279,7 +273,6 @@ private:
|
|||
|
||||
static int m_defaultTimeout;
|
||||
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -289,29 +282,24 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(Snore::Notification::CloseReasons)
|
|||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Snore::Notification::Prioritys)
|
||||
|
||||
QDataStream &operator<< ( QDataStream & stream, const Snore::Notification & noti );
|
||||
QDataStream &operator<< (QDataStream &stream, const Snore::Notification ¬i);
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::Notification::CloseReasons &);
|
||||
SNORE_EXPORT QDebug operator<< (QDebug, const Snore::Notification::CloseReasons &);
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::Notification::Prioritys &);
|
||||
SNORE_EXPORT QDebug operator<< (QDebug, const Snore::Notification::Prioritys &);
|
||||
|
||||
inline QDebug operator<< ( QDebug debug, const Snore::Notification ¬i )
|
||||
inline QDebug operator<< (QDebug debug, const Snore::Notification ¬i)
|
||||
{
|
||||
if(noti.isValid())
|
||||
{
|
||||
if (noti.isValid()) {
|
||||
debug.nospace() << "Snore::Notification(" << noti.title() << ", " << noti.text() << ", id = " << noti.id();
|
||||
if(noti.isUpdate())
|
||||
{
|
||||
if (noti.isUpdate()) {
|
||||
debug << ", oldID = " << noti.old().id();
|
||||
}
|
||||
debug << ")" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
debug.nospace() << "Snore::Notification(0x00)" ;
|
||||
}
|
||||
return debug.maybeSpace();
|
||||
}
|
||||
|
||||
|
||||
#endif // NOTIFICATION_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -17,8 +16,6 @@
|
|||
along with SnoreNotify. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "notification/notification_p.h"
|
||||
#include "notification/icon.h"
|
||||
#include "../hint.h"
|
||||
|
@ -32,57 +29,55 @@ uint NotificationData::notificationCount = 0;
|
|||
|
||||
uint NotificationData::m_idCount = 1;
|
||||
|
||||
NotificationData::NotificationData (const Snore::Application &application, const Snore::Alert &alert, const QString &title, const QString &text, const Icon &icon,
|
||||
int timeout, Notification::Prioritys priority ):
|
||||
m_id ( m_idCount++ ),
|
||||
m_timeout( timeout ),
|
||||
m_source( NULL),
|
||||
m_application ( application ),
|
||||
m_alert( alert ),
|
||||
m_title( title ),
|
||||
m_text( text ),
|
||||
m_icon( icon ),
|
||||
NotificationData::NotificationData(const Snore::Application &application, const Snore::Alert &alert, const QString &title, const QString &text, const Icon &icon,
|
||||
int timeout, Notification::Prioritys priority):
|
||||
m_id(m_idCount++),
|
||||
m_timeout(timeout),
|
||||
m_source(NULL),
|
||||
m_application(application),
|
||||
m_alert(alert),
|
||||
m_title(title),
|
||||
m_text(text),
|
||||
m_icon(icon),
|
||||
m_priority(priority),
|
||||
m_closeReason(Notification::NONE)
|
||||
{
|
||||
notificationCount++;
|
||||
snoreDebug( SNORE_DEBUG ) << "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id;
|
||||
snoreDebug(SNORE_DEBUG) << "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id;
|
||||
}
|
||||
|
||||
Snore::NotificationData::NotificationData(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout, Notification::Prioritys priority):
|
||||
m_id ( m_idCount++ ),
|
||||
m_timeout( timeout ),
|
||||
m_source( NULL),
|
||||
m_application ( old.application()),
|
||||
m_alert( old.alert() ),
|
||||
m_title( title ),
|
||||
m_text( text ),
|
||||
m_icon( icon ),
|
||||
m_id(m_idCount++),
|
||||
m_timeout(timeout),
|
||||
m_source(NULL),
|
||||
m_application(old.application()),
|
||||
m_alert(old.alert()),
|
||||
m_title(title),
|
||||
m_text(text),
|
||||
m_icon(icon),
|
||||
m_priority(priority),
|
||||
m_closeReason(Notification::NONE),
|
||||
m_toReplace(old)
|
||||
{
|
||||
notificationCount++;
|
||||
snoreDebug( SNORE_DEBUG )<< "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id;
|
||||
snoreDebug(SNORE_DEBUG) << "Creating Notification: ActiveNotifications" << notificationCount << "id" << m_id;
|
||||
}
|
||||
|
||||
NotificationData::~NotificationData()
|
||||
{
|
||||
if(!m_timeoutTimer.isNull())
|
||||
{
|
||||
if (!m_timeoutTimer.isNull()) {
|
||||
m_timeoutTimer->deleteLater();
|
||||
}
|
||||
notificationCount--;
|
||||
snoreDebug( SNORE_DEBUG ) << "Deleting Notification: ActiveNotifications" << notificationCount << "id" << m_id << "Close Reason:" << m_closeReason;
|
||||
snoreDebug(SNORE_DEBUG) << "Deleting Notification: ActiveNotifications" << notificationCount << "id" << m_id << "Close Reason:" << m_closeReason;
|
||||
}
|
||||
|
||||
|
||||
void NotificationData::setActionInvoked (const Snore::Action &action )
|
||||
void NotificationData::setActionInvoked(const Snore::Action &action)
|
||||
{
|
||||
m_actionInvoked = action;
|
||||
}
|
||||
|
||||
void NotificationData::setActionInvoked ( const int &id)
|
||||
void NotificationData::setActionInvoked(const int &id)
|
||||
{
|
||||
m_actionInvoked = m_actions[id];
|
||||
}
|
||||
|
@ -104,8 +99,7 @@ void NotificationData::setCloseReason(Snore::Notification::CloseReasons r)
|
|||
|
||||
QTimer *NotificationData::timeoutTimer()
|
||||
{
|
||||
if(m_timeoutTimer.isNull())
|
||||
{
|
||||
if (m_timeoutTimer.isNull()) {
|
||||
m_timeoutTimer = new QTimer();
|
||||
m_timeoutTimer->setSingleShot(true);
|
||||
m_timeoutTimer->setProperty("notificationID", m_id);
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -20,7 +19,6 @@
|
|||
#ifndef NOTIFICATIONDATA_H
|
||||
#define NOTIFICATIONDATA_H
|
||||
|
||||
|
||||
#include "icon.h"
|
||||
#include "notification.h"
|
||||
#include "../hint.h"
|
||||
|
@ -29,33 +27,29 @@
|
|||
#include <QTimer>
|
||||
#include <QPointer>
|
||||
|
||||
|
||||
namespace Snore{
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
class SNORE_EXPORT NotificationData : public QSharedData
|
||||
{
|
||||
|
||||
friend class Notification;
|
||||
public:
|
||||
NotificationData ( const Application &application,const Alert &alert,const QString &title,const QString &text,const Icon &icon,
|
||||
int timeout,Notification::Prioritys priority );
|
||||
|
||||
NotificationData(const Notification &old,const QString &title,const QString &text,const Icon &icon,int timeout, Notification::Prioritys priority);
|
||||
NotificationData(const Application &application, const Alert &alert, const QString &title, const QString &text, const Icon &icon,
|
||||
int timeout, Notification::Prioritys priority);
|
||||
|
||||
NotificationData(const Notification &old, const QString &title, const QString &text, const Icon &icon, int timeout, Notification::Prioritys priority);
|
||||
|
||||
~NotificationData();
|
||||
|
||||
void setSource(class SnoreFrontend *source);
|
||||
class SnoreFrontend *source() const;
|
||||
|
||||
void setActionInvoked( const Action &action );
|
||||
void setActionInvoked( const int &actionID);
|
||||
|
||||
void setActionInvoked(const Action &action);
|
||||
void setActionInvoked(const int &actionID);
|
||||
|
||||
void setCloseReason(Notification::CloseReasons r);
|
||||
|
||||
|
||||
QTimer *timeoutTimer();
|
||||
|
||||
private:
|
||||
|
@ -73,13 +67,11 @@ private:
|
|||
Notification::Prioritys m_priority;
|
||||
Notification::CloseReasons m_closeReason;
|
||||
Action m_actionInvoked;
|
||||
QHash<int,Action> m_actions;
|
||||
QHash<int, Action> m_actions;
|
||||
Hint m_hints;
|
||||
Notification m_toReplace;
|
||||
QPointer<QTimer> m_timeoutTimer;
|
||||
|
||||
|
||||
|
||||
static uint notificationCount;
|
||||
static uint m_idCount;
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -49,7 +48,7 @@ int Action::id() const
|
|||
return m_id;
|
||||
}
|
||||
|
||||
QDataStream &operator<< ( QDataStream &stream, const Action &a)
|
||||
QDataStream &operator<< (QDataStream &stream, const Action &a)
|
||||
{
|
||||
stream << a.id() << a.name();
|
||||
return stream;
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,7 +23,6 @@
|
|||
|
||||
#include <QDataStream>
|
||||
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
|
@ -46,7 +44,7 @@ public:
|
|||
* @param id can be used to identify the action
|
||||
* @param name will be displayed in the notification system.
|
||||
*/
|
||||
Action(int id,QString name);
|
||||
Action(int id, QString name);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -72,5 +70,5 @@ private:
|
|||
};
|
||||
}
|
||||
|
||||
QDataStream &operator<< ( QDataStream & stream, const Snore::Action &action);
|
||||
QDataStream &operator<< (QDataStream &stream, const Snore::Action &action);
|
||||
#endif // NOTIFICATIONACTION_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -33,8 +32,7 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
QHash<SnorePlugin::PluginTypes, QHash<QString,PluginContainer*> > PluginContainer::s_pluginCache;
|
||||
|
||||
QHash<SnorePlugin::PluginTypes, QHash<QString, PluginContainer *> > PluginContainer::s_pluginCache;
|
||||
|
||||
PluginContainer::PluginContainer(QString fileName, QString pluginName, SnorePlugin::PluginTypes type):
|
||||
m_pluginFile(fileName),
|
||||
|
@ -52,12 +50,11 @@ PluginContainer::~PluginContainer()
|
|||
|
||||
SnorePlugin *PluginContainer::load()
|
||||
{
|
||||
if(!m_loader.isLoaded() && !m_loader.load())
|
||||
{
|
||||
snoreDebug( SNORE_WARNING ) << "Failed loading plugin: " << m_loader.errorString();
|
||||
if (!m_loader.isLoaded() && !m_loader.load()) {
|
||||
snoreDebug(SNORE_WARNING) << "Failed loading plugin: " << m_loader.errorString();
|
||||
return NULL;
|
||||
}
|
||||
return qobject_cast<SnorePlugin*> ( m_loader.instance());
|
||||
return qobject_cast<SnorePlugin *> (m_loader.instance());
|
||||
}
|
||||
|
||||
void PluginContainer::unload()
|
||||
|
@ -65,12 +62,12 @@ void PluginContainer::unload()
|
|||
m_loader.unload();
|
||||
}
|
||||
|
||||
const QString & PluginContainer::file()
|
||||
const QString &PluginContainer::file()
|
||||
{
|
||||
return m_pluginFile;
|
||||
}
|
||||
|
||||
const QString & PluginContainer::name()
|
||||
const QString &PluginContainer::name()
|
||||
{
|
||||
return m_pluginName;
|
||||
}
|
||||
|
@ -98,11 +95,9 @@ QString PluginContainer::typeToString(const SnorePlugin::PluginTypes t)
|
|||
const QList<SnorePlugin::PluginTypes> &PluginContainer::types()
|
||||
{
|
||||
static QList<SnorePlugin::PluginTypes> t;
|
||||
if(t.isEmpty())
|
||||
{
|
||||
if (t.isEmpty()) {
|
||||
QMetaEnum e = SnorePlugin::staticMetaObject.enumerator(SnorePlugin::staticMetaObject.indexOfEnumerator("PluginType"));
|
||||
for (int i = 0; i < e.keyCount(); ++i)
|
||||
{
|
||||
for (int i = 0; i < e.keyCount(); ++i) {
|
||||
t << (SnorePlugin::PluginTypes) e.value(i);
|
||||
}
|
||||
}
|
||||
|
@ -111,66 +106,55 @@ const QList<SnorePlugin::PluginTypes> &PluginContainer::types()
|
|||
|
||||
void PluginContainer::updatePluginCache()
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Updating plugin cache";
|
||||
foreach(PluginContaienrHash list, s_pluginCache)
|
||||
{
|
||||
foreach(PluginContainer* p, list.values())
|
||||
{
|
||||
snoreDebug(SNORE_DEBUG) << "Updating plugin cache";
|
||||
foreach(PluginContaienrHash list, s_pluginCache) {
|
||||
foreach(PluginContainer * p, list.values()) {
|
||||
delete p;
|
||||
}
|
||||
list.clear();
|
||||
}
|
||||
|
||||
QList<PluginContainer*> plugins;
|
||||
QList<PluginContainer *> plugins;
|
||||
|
||||
foreach(const SnorePlugin::PluginTypes type,PluginContainer::types())
|
||||
{
|
||||
foreach(const QFileInfo &file, pluginDir().entryInfoList(
|
||||
QStringList(pluginFileFilters(type)), QDir::Files))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "adding" << file.absoluteFilePath();
|
||||
foreach(const SnorePlugin::PluginTypes type, PluginContainer::types()) {
|
||||
foreach(const QFileInfo & file, pluginDir().entryInfoList(
|
||||
QStringList(pluginFileFilters(type)), QDir::Files)) {
|
||||
snoreDebug(SNORE_DEBUG) << "adding" << file.absoluteFilePath();
|
||||
QPluginLoader loader(file.absoluteFilePath());
|
||||
QObject *plugin = loader.instance();
|
||||
if (plugin == NULL)//TODO: Qt5 json stuff
|
||||
{
|
||||
snoreDebug( SNORE_WARNING ) << "Failed loading plugin: " << file.absoluteFilePath() << loader.errorString();
|
||||
if (plugin == NULL) { //TODO: Qt5 json stuff
|
||||
snoreDebug(SNORE_WARNING) << "Failed loading plugin: " << file.absoluteFilePath() << loader.errorString();
|
||||
continue;
|
||||
}
|
||||
SnorePlugin *sp = qobject_cast<SnorePlugin*>(plugin);
|
||||
if(sp == NULL)
|
||||
{
|
||||
snoreDebug( SNORE_WARNING ) << "Error:" << file.absoluteFilePath() << " is not a Snore plugin" ;
|
||||
SnorePlugin *sp = qobject_cast<SnorePlugin *>(plugin);
|
||||
if (sp == NULL) {
|
||||
snoreDebug(SNORE_WARNING) << "Error:" << file.absoluteFilePath() << " is not a Snore plugin" ;
|
||||
loader.unload();
|
||||
continue;
|
||||
}
|
||||
PluginContainer *info = new PluginContainer(file.fileName(), sp->name() ,type);
|
||||
PluginContainer *info = new PluginContainer(file.fileName(), sp->name() , type);
|
||||
s_pluginCache[type].insert(info->name(), info);
|
||||
plugins << info;
|
||||
snoreDebug( SNORE_DEBUG ) << "added" << info->name() << "to cache";
|
||||
snoreDebug(SNORE_DEBUG) << "added" << info->name() << "to cache";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const QHash<QString, PluginContainer *> PluginContainer::pluginCache(SnorePlugin::PluginTypes type)
|
||||
{
|
||||
if(s_pluginCache.isEmpty())
|
||||
{
|
||||
if (s_pluginCache.isEmpty()) {
|
||||
QTime time;
|
||||
time.start();
|
||||
updatePluginCache();
|
||||
snoreDebug( SNORE_DEBUG ) << "Plugins loaded in:" << time.elapsed();
|
||||
snoreDebug(SNORE_DEBUG) << "Plugins loaded in:" << time.elapsed();
|
||||
}
|
||||
|
||||
QHash<QString, PluginContainer *> out;
|
||||
if(type == SnorePlugin::ALL)
|
||||
{
|
||||
foreach(const SnorePlugin::PluginTypes &t,types())
|
||||
{
|
||||
if (type == SnorePlugin::ALL) {
|
||||
foreach(const SnorePlugin::PluginTypes & t, types()) {
|
||||
out.unite(s_pluginCache.value(t));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
out = s_pluginCache[type];
|
||||
}
|
||||
return out;
|
||||
|
@ -180,14 +164,12 @@ const QDir &PluginContainer::pluginDir()
|
|||
{
|
||||
static bool isLoaded = false;
|
||||
static QDir path;
|
||||
if(!isLoaded)
|
||||
{
|
||||
if (!isLoaded) {
|
||||
isLoaded = true;
|
||||
QString appDir = qApp->applicationDirPath();
|
||||
QStringList list;
|
||||
#ifdef Q_OS_MAC
|
||||
if ( appDir == "MacOS" )
|
||||
{
|
||||
if (appDir == "MacOS") {
|
||||
list << appDir;
|
||||
QDir dir(appDir);
|
||||
// Development convenience-hack
|
||||
|
@ -202,26 +184,20 @@ const QDir &PluginContainer::pluginDir()
|
|||
<< QString("%1/../lib/libsnore" SNORE_SUFFIX).arg(appDir)
|
||||
<< QString("%1/../lib64/libsnore" SNORE_SUFFIX).arg(appDir)
|
||||
<< QLatin1String(LIBSNORE_PLUGIN_PATH);
|
||||
foreach(const QString &p, list)
|
||||
{
|
||||
foreach(const QString & p, list) {
|
||||
path = QDir(p);
|
||||
|
||||
if(!path.entryInfoList(pluginFileFilters()).isEmpty())
|
||||
{
|
||||
if (!path.entryInfoList(pluginFileFilters()).isEmpty()) {
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Possible pluginpath:" << path.absolutePath() << "does not contain plugins.";
|
||||
} else {
|
||||
snoreDebug(SNORE_DEBUG) << "Possible pluginpath:" << path.absolutePath() << "does not contain plugins.";
|
||||
}
|
||||
}
|
||||
if(path.entryInfoList(pluginFileFilters()).isEmpty())
|
||||
{
|
||||
snoreDebug( SNORE_WARNING ) << "Couldnt find any plugins";
|
||||
if (path.entryInfoList(pluginFileFilters()).isEmpty()) {
|
||||
snoreDebug(SNORE_WARNING) << "Couldnt find any plugins";
|
||||
}
|
||||
snoreDebug( SNORE_INFO ) << "PluginPath is :" << path.absolutePath();
|
||||
snoreDebug(SNORE_INFO) << "PluginPath is :" << path.absolutePath();
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,13 +26,11 @@
|
|||
#include <QFlag>
|
||||
#include <QPluginLoader>
|
||||
|
||||
|
||||
|
||||
namespace Snore
|
||||
{
|
||||
class PluginContainer;
|
||||
|
||||
typedef QHash<QString,PluginContainer*> PluginContaienrHash;
|
||||
typedef QHash<QString, PluginContainer *> PluginContaienrHash;
|
||||
|
||||
class SNORE_EXPORT PluginContainer
|
||||
{
|
||||
|
@ -50,7 +47,6 @@ public:
|
|||
|
||||
bool isLoaded() const;
|
||||
|
||||
|
||||
static SnorePlugin::PluginTypes typeFromString(const QString &t);
|
||||
static QString typeToString(const SnorePlugin::PluginTypes t);
|
||||
static const QList<SnorePlugin::PluginTypes> &types();
|
||||
|
@ -78,8 +74,7 @@ private:
|
|||
static inline const QStringList pluginFileFilters()
|
||||
{
|
||||
QStringList out;
|
||||
foreach(const QString extention, pluginExtentions())
|
||||
{
|
||||
foreach(const QString extention, pluginExtentions()) {
|
||||
out << QString("libsnore_*.%1").arg(extention);
|
||||
}
|
||||
return out;
|
||||
|
@ -88,8 +83,7 @@ private:
|
|||
static inline const QStringList pluginFileFilters(Snore::SnorePlugin::PluginTypes type)
|
||||
{
|
||||
QStringList out;
|
||||
foreach(const QString extention, pluginExtentions())
|
||||
{
|
||||
foreach(const QString extention, pluginExtentions()) {
|
||||
out << QString("libsnore_%1_*.%2").arg(typeToString(type).toLower(), extention);
|
||||
}
|
||||
return out;
|
||||
|
@ -102,5 +96,4 @@ private:
|
|||
};
|
||||
}
|
||||
|
||||
|
||||
#endif//PLUGINCONTAINER_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -31,29 +30,27 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
SnorePlugin::SnorePlugin ( const QString &name ) :
|
||||
m_name ( name ),
|
||||
SnorePlugin::SnorePlugin(const QString &name) :
|
||||
m_name(name),
|
||||
m_initialized(false)
|
||||
{
|
||||
if(thread() != qApp->thread())
|
||||
{
|
||||
moveToThread( qApp->thread() );
|
||||
if (thread() != qApp->thread()) {
|
||||
moveToThread(qApp->thread());
|
||||
}
|
||||
}
|
||||
|
||||
SnorePlugin::~SnorePlugin()
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << m_name << this << "deleted";
|
||||
snoreDebug(SNORE_DEBUG) << m_name << this << "deleted";
|
||||
}
|
||||
|
||||
bool SnorePlugin::initialize( SnoreCore *snore )
|
||||
bool SnorePlugin::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(m_initialized)
|
||||
{
|
||||
qFatal("Something went wrong, plugin %s is already initialized",this->name().toLatin1().constData());
|
||||
if (m_initialized) {
|
||||
qFatal("Something went wrong, plugin %s is already initialized", this->name().toLatin1().constData());
|
||||
return false;
|
||||
}
|
||||
snoreDebug( SNORE_DEBUG ) << "Initialize" << m_name << this << snore;
|
||||
snoreDebug(SNORE_DEBUG) << "Initialize" << m_name << this << snore;
|
||||
this->m_snore = snore;
|
||||
m_initialized = true;
|
||||
return true;
|
||||
|
@ -64,7 +61,7 @@ bool SnorePlugin::isInitialized()
|
|||
return m_initialized;
|
||||
}
|
||||
|
||||
SnoreCore* SnorePlugin::snore()
|
||||
SnoreCore *SnorePlugin::snore()
|
||||
{
|
||||
return m_snore.data();
|
||||
}
|
||||
|
@ -76,33 +73,26 @@ const QString &SnorePlugin::name() const
|
|||
|
||||
bool SnorePlugin::deinitialize()
|
||||
{
|
||||
if(m_initialized)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Deinitialize" << m_name << this;
|
||||
if (m_initialized) {
|
||||
snoreDebug(SNORE_DEBUG) << "Deinitialize" << m_name << this;
|
||||
m_initialized = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
QDebug operator <<(QDebug debug, const Snore::SnorePlugin::PluginTypes &flags)
|
||||
{
|
||||
QMetaEnum e = SnorePlugin::staticMetaObject.enumerator(SnorePlugin::staticMetaObject.indexOfEnumerator("PluginType"));
|
||||
debug.nospace() << "PluginTypes(";
|
||||
bool needSeparator = false;
|
||||
int key;
|
||||
for (int i = 0; i < e.keyCount(); ++i)
|
||||
{
|
||||
for (int i = 0; i < e.keyCount(); ++i) {
|
||||
key = e.value(i);
|
||||
if (flags.testFlag((SnorePlugin::PluginType)key))
|
||||
{
|
||||
if (needSeparator)
|
||||
{
|
||||
if (flags.testFlag((SnorePlugin::PluginType)key)) {
|
||||
if (needSeparator) {
|
||||
debug.nospace() << '|';
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
needSeparator = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,17 +26,16 @@
|
|||
#include <QTimer>
|
||||
#include <QtPlugin>
|
||||
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
class Application;
|
||||
class SnoreCore;
|
||||
|
||||
|
||||
class SNORE_EXPORT SnorePlugin : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum PluginType{
|
||||
enum PluginType {
|
||||
ALL = 0xFFFFF,//for loading plugins
|
||||
BACKEND = 0x1,
|
||||
SECONDARY_BACKEND = 0x2,
|
||||
|
@ -47,13 +45,12 @@ public:
|
|||
Q_DECLARE_FLAGS(PluginTypes, PluginType)
|
||||
Q_ENUMS(PluginType)
|
||||
|
||||
|
||||
SnorePlugin ( const QString &name);
|
||||
SnorePlugin(const QString &name);
|
||||
virtual ~SnorePlugin();
|
||||
virtual bool initialize( SnoreCore *snore );
|
||||
virtual bool initialize(SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
bool isInitialized();
|
||||
SnoreCore* snore();
|
||||
SnoreCore *snore();
|
||||
const QString &name() const;
|
||||
|
||||
private:
|
||||
|
@ -62,16 +59,14 @@ private:
|
|||
bool m_initialized;
|
||||
QPointer<SnoreCore> m_snore;
|
||||
|
||||
|
||||
};
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Snore::SnorePlugin::PluginTypes)
|
||||
|
||||
|
||||
}
|
||||
Q_DECLARE_INTERFACE ( Snore::SnorePlugin,
|
||||
"org.Snore.SnorePlugin/1.0" )
|
||||
Q_DECLARE_INTERFACE(Snore::SnorePlugin,
|
||||
"org.Snore.SnorePlugin/1.0")
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::SnorePlugin::PluginTypes &);
|
||||
SNORE_EXPORT QDebug operator<< (QDebug, const Snore::SnorePlugin::PluginTypes &);
|
||||
|
||||
//compatability defines to reduce the number of ifdefs to make fiat compile with qt4 and qt5
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
|
@ -87,6 +82,4 @@ SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::SnorePlugin::PluginTypes &
|
|||
# define Q_PLUGIN_METADATA(a)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif//SNORE_PLUGINS_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -30,11 +29,10 @@
|
|||
#include <QThread>
|
||||
#include <QMetaMethod>
|
||||
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
SnoreBackend::SnoreBackend (const QString &name , bool canCloseNotification, bool supportsRichtext, bool canUpdateNotifications) :
|
||||
SnorePlugin ( name ),
|
||||
SnoreBackend::SnoreBackend(const QString &name , bool canCloseNotification, bool supportsRichtext, bool canUpdateNotifications) :
|
||||
SnorePlugin(name),
|
||||
m_canCloseNotification(canCloseNotification),
|
||||
m_supportsRichtext(supportsRichtext),
|
||||
m_canUpdateNotification(canUpdateNotifications)
|
||||
|
@ -44,57 +42,49 @@ SnoreBackend::SnoreBackend (const QString &name , bool canCloseNotification, boo
|
|||
|
||||
SnoreBackend::~SnoreBackend()
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG )<<"Deleting"<<name();
|
||||
snoreDebug(SNORE_DEBUG) << "Deleting" << name();
|
||||
}
|
||||
|
||||
|
||||
bool SnoreBackend::initialize( SnoreCore *snore )
|
||||
bool SnoreBackend::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(!SnorePlugin::initialize(snore))
|
||||
{
|
||||
if (!SnorePlugin::initialize(snore)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
connect( snore->d(), SIGNAL(applicationRegistered(const Snore::Application&)), this, SLOT(slotRegisterApplication(const Snore::Application&)), Qt::QueuedConnection);
|
||||
connect( snore->d(), SIGNAL(applicationDeregistered(const Snore::Application&)), this, SLOT(slotDeregisterApplication(const Snore::Application&)), Qt::QueuedConnection);
|
||||
connect(snore->d(), SIGNAL(applicationRegistered(Snore::Application)), this, SLOT(slotRegisterApplication(Snore::Application)), Qt::QueuedConnection);
|
||||
connect(snore->d(), SIGNAL(applicationDeregistered(Snore::Application)), this, SLOT(slotDeregisterApplication(Snore::Application)), Qt::QueuedConnection);
|
||||
|
||||
connect( this, SIGNAL(notificationClosed(Snore::Notification)), snore->d(), SLOT(slotNotificationClosed(Snore::Notification)), Qt::QueuedConnection);
|
||||
connect( snore->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)), Qt::QueuedConnection);
|
||||
connect(this, SIGNAL(notificationClosed(Snore::Notification)), snore->d(), SLOT(slotNotificationClosed(Snore::Notification)), Qt::QueuedConnection);
|
||||
connect(snore->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)), Qt::QueuedConnection);
|
||||
|
||||
foreach(const Application &a,snore->aplications())
|
||||
{
|
||||
foreach(const Application & a, snore->aplications()) {
|
||||
this->slotRegisterApplication(a);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void SnoreBackend::requestCloseNotification (Notification notification, Notification::CloseReasons reason )
|
||||
void SnoreBackend::requestCloseNotification(Notification notification, Notification::CloseReasons reason)
|
||||
{
|
||||
if(canCloseNotification() && notification.isValid())
|
||||
{
|
||||
closeNotification(notification,reason);
|
||||
if (canCloseNotification() && notification.isValid()) {
|
||||
closeNotification(notification, reason);
|
||||
slotCloseNotification(notification);
|
||||
}
|
||||
}
|
||||
|
||||
void SnoreBackend::closeNotification(Notification n, Notification::CloseReasons reason)
|
||||
{
|
||||
if(!n.isValid())
|
||||
{
|
||||
if (!n.isValid()) {
|
||||
return;
|
||||
}
|
||||
if(m_activeNotifications.contains(n.id()))
|
||||
{
|
||||
if (m_activeNotifications.contains(n.id())) {
|
||||
m_activeNotifications.remove(n.id());
|
||||
}
|
||||
if(n.isUpdate() && m_activeNotifications.contains(n.old().id()))
|
||||
{
|
||||
if (n.isUpdate() && m_activeNotifications.contains(n.old().id())) {
|
||||
m_activeNotifications.remove(n.old().id());
|
||||
}
|
||||
n.data()->setCloseReason(reason);
|
||||
snoreDebug( SNORE_DEBUG ) << n;
|
||||
snoreDebug(SNORE_DEBUG) << n;
|
||||
emit notificationClosed(n);
|
||||
}
|
||||
|
||||
|
@ -117,24 +107,22 @@ SnoreSecondaryBackend::SnoreSecondaryBackend(const QString &name, bool supportsR
|
|||
|
||||
SnoreSecondaryBackend::~SnoreSecondaryBackend()
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG )<<"Deleting"<<name();
|
||||
snoreDebug(SNORE_DEBUG) << "Deleting" << name();
|
||||
}
|
||||
|
||||
bool SnoreSecondaryBackend::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(!SnorePlugin::initialize(snore))
|
||||
{
|
||||
if (!SnorePlugin::initialize(snore)) {
|
||||
return false;
|
||||
}
|
||||
connect( snore->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)), Qt::QueuedConnection);
|
||||
connect(snore->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)), Qt::QueuedConnection);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SnoreSecondaryBackend::deinitialize()
|
||||
{
|
||||
if(SnorePlugin::deinitialize())
|
||||
{
|
||||
disconnect( snore()->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)));
|
||||
if (SnorePlugin::deinitialize()) {
|
||||
disconnect(snore()->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -180,62 +168,52 @@ void SnoreBackend::addActiveNotification(Notification n)
|
|||
m_activeNotifications.insert(n.id(), n);
|
||||
}
|
||||
|
||||
|
||||
bool SnoreBackend::deinitialize()
|
||||
{
|
||||
if(SnorePlugin::deinitialize())
|
||||
{
|
||||
foreach(Notification n,m_activeNotifications)
|
||||
{
|
||||
if (SnorePlugin::deinitialize()) {
|
||||
foreach(Notification n, m_activeNotifications) {
|
||||
requestCloseNotification(n, Notification::DISMISSED);
|
||||
}
|
||||
|
||||
|
||||
foreach(const Application &a,snore()->aplications())
|
||||
{
|
||||
foreach(const Application & a, snore()->aplications()) {
|
||||
slotDeregisterApplication(a);
|
||||
}
|
||||
disconnect( snore()->d(), SIGNAL(applicationRegistered(const Snore::Application&)), this, SLOT(slotRegisterApplication(const Snore::Application&)));
|
||||
disconnect( snore()->d(), SIGNAL(applicationDeregistered(const Snore::Application&)), this, SLOT(slotDeregisterApplication(const Snore::Application&)));
|
||||
disconnect(snore()->d(), SIGNAL(applicationRegistered(Snore::Application)), this, SLOT(slotRegisterApplication(Snore::Application)));
|
||||
disconnect(snore()->d(), SIGNAL(applicationDeregistered(Snore::Application)), this, SLOT(slotDeregisterApplication(Snore::Application)));
|
||||
|
||||
disconnect( this, SIGNAL(notificationClosed(Snore::Notification)), snore()->d(), SLOT(slotNotificationClosed(Snore::Notification)));
|
||||
disconnect( snore()->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)));
|
||||
disconnect(this, SIGNAL(notificationClosed(Snore::Notification)), snore()->d(), SLOT(slotNotificationClosed(Snore::Notification)));
|
||||
disconnect(snore()->d(), SIGNAL(notify(Snore::Notification)), this, SLOT(slotNotify(Snore::Notification)));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void SnoreBackend::startTimeout(Notification ¬ification)
|
||||
{
|
||||
if(thread() != QThread::currentThread())
|
||||
{
|
||||
metaObject()->invokeMethod(this, "startTimeout", Qt::QueuedConnection, Q_ARG(Notification,notification));
|
||||
if (thread() != QThread::currentThread()) {
|
||||
metaObject()->invokeMethod(this, "startTimeout", Qt::QueuedConnection, Q_ARG(Notification, notification));
|
||||
return;
|
||||
}
|
||||
if(notification.isSticky())
|
||||
{
|
||||
if (notification.isSticky()) {
|
||||
return;
|
||||
}
|
||||
QTimer *timer = notification.data()->timeoutTimer();
|
||||
timer->stop();
|
||||
if(notification.isUpdate())
|
||||
{
|
||||
if (notification.isUpdate()) {
|
||||
notification.old().data()->timeoutTimer()->stop();
|
||||
}
|
||||
timer->setInterval(notification.timeout() * 1000);
|
||||
connect(timer,SIGNAL(timeout()),this,SLOT(notificationTimedOut()), Qt::QueuedConnection);
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(notificationTimedOut()), Qt::QueuedConnection);
|
||||
timer->start();
|
||||
}
|
||||
|
||||
void SnoreBackend::notificationTimedOut()
|
||||
{
|
||||
|
||||
QTimer *timer = qobject_cast<QTimer*>(sender());
|
||||
QTimer *timer = qobject_cast<QTimer *>(sender());
|
||||
Notification n = snore()->getActiveNotificationByID(timer->property("notificationID").toUInt());
|
||||
if(n.isValid())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << n;
|
||||
snore()->requestCloseNotification(n,Notification::TIMED_OUT);
|
||||
if (n.isValid()) {
|
||||
snoreDebug(SNORE_DEBUG) << n;
|
||||
snore()->requestCloseNotification(n, Notification::TIMED_OUT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,7 +26,8 @@
|
|||
#include <QPointer>
|
||||
#include <QFlag>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
class SNORE_EXPORT SnoreBackend : public SnorePlugin
|
||||
{
|
||||
|
@ -39,7 +39,7 @@ public:
|
|||
virtual bool initialize(SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
|
||||
void requestCloseNotification( Snore::Notification notification,Notification::CloseReasons reason );
|
||||
void requestCloseNotification(Snore::Notification notification, Notification::CloseReasons reason);
|
||||
|
||||
Snore::Notification getActiveNotificationByID(uint id);
|
||||
|
||||
|
@ -48,14 +48,13 @@ public:
|
|||
bool supportsRichtext() const;
|
||||
|
||||
signals:
|
||||
void notificationClosed( Snore::Notification );
|
||||
|
||||
void notificationClosed(Snore::Notification);
|
||||
|
||||
public slots:
|
||||
virtual void slotRegisterApplication(const Snore::Application &application );
|
||||
virtual void slotDeregisterApplication(const Snore::Application &application );
|
||||
virtual void slotNotify ( Snore::Notification notification ) = 0;
|
||||
virtual void slotCloseNotification ( Snore::Notification notification );
|
||||
virtual void slotRegisterApplication(const Snore::Application &application);
|
||||
virtual void slotDeregisterApplication(const Snore::Application &application);
|
||||
virtual void slotNotify(Snore::Notification notification) = 0;
|
||||
virtual void slotCloseNotification(Snore::Notification notification);
|
||||
|
||||
private slots:
|
||||
void notificationTimedOut();
|
||||
|
@ -64,11 +63,11 @@ protected slots:
|
|||
void startTimeout(Notification ¬ification);
|
||||
|
||||
protected:
|
||||
void closeNotification(Snore::Notification,Snore::Notification::CloseReasons);
|
||||
void closeNotification(Snore::Notification, Snore::Notification::CloseReasons);
|
||||
void setSupportsRichtext(bool b);
|
||||
|
||||
private:
|
||||
QHash<uint,Notification> m_activeNotifications;
|
||||
QHash<uint, Notification> m_activeNotifications;
|
||||
|
||||
bool m_canCloseNotification;
|
||||
bool m_supportsRichtext;
|
||||
|
@ -77,14 +76,14 @@ private:
|
|||
void addActiveNotification(Notification n);
|
||||
friend void SnoreCore::broadcastNotification(Notification notification);
|
||||
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
Q_DECLARE_INTERFACE ( Snore::SnoreBackend,
|
||||
"org.Snore.NotificationBackend/1.0" )
|
||||
Q_DECLARE_INTERFACE(Snore::SnoreBackend,
|
||||
"org.Snore.NotificationBackend/1.0")
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
class SnoreCore;
|
||||
|
||||
class SNORE_EXPORT SnoreSecondaryBackend : public SnorePlugin
|
||||
|
@ -97,11 +96,10 @@ public:
|
|||
virtual bool initialize(SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
|
||||
|
||||
bool supportsRichtext();
|
||||
|
||||
public slots:
|
||||
virtual void slotNotify ( Snore::Notification notification ) = 0;
|
||||
virtual void slotNotify(Snore::Notification notification) = 0;
|
||||
|
||||
protected:
|
||||
bool m_supportsRichtext;
|
||||
|
@ -110,7 +108,7 @@ protected:
|
|||
|
||||
}
|
||||
|
||||
Q_DECLARE_INTERFACE ( Snore::SnoreSecondaryBackend,
|
||||
"org.Snore.SecondaryNotificationBackend/1.0" )
|
||||
Q_DECLARE_INTERFACE(Snore::SnoreSecondaryBackend,
|
||||
"org.Snore.SecondaryNotificationBackend/1.0")
|
||||
|
||||
#endif//SNORE_BACKEND_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,17 +23,18 @@
|
|||
#include <QDir>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
SnoreFrontend::SnoreFrontend ( const QString &name ) :
|
||||
SnorePlugin ( name )
|
||||
SnoreFrontend::SnoreFrontend(const QString &name) :
|
||||
SnorePlugin(name)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SnoreFrontend::~SnoreFrontend()
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Deleting" << name();
|
||||
snoreDebug(SNORE_DEBUG) << "Deleting" << name();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -26,26 +25,26 @@
|
|||
#include <QPointer>
|
||||
#include <QFlag>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
class Application;
|
||||
class SnoreCore;
|
||||
class SnorePlugin;
|
||||
|
||||
|
||||
class SNORE_EXPORT SnoreFrontend:public SnorePlugin
|
||||
class SNORE_EXPORT SnoreFrontend: public SnorePlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(Snore::SnorePlugin)
|
||||
public:
|
||||
SnoreFrontend ( const QString &name);
|
||||
SnoreFrontend(const QString &name);
|
||||
virtual ~SnoreFrontend();
|
||||
virtual void actionInvoked( Snore::Notification notification ) = 0;
|
||||
virtual void notificationClosed( Snore::Notification notification ) = 0;
|
||||
virtual void actionInvoked(Snore::Notification notification) = 0;
|
||||
virtual void notificationClosed(Snore::Notification notification) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_INTERFACE ( Snore::SnoreFrontend,
|
||||
"org.Snore.NotificationFrontend/1.0" )
|
||||
Q_DECLARE_INTERFACE(Snore::SnoreFrontend,
|
||||
"org.Snore.NotificationFrontend/1.0")
|
||||
|
||||
#endif//SNORE_FRONTEND_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -37,11 +36,10 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
|
||||
SnoreCore::SnoreCore(QSystemTrayIcon *trayIcon )
|
||||
SnoreCore::SnoreCore(QSystemTrayIcon *trayIcon)
|
||||
{
|
||||
SnoreCorePrivate::registerMetaTypes();
|
||||
d_ptr = new SnoreCorePrivate(trayIcon );
|
||||
d_ptr = new SnoreCorePrivate(trayIcon);
|
||||
Q_D(SnoreCore);
|
||||
d->q_ptr = this;
|
||||
}
|
||||
|
@ -52,76 +50,67 @@ SnoreCore::~SnoreCore()
|
|||
d->deleteLater();
|
||||
}
|
||||
|
||||
void SnoreCore::loadPlugins( SnorePlugin::PluginTypes types )
|
||||
void SnoreCore::loadPlugins(SnorePlugin::PluginTypes types)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
foreach( SnorePlugin::PluginTypes type, PluginContainer::types())
|
||||
{
|
||||
if(type != SnorePlugin::ALL && types & type)
|
||||
{
|
||||
foreach( PluginContainer *info, PluginContainer::pluginCache(type).values())
|
||||
{
|
||||
switch(info->type())
|
||||
{
|
||||
foreach(SnorePlugin::PluginTypes type, PluginContainer::types()) {
|
||||
if (type != SnorePlugin::ALL && types & type) {
|
||||
foreach(PluginContainer * info, PluginContainer::pluginCache(type).values()) {
|
||||
switch (info->type()) {
|
||||
case SnorePlugin::BACKEND:
|
||||
break;
|
||||
case SnorePlugin::SECONDARY_BACKEND:
|
||||
case SnorePlugin::FRONTEND:
|
||||
case SnorePlugin::PLUGIN:
|
||||
if(!info->load()->initialize( this ))
|
||||
{
|
||||
if (!info->load()->initialize(this)) {
|
||||
info->unload();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
snoreDebug( SNORE_WARNING ) << "Plugin Cache corrupted\n" << info->file() << info->type();
|
||||
snoreDebug(SNORE_WARNING) << "Plugin Cache corrupted\n" << info->file() << info->type();
|
||||
continue;
|
||||
}
|
||||
snoreDebug( SNORE_DEBUG ) << info->name() << "is a" << info->type();
|
||||
snoreDebug(SNORE_DEBUG) << info->name() << "is a" << info->type();
|
||||
d->m_plugins[info->type()].append(info->name());
|
||||
}
|
||||
if(d->m_plugins.contains(type))
|
||||
{
|
||||
if (d->m_plugins.contains(type)) {
|
||||
qSort(d->m_plugins[type]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
snoreDebug( SNORE_INFO ) << "Loaded Plugins:" << d->m_plugins;
|
||||
snoreDebug(SNORE_INFO) << "Loaded Plugins:" << d->m_plugins;
|
||||
}
|
||||
|
||||
void SnoreCore::broadcastNotification ( Notification notification )
|
||||
void SnoreCore::broadcastNotification(Notification notification)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
snoreDebug( SNORE_DEBUG )<<"Broadcasting"<<notification<<"timeout:"<<notification.timeout();
|
||||
if ( d->m_notificationBackend != NULL )
|
||||
{
|
||||
if(notification.isUpdate() && !d->m_notificationBackend->canUpdateNotification())
|
||||
{
|
||||
requestCloseNotification(notification.old(),Notification::REPLACED);
|
||||
snoreDebug(SNORE_DEBUG) << "Broadcasting" << notification << "timeout:" << notification.timeout();
|
||||
if (d->m_notificationBackend != NULL) {
|
||||
if (notification.isUpdate() && !d->m_notificationBackend->canUpdateNotification()) {
|
||||
requestCloseNotification(notification.old(), Notification::REPLACED);
|
||||
}
|
||||
d->m_notificationBackend->addActiveNotification(notification);
|
||||
}
|
||||
emit d->notify ( notification );
|
||||
emit d->notify(notification);
|
||||
}
|
||||
|
||||
void SnoreCore::registerApplication(const Application &application)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
if(!d->m_applications.contains(application.name()))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Registering Application:" << application;
|
||||
d->m_applications.insert ( application.name(),application );
|
||||
emit d->applicationRegistered ( application );
|
||||
if (!d->m_applications.contains(application.name())) {
|
||||
snoreDebug(SNORE_DEBUG) << "Registering Application:" << application;
|
||||
d->m_applications.insert(application.name(), application);
|
||||
emit d->applicationRegistered(application);
|
||||
}
|
||||
}
|
||||
|
||||
void SnoreCore::deregisterApplication(const Application &application)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
emit d->applicationDeregistered (application );
|
||||
d->m_applications.take ( application.name() );
|
||||
emit d->applicationDeregistered(application);
|
||||
d->m_applications.take(application.name());
|
||||
}
|
||||
|
||||
const QHash<QString, Application> &SnoreCore::aplications() const
|
||||
|
@ -130,7 +119,6 @@ const QHash<QString, Application> &SnoreCore::aplications() const
|
|||
return d->m_applications;
|
||||
}
|
||||
|
||||
|
||||
const QStringList SnoreCore::notificationBackends() const
|
||||
{
|
||||
Q_D(const SnoreCore);
|
||||
|
@ -149,31 +137,26 @@ const QStringList SnoreCore::secondaryNotificationBackends() const
|
|||
return d->m_plugins.value(SnorePlugin::SECONDARY_BACKEND);
|
||||
}
|
||||
|
||||
bool SnoreCore::setPrimaryNotificationBackend ( const QString &backend )
|
||||
bool SnoreCore::setPrimaryNotificationBackend(const QString &backend)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
if(backend == primaryNotificationBackend())
|
||||
{
|
||||
if (backend == primaryNotificationBackend()) {
|
||||
return true;
|
||||
}
|
||||
const QHash<QString,PluginContainer *> backends = PluginContainer::pluginCache(SnorePlugin::BACKEND);
|
||||
if(!backends.contains(backend))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Unknown Backend:" << backend;
|
||||
const QHash<QString, PluginContainer *> backends = PluginContainer::pluginCache(SnorePlugin::BACKEND);
|
||||
if (!backends.contains(backend)) {
|
||||
snoreDebug(SNORE_DEBUG) << "Unknown Backend:" << backend;
|
||||
return false;
|
||||
}
|
||||
snoreDebug( SNORE_DEBUG ) << "Setting Notification Backend to:" << backend;
|
||||
SnoreBackend* b = qobject_cast<SnoreBackend*>(backends.value(backend)->load());
|
||||
if(!b->isInitialized())
|
||||
{
|
||||
if(!b->initialize(this))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Failed to initialize" << b->name();
|
||||
snoreDebug(SNORE_DEBUG) << "Setting Notification Backend to:" << backend;
|
||||
SnoreBackend *b = qobject_cast<SnoreBackend *>(backends.value(backend)->load());
|
||||
if (!b->isInitialized()) {
|
||||
if (!b->initialize(this)) {
|
||||
snoreDebug(SNORE_DEBUG) << "Failed to initialize" << b->name();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(d->m_notificationBackend)
|
||||
{
|
||||
if (d->m_notificationBackend) {
|
||||
d->m_notificationBackend->deinitialize();
|
||||
}
|
||||
|
||||
|
@ -185,35 +168,28 @@ bool SnoreCore::setPrimaryNotificationBackend()
|
|||
{
|
||||
Q_D(SnoreCore);
|
||||
#ifdef Q_OS_WIN
|
||||
if(QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8 && d->setBackendIfAvailible("Windows 8"))
|
||||
{
|
||||
if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8 && d->setBackendIfAvailible("Windows 8")) {
|
||||
return true;
|
||||
}
|
||||
if(d->setBackendIfAvailible("Growl"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("Growl")) {
|
||||
return true;
|
||||
}
|
||||
if(d->setBackendIfAvailible("Snarl"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("Snarl")) {
|
||||
return true;
|
||||
}
|
||||
#elif defined(Q_OS_LINUX)
|
||||
if(d->setBackendIfAvailible("FreedesktopNotification"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("FreedesktopNotification")) {
|
||||
return true;
|
||||
}
|
||||
#elif defined(Q_OS_MAC)
|
||||
if(d->setBackendIfAvailible("OSX Notification Center"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("OSX Notification Center")) {
|
||||
return true;
|
||||
}
|
||||
if(d->setBackendIfAvailible("Growl"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("Growl")) {
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
if(d->setBackendIfAvailible("Snore"))
|
||||
{
|
||||
if (d->setBackendIfAvailible("Snore")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -222,14 +198,14 @@ bool SnoreCore::setPrimaryNotificationBackend()
|
|||
const QString SnoreCore::primaryNotificationBackend() const
|
||||
{
|
||||
Q_D(const SnoreCore);
|
||||
if(d->m_notificationBackend.isNull())
|
||||
{
|
||||
if (d->m_notificationBackend.isNull()) {
|
||||
return QString::null;
|
||||
}
|
||||
return d->m_notificationBackend->name();
|
||||
}
|
||||
|
||||
QSystemTrayIcon *SnoreCore::trayIcon(){
|
||||
QSystemTrayIcon *SnoreCore::trayIcon()
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
return d->m_trayIcon;
|
||||
}
|
||||
|
@ -237,9 +213,8 @@ QSystemTrayIcon *SnoreCore::trayIcon(){
|
|||
Notification SnoreCore::getActiveNotificationByID(uint id)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
if(!d->m_notificationBackend->isInitialized())
|
||||
{
|
||||
qFatal("Notification backend %s isn't initialized will snore will exit now",d->m_notificationBackend->name().toLatin1().constData());
|
||||
if (!d->m_notificationBackend->isInitialized()) {
|
||||
qFatal("Notification backend %s isn't initialized will snore will exit now", d->m_notificationBackend->name().toLatin1().constData());
|
||||
}
|
||||
return d->m_notificationBackend->getActiveNotificationByID(id);
|
||||
}
|
||||
|
@ -247,7 +222,7 @@ Notification SnoreCore::getActiveNotificationByID(uint id)
|
|||
void SnoreCore::requestCloseNotification(Notification n, Notification::CloseReasons r)
|
||||
{
|
||||
Q_D(SnoreCore);
|
||||
d->m_notificationBackend->requestCloseNotification(n,r);
|
||||
d->m_notificationBackend->requestCloseNotification(n, r);
|
||||
}
|
||||
|
||||
bool SnoreCore::primaryBackendSupportsRichtext()
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -33,7 +32,6 @@
|
|||
|
||||
class QSystemTrayIcon;
|
||||
|
||||
|
||||
/**
|
||||
* Snore is a platform independent Qt notification framework.
|
||||
*
|
||||
|
@ -47,7 +45,8 @@ class QSystemTrayIcon;
|
|||
* @author Patrick von Reth \<vonreth at kde.org\>
|
||||
*/
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
class SnoreCorePrivate;
|
||||
|
||||
/**
|
||||
|
@ -66,7 +65,7 @@ public:
|
|||
* Creates a Notification Manager SnoreCore
|
||||
* @param trayIcon a QSystemTrayIcon which can later be used by the fallback notification backend.
|
||||
*/
|
||||
SnoreCore (QSystemTrayIcon *trayIcon = NULL );
|
||||
SnoreCore(QSystemTrayIcon *trayIcon = NULL);
|
||||
~SnoreCore();
|
||||
|
||||
/**
|
||||
|
@ -74,14 +73,13 @@ public:
|
|||
*
|
||||
* @param types the type of tha plugin
|
||||
*/
|
||||
void loadPlugins ( SnorePlugin::PluginTypes types );
|
||||
|
||||
void loadPlugins(SnorePlugin::PluginTypes types);
|
||||
|
||||
/**
|
||||
* Broadcast a notification.
|
||||
* @param notification the Notification
|
||||
*/
|
||||
void broadcastNotification( Notification notification );
|
||||
void broadcastNotification(Notification notification);
|
||||
|
||||
/**
|
||||
* Register an application.
|
||||
|
@ -91,7 +89,7 @@ public:
|
|||
* @see broadcastNotification
|
||||
* @param application the application
|
||||
*/
|
||||
void registerApplication(const Application &application );
|
||||
void registerApplication(const Application &application);
|
||||
|
||||
/**
|
||||
* Deregisters an application.
|
||||
|
@ -101,7 +99,7 @@ public:
|
|||
* @see setPrimaryNotificationBackend
|
||||
* @param application the application
|
||||
*/
|
||||
void deregisterApplication(const Application &application );
|
||||
void deregisterApplication(const Application &application);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -133,7 +131,7 @@ public:
|
|||
* @param backend the name of the backend
|
||||
* @return whether the backend was initialied succesfully.
|
||||
*/
|
||||
bool setPrimaryNotificationBackend( const QString &backend );
|
||||
bool setPrimaryNotificationBackend(const QString &backend);
|
||||
|
||||
/**
|
||||
* Tries to set one of all backends availible on this platform as backend.
|
||||
|
@ -165,7 +163,7 @@ public:
|
|||
* Try to close a Notification if the backend supports the action.
|
||||
* @see SnoreBackend::canCloseNotification
|
||||
*/
|
||||
void requestCloseNotification(Notification,Notification::CloseReasons);
|
||||
void requestCloseNotification(Notification, Notification::CloseReasons);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -173,14 +171,12 @@ public:
|
|||
*/
|
||||
bool primaryBackendSupportsRichtext();
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @return a pointer to the private class, for internal use only.
|
||||
*/
|
||||
const SnoreCorePrivate *d();
|
||||
|
||||
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted when an action on the Notification was performed.
|
||||
|
@ -189,18 +185,17 @@ signals:
|
|||
* @todo maybe introduce a pecial action state for this case
|
||||
* @see Action
|
||||
*/
|
||||
void actionInvoked( Snore::Notification );
|
||||
void actionInvoked(Snore::Notification);
|
||||
|
||||
/**
|
||||
* This signal is emitted when a Notification is closed.
|
||||
* @see Notification::CloseReasons
|
||||
*/
|
||||
void notificationClosed(Snore::Notification );
|
||||
void notificationClosed(Snore::Notification);
|
||||
|
||||
private:
|
||||
SnoreCorePrivate *d_ptr;
|
||||
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -209,14 +204,11 @@ private:
|
|||
* @return if the string was rhichtext or html encoded a decoded string, else the original string.
|
||||
*/
|
||||
|
||||
static inline QString toPlainText ( const QString &string)
|
||||
static inline QString toPlainText(const QString &string)
|
||||
{
|
||||
if(Qt::mightBeRichText(string))
|
||||
{
|
||||
if (Qt::mightBeRichText(string)) {
|
||||
return QTextDocumentFragment::fromHtml(string).toPlainText();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -17,7 +16,6 @@
|
|||
along with SnoreNotify. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "snore_p.h"
|
||||
#include "snore.h"
|
||||
#include "plugins/plugins.h"
|
||||
|
@ -36,17 +34,16 @@ using namespace Snore;
|
|||
|
||||
SnoreCorePrivate::SnoreCorePrivate(QSystemTrayIcon *trayIcon):
|
||||
m_trayIcon(trayIcon),
|
||||
m_defaultApp("SnoreNotify",Icon(":/root/snore.png"))
|
||||
m_defaultApp("SnoreNotify", Icon(":/root/snore.png"))
|
||||
{
|
||||
snoreDebug( SNORE_INFO ) << "Version:" << Version::version();
|
||||
if( !Version::revision().isEmpty() )
|
||||
{
|
||||
snoreDebug( SNORE_INFO ) << "Revision:" << Version::revision();
|
||||
snoreDebug(SNORE_INFO) << "Version:" << Version::version();
|
||||
if (!Version::revision().isEmpty()) {
|
||||
snoreDebug(SNORE_INFO) << "Revision:" << Version::revision();
|
||||
}
|
||||
|
||||
snoreDebug( SNORE_DEBUG ) << "Temp dir is" << tempPath();
|
||||
snoreDebug(SNORE_DEBUG) << "Temp dir is" << tempPath();
|
||||
|
||||
m_defaultApp.addAlert(Alert("Default",Icon(":/root/snore.png")));
|
||||
m_defaultApp.addAlert(Alert("Default", Icon(":/root/snore.png")));
|
||||
connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(slotAboutToQuit()));
|
||||
}
|
||||
|
||||
|
@ -63,18 +60,16 @@ const Application SnoreCorePrivate::defaultApplication() const
|
|||
void SnoreCorePrivate::notificationActionInvoked(Notification notification) const
|
||||
{
|
||||
Q_Q(const SnoreCore);
|
||||
emit const_cast<SnoreCore*>(q)->actionInvoked(notification);
|
||||
if ( notification.data()->source() )
|
||||
{
|
||||
notification.data()->source()->actionInvoked ( notification );
|
||||
emit const_cast<SnoreCore *>(q)->actionInvoked(notification);
|
||||
if (notification.data()->source()) {
|
||||
notification.data()->source()->actionInvoked(notification);
|
||||
}
|
||||
}
|
||||
|
||||
bool SnoreCorePrivate::setBackendIfAvailible(const QString &backend)
|
||||
{
|
||||
Q_Q(SnoreCore);
|
||||
if( m_plugins[SnorePlugin::BACKEND].contains(backend))
|
||||
{
|
||||
if (m_plugins[SnorePlugin::BACKEND].contains(backend)) {
|
||||
return q->setPrimaryNotificationBackend(backend);
|
||||
}
|
||||
return false;
|
||||
|
@ -105,19 +100,16 @@ void SnoreCorePrivate::slotNotificationClosed(Notification n)
|
|||
{
|
||||
Q_Q(SnoreCore);
|
||||
emit q->notificationClosed(n);
|
||||
if(n.data()->source())
|
||||
{
|
||||
if (n.data()->source()) {
|
||||
n.data()->source()->notificationClosed(n);
|
||||
}
|
||||
}
|
||||
|
||||
void SnoreCorePrivate::slotAboutToQuit()
|
||||
{
|
||||
foreach (PluginContainer *p, PluginContainer::pluginCache(SnorePlugin::ALL))
|
||||
{
|
||||
if(p->isLoaded())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "deinitialize" << p->name();
|
||||
foreach(PluginContainer * p, PluginContainer::pluginCache(SnorePlugin::ALL)) {
|
||||
if (p->isLoaded()) {
|
||||
snoreDebug(SNORE_DEBUG) << "deinitialize" << p->name();
|
||||
p->load()->deinitialize();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -17,7 +16,6 @@
|
|||
along with SnoreNotify. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SNORECOREPRIVATE_H
|
||||
#define SNORECOREPRIVATE_H
|
||||
|
||||
|
@ -38,7 +36,7 @@ class SNORE_EXPORT SnoreCorePrivate : public QObject
|
|||
public:
|
||||
static inline QString computeHash(const QByteArray &data)
|
||||
{
|
||||
return QCryptographicHash::hash(data,QCryptographicHash::Md5).toHex();
|
||||
return QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex();
|
||||
}
|
||||
|
||||
static void registerMetaTypes();
|
||||
|
@ -54,11 +52,9 @@ public:
|
|||
~SnoreCorePrivate();
|
||||
const Application defaultApplication() const;
|
||||
|
||||
|
||||
void notificationActionInvoked(Notification notification) const;
|
||||
|
||||
bool setBackendIfAvailible(const QString & backend);
|
||||
|
||||
bool setBackendIfAvailible(const QString &backend);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -67,8 +63,8 @@ public:
|
|||
bool primaryBackendCanUpdateNotification() const;
|
||||
|
||||
signals:
|
||||
void applicationRegistered(const Snore::Application&);
|
||||
void applicationDeregistered(const Snore::Application&);
|
||||
void applicationRegistered(const Snore::Application &);
|
||||
void applicationDeregistered(const Snore::Application &);
|
||||
void notify(Snore::Notification noti);
|
||||
|
||||
private slots:
|
||||
|
@ -78,7 +74,7 @@ private slots:
|
|||
private:
|
||||
SnoreCore *q_ptr;
|
||||
|
||||
QHash<QString,Application> m_applications;
|
||||
QHash<QString, Application> m_applications;
|
||||
|
||||
QHash<SnorePlugin::PluginTypes, QStringList> m_plugins;
|
||||
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
|
||||
#include <QString>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
|
||||
/**
|
||||
* Version contains relevant version informations.
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
|
||||
#include <QApplication>
|
||||
|
||||
int main ( int argc, char *argv[] )
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app ( argc, argv );
|
||||
QApplication app(argc, argv);
|
||||
app.setApplicationName("SnoreNotify");
|
||||
app.setOrganizationName("SnoreNotify");
|
||||
app.setApplicationVersion(Snore::Version::version());
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -22,10 +21,8 @@
|
|||
#include <QImage>
|
||||
#include <QtGlobal>
|
||||
|
||||
|
||||
int FreedesktopImageHint::imageHintID = qDBusRegisterMetaType<FreedesktopImageHint>();
|
||||
|
||||
|
||||
FreedesktopImageHint::FreedesktopImageHint()
|
||||
{
|
||||
|
||||
|
@ -34,43 +31,45 @@ FreedesktopImageHint::FreedesktopImageHint()
|
|||
FreedesktopImageHint::FreedesktopImageHint(const QImage &img)
|
||||
{
|
||||
QImage image(img.convertToFormat(QImage::Format_ARGB32));
|
||||
imageData = QByteArray((char*)image.rgbSwapped().bits(),image.numBytes());
|
||||
imageData = QByteArray((char *)image.rgbSwapped().bits(), image.numBytes());
|
||||
width = image.width();
|
||||
height = image.height();
|
||||
rowstride = image.bytesPerLine();
|
||||
hasAlpha = image.hasAlphaChannel();
|
||||
channels = hasAlpha?4:3;
|
||||
bitsPerSample = image.depth()/channels;
|
||||
channels = hasAlpha ? 4 : 3;
|
||||
bitsPerSample = image.depth() / channels;
|
||||
|
||||
}
|
||||
|
||||
|
||||
QImage FreedesktopImageHint::toQImage() const {
|
||||
return QImage((uchar*)imageData.data(),width,height,QImage::Format_ARGB32 ).rgbSwapped();
|
||||
QImage FreedesktopImageHint::toQImage() const
|
||||
{
|
||||
return QImage((uchar *)imageData.data(), width, height, QImage::Format_ARGB32).rgbSwapped();
|
||||
}
|
||||
|
||||
QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImageHint &i) {
|
||||
QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImageHint &i)
|
||||
{
|
||||
a.beginStructure();
|
||||
a << i.width <<
|
||||
i.height <<
|
||||
i.rowstride <<
|
||||
i.hasAlpha <<
|
||||
i.bitsPerSample <<
|
||||
i.channels <<
|
||||
i.imageData;
|
||||
i.height <<
|
||||
i.rowstride <<
|
||||
i.hasAlpha <<
|
||||
i.bitsPerSample <<
|
||||
i.channels <<
|
||||
i.imageData;
|
||||
a.endStructure();
|
||||
return a;
|
||||
}
|
||||
|
||||
const QDBusArgument & operator >>(const QDBusArgument &a, FreedesktopImageHint &i) {
|
||||
const QDBusArgument &operator >>(const QDBusArgument &a, FreedesktopImageHint &i)
|
||||
{
|
||||
a.beginStructure();
|
||||
a >> i.width >>
|
||||
i.height >>
|
||||
i.rowstride >>
|
||||
i.hasAlpha >>
|
||||
i.bitsPerSample >>
|
||||
i.channels >>
|
||||
i.imageData;
|
||||
i.height >>
|
||||
i.rowstride >>
|
||||
i.hasAlpha >>
|
||||
i.bitsPerSample >>
|
||||
i.channels >>
|
||||
i.imageData;
|
||||
a.endStructure();
|
||||
return a;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -25,10 +24,9 @@
|
|||
#include <QtDBus>
|
||||
#include <QMetaType>
|
||||
|
||||
|
||||
class FreedesktopImageHint
|
||||
{
|
||||
public:
|
||||
public:
|
||||
FreedesktopImageHint();
|
||||
FreedesktopImageHint(const QImage &img);
|
||||
QImage toQImage()const;
|
||||
|
@ -44,12 +42,11 @@ public:
|
|||
private:
|
||||
static int imageHintID;
|
||||
|
||||
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(FreedesktopImageHint);
|
||||
|
||||
QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImageHint &i);
|
||||
const QDBusArgument & operator >>(const QDBusArgument &a, FreedesktopImageHint &i) ;
|
||||
const QDBusArgument &operator >>(const QDBusArgument &a, FreedesktopImageHint &i) ;
|
||||
|
||||
#endif // FreedesktopNotification_H
|
||||
|
|
|
@ -10,27 +10,25 @@
|
|||
#include "fredesktopnotification.h"
|
||||
#include "core/snore.h"
|
||||
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2 ( libsnore_backend_freedesktop,FreedesktopBackend )
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_freedesktop, FreedesktopBackend)
|
||||
|
||||
|
||||
FreedesktopBackend::FreedesktopBackend () :
|
||||
SnoreBackend ( "FreedesktopNotification", true, true, true)
|
||||
FreedesktopBackend::FreedesktopBackend() :
|
||||
SnoreBackend("FreedesktopNotification", true, true, true)
|
||||
{
|
||||
}
|
||||
|
||||
bool FreedesktopBackend::initialize(SnoreCore *snore)
|
||||
{
|
||||
|
||||
m_interface = new org::freedesktop::Notifications( "org.freedesktop.Notifications", "/org/freedesktop/Notifications",
|
||||
QDBusConnection::sessionBus(), this );
|
||||
m_interface = new org::freedesktop::Notifications("org.freedesktop.Notifications", "/org/freedesktop/Notifications",
|
||||
QDBusConnection::sessionBus(), this);
|
||||
|
||||
QDBusPendingReply<QStringList> reply = m_interface->GetCapabilities();
|
||||
reply.waitForFinished();
|
||||
QStringList caps = reply.value();
|
||||
setSupportsRichtext(caps.contains( "body-markup" ));
|
||||
setSupportsRichtext(caps.contains("body-markup"));
|
||||
connect(m_interface, SIGNAL(ActionInvoked(uint,QString)), this, SLOT(slotActionInvoked(uint,QString)));
|
||||
connect(m_interface, SIGNAL(NotificationClosed(uint,uint)), this , SLOT(slotNotificationClosed(uint,uint)));
|
||||
|
||||
|
@ -39,8 +37,7 @@ bool FreedesktopBackend::initialize(SnoreCore *snore)
|
|||
|
||||
bool FreedesktopBackend::deinitialize()
|
||||
{
|
||||
if(SnoreBackend::deinitialize())
|
||||
{
|
||||
if (SnoreBackend::deinitialize()) {
|
||||
disconnect(m_interface, SIGNAL(ActionInvoked(uint,QString)), this, SLOT(slotActionInvoked(uint,QString)));
|
||||
disconnect(m_interface, SIGNAL(NotificationClosed(uint,uint)), this , SLOT(slotNotificationClosed(uint,uint)));
|
||||
m_interface->deleteLater();
|
||||
|
@ -50,76 +47,66 @@ bool FreedesktopBackend::deinitialize()
|
|||
return false;
|
||||
}
|
||||
|
||||
void FreedesktopBackend::slotNotify ( Notification noti )
|
||||
{
|
||||
void FreedesktopBackend::slotNotify(Notification noti)
|
||||
{
|
||||
QStringList actions;
|
||||
foreach(int k,noti.actions().keys())
|
||||
{
|
||||
foreach(int k, noti.actions().keys()) {
|
||||
actions << QString::number(k) << noti.actions()[k].name();
|
||||
}
|
||||
QVariantMap hints;
|
||||
if(noti.icon().isValid())
|
||||
{
|
||||
if (noti.icon().isValid()) {
|
||||
FreedesktopImageHint image(noti.icon().image());
|
||||
hints["image_data"] = QVariant::fromValue(image);
|
||||
}
|
||||
|
||||
if(noti.priority() != Notification::NORMAL)
|
||||
{
|
||||
hints["urgency"] = (char)noti.priority()+1;
|
||||
if (noti.priority() != Notification::NORMAL) {
|
||||
hints["urgency"] = (char)noti.priority() + 1;
|
||||
}
|
||||
|
||||
if(noti.application().constHints().contains("desktop-entry"))
|
||||
{
|
||||
if (noti.application().constHints().contains("desktop-entry")) {
|
||||
hints["desktop-entry"] = noti.application().constHints().value("desktop-entry");
|
||||
}
|
||||
|
||||
uint updateId = 0;
|
||||
if(noti.isUpdate())
|
||||
{
|
||||
if (noti.isUpdate()) {
|
||||
updateId = noti.old().hints().privateValue(this, "id").toUInt();
|
||||
m_dbusIdMap.take(updateId);
|
||||
}
|
||||
|
||||
QString title = QString("%1 - %2").arg(noti.application().name(), noti.title());
|
||||
QString body(noti.text());
|
||||
if(!supportsRichtext())
|
||||
{
|
||||
if (!supportsRichtext()) {
|
||||
title = Snore::toPlainText(title);
|
||||
body = Snore::toPlainText(body);
|
||||
}
|
||||
QDBusPendingReply<uint> id = m_interface->Notify(noti.application().name(), updateId, "", title,
|
||||
body, actions, hints, noti.isSticky()?-1:noti.timeout()*1000);
|
||||
|
||||
body, actions, hints, noti.isSticky() ? -1 : noti.timeout() * 1000);
|
||||
|
||||
id.waitForFinished();
|
||||
noti.hints().setPrivateValue(this, "id", id.value());
|
||||
m_dbusIdMap[id.value()] = noti.id();
|
||||
|
||||
snoreDebug( SNORE_DEBUG ) << noti.id() << "|" << id.value();
|
||||
snoreDebug(SNORE_DEBUG) << noti.id() << "|" << id.value();
|
||||
}
|
||||
void FreedesktopBackend::slotActionInvoked(const uint &id, const QString &actionID)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << id << m_dbusIdMap[id];
|
||||
snoreDebug(SNORE_DEBUG) << id << m_dbusIdMap[id];
|
||||
Notification noti = getActiveNotificationByID(m_dbusIdMap[id]);
|
||||
if(!noti.isValid())
|
||||
{
|
||||
if (!noti.isValid()) {
|
||||
return;
|
||||
}
|
||||
noti.data()->setActionInvoked ( actionID.toInt() );
|
||||
snore()->d()->notificationActionInvoked ( noti );
|
||||
noti.data()->setActionInvoked(actionID.toInt());
|
||||
snore()->d()->notificationActionInvoked(noti);
|
||||
}
|
||||
|
||||
void FreedesktopBackend::slotCloseNotification ( Notification notification )
|
||||
void FreedesktopBackend::slotCloseNotification(Notification notification)
|
||||
{
|
||||
uint id = notification.hints().privateValue(this, "id").toUInt();
|
||||
snoreDebug( SNORE_DEBUG ) << notification.id() << id;
|
||||
snoreDebug(SNORE_DEBUG) << notification.id() << id;
|
||||
m_interface->CloseNotification(id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void FreedesktopBackend::slotNotificationClosed ( const uint &id,const uint &reason )
|
||||
void FreedesktopBackend::slotNotificationClosed(const uint &id, const uint &reason)
|
||||
{
|
||||
/*
|
||||
*
|
||||
|
@ -134,33 +121,27 @@ void FreedesktopBackend::slotNotificationClosed ( const uint &id,const uint &rea
|
|||
* 4 - Undefined/reserved reasons.
|
||||
*/
|
||||
Notification::CloseReasons closeReason;
|
||||
switch(reason)
|
||||
{
|
||||
case(1):
|
||||
switch (reason) {
|
||||
case (1):
|
||||
closeReason = Notification::TIMED_OUT;
|
||||
break;
|
||||
case(2):
|
||||
case (2):
|
||||
closeReason = Notification::DISMISSED;
|
||||
break;
|
||||
case(3):
|
||||
case (3):
|
||||
closeReason = Notification::CLOSED;
|
||||
break;
|
||||
default:
|
||||
closeReason = Notification::NONE;
|
||||
}
|
||||
|
||||
snoreDebug( SNORE_DEBUG ) << id << "|" << closeReason << reason;
|
||||
if(id == 0)
|
||||
{
|
||||
snoreDebug(SNORE_DEBUG) << id << "|" << closeReason << reason;
|
||||
if (id == 0) {
|
||||
return;
|
||||
}
|
||||
Notification noti = getActiveNotificationByID(m_dbusIdMap.take(id));
|
||||
if(noti.isValid())
|
||||
{
|
||||
if (noti.isValid()) {
|
||||
closeNotification(noti, closeReason);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -3,28 +3,26 @@
|
|||
#include "core/plugins/snorebackend.h"
|
||||
#include "notificationinterface.h"
|
||||
|
||||
class FreedesktopBackend:public Snore::SnoreBackend
|
||||
class FreedesktopBackend: public Snore::SnoreBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES ( Snore::SnoreBackend )
|
||||
Q_INTERFACES(Snore::SnoreBackend)
|
||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0")
|
||||
public:
|
||||
FreedesktopBackend();
|
||||
virtual bool initialize(Snore::SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
|
||||
|
||||
public slots:
|
||||
void slotNotify( Snore::Notification notification );
|
||||
void slotCloseNotification ( Snore::Notification notification );
|
||||
|
||||
void slotActionInvoked(const uint &id,const QString &actionID);
|
||||
void slotNotificationClosed ( const uint &id,const uint &reason );
|
||||
void slotNotify(Snore::Notification notification);
|
||||
void slotCloseNotification(Snore::Notification notification);
|
||||
|
||||
void slotActionInvoked(const uint &id, const QString &actionID);
|
||||
void slotNotificationClosed(const uint &id, const uint &reason);
|
||||
|
||||
private:
|
||||
org::freedesktop::Notifications* m_interface;
|
||||
QHash<uint,uint> m_dbusIdMap;
|
||||
|
||||
org::freedesktop::Notifications *m_interface;
|
||||
QHash<uint, uint> m_dbusIdMap;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -22,18 +21,17 @@
|
|||
#include "core/snore.h"
|
||||
#include "core/snore_p.h"
|
||||
|
||||
|
||||
#include <QtCore>
|
||||
#include <QTcpSocket>
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_growl,GrowlBackend)
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_growl, GrowlBackend)
|
||||
|
||||
GrowlBackend *GrowlBackend::s_instance = NULL;
|
||||
|
||||
GrowlBackend::GrowlBackend():
|
||||
SnoreBackend("Growl",false,false),
|
||||
SnoreBackend("Growl", false, false),
|
||||
m_id(0)
|
||||
{
|
||||
s_instance = this;
|
||||
|
@ -45,18 +43,16 @@ GrowlBackend::~GrowlBackend()
|
|||
|
||||
bool GrowlBackend::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(Growl::init((GROWL_CALLBACK)&GrowlBackend::gntpCallback) && Growl::isRunning(GROWL_TCP))
|
||||
{
|
||||
if (Growl::init((GROWL_CALLBACK)&GrowlBackend::gntpCallback) && Growl::isRunning(GROWL_TCP)) {
|
||||
return SnoreBackend::initialize(snore);
|
||||
}
|
||||
snoreDebug( SNORE_DEBUG ) << "Growl is not running";
|
||||
snoreDebug(SNORE_DEBUG) << "Growl is not running";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GrowlBackend::deinitialize()
|
||||
{
|
||||
if(!Growl::shutdown())
|
||||
{
|
||||
if (!Growl::shutdown()) {
|
||||
return false;
|
||||
}
|
||||
s_instance = NULL;
|
||||
|
@ -67,23 +63,21 @@ void GrowlBackend::slotRegisterApplication(const Application &application)
|
|||
{
|
||||
// snoreDebug( SNORE_DEBUG ) << application.name().toUtf8().constData();
|
||||
std::vector<std::string> alerts;
|
||||
foreach(const Alert &a,application.alerts())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << a.name().toUtf8().constData();
|
||||
foreach(const Alert & a, application.alerts()) {
|
||||
snoreDebug(SNORE_DEBUG) << a.name().toUtf8().constData();
|
||||
alerts.push_back(a.name().toUtf8().constData());
|
||||
}
|
||||
|
||||
Growl *growl = new Growl(GROWL_TCP, "", application.name().toUtf8().constData());
|
||||
growl->Register(alerts,application.icon().localUrl().toUtf8().constData());
|
||||
growl->Register(alerts, application.icon().localUrl().toUtf8().constData());
|
||||
|
||||
m_applications.insert(application.name(),growl);
|
||||
m_applications.insert(application.name(), growl);
|
||||
}
|
||||
|
||||
void GrowlBackend::slotDeregisterApplication(const Application &application)
|
||||
{
|
||||
Growl *growl = m_applications.take(application.name());
|
||||
if(growl == NULL)
|
||||
{
|
||||
if (growl == NULL) {
|
||||
return;
|
||||
}
|
||||
delete growl;
|
||||
|
@ -93,49 +87,40 @@ void GrowlBackend::slotNotify(Notification notification)
|
|||
{
|
||||
Growl *growl = m_applications.value(notification.application().name());
|
||||
QString alert = notification.alert().name();
|
||||
snoreDebug( SNORE_DEBUG ) << "Notify Growl:" <<notification.application() << alert << Snore::toPlainText(notification.title());
|
||||
snoreDebug(SNORE_DEBUG) << "Notify Growl:" << notification.application() << alert << Snore::toPlainText(notification.title());
|
||||
|
||||
GrowlNotificationData data(alert.toUtf8().constData(),notification.id(),
|
||||
GrowlNotificationData data(alert.toUtf8().constData(), notification.id(),
|
||||
Snore::toPlainText(notification.title()).toUtf8().constData(),
|
||||
Snore::toPlainText(notification.text()).toUtf8().constData());
|
||||
|
||||
if(notification.icon().isValid())
|
||||
{
|
||||
if (notification.icon().isValid()) {
|
||||
data.setIcon(notification.icon().localUrl().toUtf8().constData());
|
||||
}
|
||||
data.setCallbackData("1");
|
||||
growl->Notify(data);
|
||||
|
||||
|
||||
startTimeout(notification);
|
||||
}
|
||||
|
||||
void GrowlBackend::gntpCallback(growl_callback_data *data)
|
||||
{
|
||||
if(s_instance)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << data->id << QString(data->reason) << QString(data->data);
|
||||
if (s_instance) {
|
||||
snoreDebug(SNORE_DEBUG) << data->id << QString(data->reason) << QString(data->data);
|
||||
Notification n = s_instance->snore()->getActiveNotificationByID(data->id);
|
||||
if(!n.isValid())
|
||||
{
|
||||
if (!n.isValid()) {
|
||||
return;
|
||||
}
|
||||
Notification::CloseReasons r = Notification::NONE;
|
||||
std::string reason(data->reason);
|
||||
if(reason == "TIMEDOUT")
|
||||
{
|
||||
if (reason == "TIMEDOUT") {
|
||||
r = Notification::TIMED_OUT;
|
||||
}
|
||||
else if(reason == "CLOSED")
|
||||
{
|
||||
} else if (reason == "CLOSED") {
|
||||
r = Notification::DISMISSED;
|
||||
}
|
||||
else if(reason == "CLICK")
|
||||
{
|
||||
} else if (reason == "CLICK") {
|
||||
r = Notification::CLOSED;
|
||||
s_instance->snore()->d()->notificationActionInvoked(n);
|
||||
}
|
||||
s_instance->closeNotification(n,r);
|
||||
s_instance->closeNotification(n, r);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,7 +23,7 @@
|
|||
#include "growl.hpp"
|
||||
#include <string>
|
||||
|
||||
class GrowlBackend:public Snore::SnoreBackend
|
||||
class GrowlBackend: public Snore::SnoreBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(Snore::SnoreBackend)
|
||||
|
@ -35,14 +34,14 @@ public:
|
|||
~GrowlBackend();
|
||||
virtual bool initialize(Snore::SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
|
||||
|
||||
static void gntpCallback(growl_callback_data *data);
|
||||
|
||||
private:
|
||||
//a static instance for the static callback methode
|
||||
//a static instance for the static callback methode
|
||||
static GrowlBackend *s_instance;
|
||||
uint m_id;
|
||||
QHash<QString,Growl*> m_applications;
|
||||
QHash<QString, Growl *> m_applications;
|
||||
|
||||
public slots:
|
||||
void slotRegisterApplication(const Snore::Application &application);
|
||||
|
@ -50,5 +49,4 @@ public slots:
|
|||
void slotNotify(Snore::Notification notification);
|
||||
};
|
||||
|
||||
|
||||
#endif // GROWL_BACKEND_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -29,13 +28,12 @@ class OSXNotificationCenter : public Snore::SnoreBackend
|
|||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0")
|
||||
|
||||
public:
|
||||
OSXNotificationCenter();
|
||||
~OSXNotificationCenter();
|
||||
virtual bool initialize(Snore::SnoreCore *snore);
|
||||
OSXNotificationCenter();
|
||||
~OSXNotificationCenter();
|
||||
virtual bool initialize(Snore::SnoreCore *snore);
|
||||
|
||||
public slots:
|
||||
virtual void slotNotify (Snore::Notification notification);
|
||||
virtual void slotNotify(Snore::Notification notification);
|
||||
};
|
||||
|
||||
|
||||
#endif // OSXNOTIFICATIONCENTER_H
|
||||
|
|
|
@ -51,21 +51,20 @@
|
|||
|
||||
#include "SnarlInterface.h"
|
||||
|
||||
|
||||
namespace Snarl {
|
||||
namespace V42 {
|
||||
|
||||
namespace Snarl
|
||||
{
|
||||
namespace V42
|
||||
{
|
||||
|
||||
// workaround for mingw-w64 bug
|
||||
#ifdef __MINGW64_VERSION_MAJOR
|
||||
extern "C" {
|
||||
__declspec(dllimport) errno_t __cdecl strcpy_s(char * _Dst, size_t _SizeInBytes, const char *_Src);
|
||||
__declspec(dllimport) errno_t __cdecl wcscpy_s(wchar_t * _Dst, size_t _SizeInBytes, const wchar_t *_Src);
|
||||
__declspec(dllimport) errno_t __cdecl strncat_s(char *_Dst, size_t _DstSizeInChars, const char *_Src, size_t _MaxCount);
|
||||
}
|
||||
extern "C" {
|
||||
__declspec(dllimport) errno_t __cdecl strcpy_s(char *_Dst, size_t _SizeInBytes, const char *_Src);
|
||||
__declspec(dllimport) errno_t __cdecl wcscpy_s(wchar_t *_Dst, size_t _SizeInBytes, const wchar_t *_Src);
|
||||
__declspec(dllimport) errno_t __cdecl strncat_s(char *_Dst, size_t _DstSizeInChars, const char *_Src, size_t _MaxCount);
|
||||
}
|
||||
#endif //__MINGW64_VERSION_MAJOR
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Static Snarl interface functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -85,30 +84,31 @@ LONG32 SnarlInterface::DoRequest(LPCSTR request, UINT replyTimeout)
|
|||
DWORD_PTR nResult = 0;
|
||||
|
||||
HWND hWnd = GetSnarlWindow();
|
||||
if (!IsWindow(hWnd))
|
||||
if (!IsWindow(hWnd)) {
|
||||
return -SnarlEnums::ErrorNotRunning;
|
||||
}
|
||||
|
||||
// Create COPYDATASTRUCT
|
||||
COPYDATASTRUCT cds;
|
||||
cds.dwData = 0x534E4C03; // "SNL",3
|
||||
cds.cbData = (DWORD)strlen(request); // No knowledge of max string lenght
|
||||
cds.lpData = const_cast<char*>(request);
|
||||
cds.lpData = const_cast<char *>(request);
|
||||
|
||||
// Send message
|
||||
if (SendMessageTimeout(hWnd, WM_COPYDATA, (WPARAM)GetCurrentProcessId(), (LPARAM)&cds, SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, replyTimeout, &nResult) == 0)
|
||||
{
|
||||
if (SendMessageTimeout(hWnd, WM_COPYDATA, (WPARAM)GetCurrentProcessId(), (LPARAM)&cds, SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, replyTimeout, &nResult) == 0) {
|
||||
// Handle error
|
||||
DWORD nError = GetLastError();
|
||||
LONG32 errorResult = 0;
|
||||
if (nError == ERROR_TIMEOUT)
|
||||
if (nError == ERROR_TIMEOUT) {
|
||||
errorResult = -SnarlEnums::ErrorTimedOut;
|
||||
else
|
||||
} else {
|
||||
errorResult = -SnarlEnums::ErrorFailed;
|
||||
}
|
||||
|
||||
return errorResult;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
return (LONG32)nResult;
|
||||
}
|
||||
}
|
||||
|
||||
LONG32 SnarlInterface::DoRequest(LPCWSTR request, UINT replyTimeout)
|
||||
|
@ -117,8 +117,9 @@ LONG32 SnarlInterface::DoRequest(LPCWSTR request, UINT replyTimeout)
|
|||
|
||||
// Convert to UTF8
|
||||
LPSTR utf8Request = WideToUTF8(request);
|
||||
if (utf8Request == NULL)
|
||||
if (utf8Request == NULL) {
|
||||
return -SnarlEnums::ErrorCppInterface;
|
||||
}
|
||||
|
||||
nResult = DoRequest(utf8Request, replyTimeout);
|
||||
|
||||
|
@ -127,16 +128,14 @@ LONG32 SnarlInterface::DoRequest(LPCWSTR request, UINT replyTimeout)
|
|||
return nResult;
|
||||
}
|
||||
|
||||
std::basic_string<char>& SnarlInterface::Escape(std::basic_string<char>& str)
|
||||
std::basic_string<char> &SnarlInterface::Escape(std::basic_string<char> &str)
|
||||
{
|
||||
std::basic_string<char>::size_type strLength = str.length();
|
||||
for (std::basic_string<char>::size_type i = 0; i < strLength; ++i)
|
||||
{
|
||||
for (std::basic_string<char>::size_type i = 0; i < strLength; ++i) {
|
||||
if (str.at(i) == '=') {
|
||||
str.insert(++i, "=");
|
||||
++strLength;
|
||||
}
|
||||
else if (str[i] == '&') {
|
||||
} else if (str[i] == '&') {
|
||||
str.insert(++i, "&");
|
||||
++strLength;
|
||||
}
|
||||
|
@ -145,16 +144,14 @@ std::basic_string<char>& SnarlInterface::Escape(std::basic_string<char>& str)
|
|||
return str;
|
||||
}
|
||||
|
||||
std::basic_string<wchar_t>& SnarlInterface::Escape(std::basic_string<wchar_t>& str)
|
||||
std::basic_string<wchar_t> &SnarlInterface::Escape(std::basic_string<wchar_t> &str)
|
||||
{
|
||||
std::basic_string<wchar_t>::size_type strLength = str.length();
|
||||
for (std::basic_string<wchar_t>::size_type i = 0; i < strLength; ++i)
|
||||
{
|
||||
for (std::basic_string<wchar_t>::size_type i = 0; i < strLength; ++i) {
|
||||
if (str.at(i) == L'=') {
|
||||
str.insert(++i, L"=");
|
||||
++strLength;
|
||||
}
|
||||
else if (str[i] == L'&') {
|
||||
} else if (str[i] == L'&') {
|
||||
str.insert(++i, L"&");
|
||||
++strLength;
|
||||
}
|
||||
|
@ -166,15 +163,13 @@ std::basic_string<wchar_t>& SnarlInterface::Escape(std::basic_string<wchar_t>& s
|
|||
LPCTSTR SnarlInterface::GetAppPath()
|
||||
{
|
||||
HWND hWnd = GetSnarlWindow();
|
||||
if (hWnd)
|
||||
{
|
||||
if (hWnd) {
|
||||
HWND hWndPath = FindWindowEx(hWnd, NULL, _T("static"), NULL);
|
||||
if (hWndPath)
|
||||
{
|
||||
if (hWndPath) {
|
||||
TCHAR strTmp[MAX_PATH] = {0};
|
||||
int nReturn = GetWindowText(hWndPath, strTmp, MAX_PATH-1);
|
||||
int nReturn = GetWindowText(hWndPath, strTmp, MAX_PATH - 1);
|
||||
if (nReturn > 0) {
|
||||
TCHAR* strReturn = AllocateString(nReturn + 1);
|
||||
TCHAR *strReturn = AllocateString(nReturn + 1);
|
||||
_tcsncpy(strReturn, strTmp, nReturn + 1);
|
||||
strReturn[nReturn] = 0;
|
||||
return strReturn;
|
||||
|
@ -187,15 +182,15 @@ LPCTSTR SnarlInterface::GetAppPath()
|
|||
|
||||
LPCTSTR SnarlInterface::GetIconsPath()
|
||||
{
|
||||
TCHAR* szIconPath = NULL;
|
||||
TCHAR *szIconPath = NULL;
|
||||
LPCTSTR szPath = GetAppPath();
|
||||
if (!szPath)
|
||||
if (!szPath) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t nLen = 0;
|
||||
nLen = _tcsnlen(szPath, MAX_PATH);
|
||||
if (nLen > 0)
|
||||
{
|
||||
if (nLen > 0) {
|
||||
nLen += 10 + 1; // etc\\icons\\ + NULL
|
||||
szIconPath = AllocateString(nLen);
|
||||
|
||||
|
@ -223,7 +218,6 @@ BOOL SnarlInterface::IsSnarlRunning()
|
|||
return IsWindow(GetSnarlWindow());
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// SnarlInterface member functions
|
||||
// --------------------------------------------------------------------------------------------
|
||||
|
@ -267,7 +261,6 @@ LONG32 SnarlInterface::AddAction(LONG32 msgToken, LPCWSTR label, LPCWSTR cmd)
|
|||
return DoRequest(Requests::AddActionW(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::AddClass(LPCSTR classId, LPCSTR name, LPCSTR title, LPCSTR text, LPCSTR icon, LPCSTR sound, LONG32 duration, LPCSTR callback, bool enabled)
|
||||
{
|
||||
// addclass?[app-sig=<signature>|token=<application token>][&password=<password>]&id=<class identifier>&name=<class name>[&enabled=<0|1>][&callback=<callback>]
|
||||
|
@ -285,7 +278,9 @@ LONG32 SnarlInterface::AddClass(LPCSTR classId, LPCSTR name, LPCSTR title, LPCST
|
|||
spl.Add("text", text);
|
||||
spl.Add("icon", icon);
|
||||
spl.Add("sound", sound);
|
||||
if (duration != -1) spl.Add("duration", duration);
|
||||
if (duration != -1) {
|
||||
spl.Add("duration", duration);
|
||||
}
|
||||
|
||||
return DoRequest(Requests::AddClassA(), spl);
|
||||
}
|
||||
|
@ -304,12 +299,13 @@ LONG32 SnarlInterface::AddClass(LPCWSTR classId, LPCWSTR name, LPCWSTR title, LP
|
|||
spl.Add(L"text", text);
|
||||
spl.Add(L"icon", icon);
|
||||
spl.Add(L"sound", sound);
|
||||
if (duration != -1) spl.Add(L"duration", duration);
|
||||
if (duration != -1) {
|
||||
spl.Add(L"duration", duration);
|
||||
}
|
||||
|
||||
return DoRequest(Requests::AddClassW(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::ClearActions(LONG32 msgToken)
|
||||
{
|
||||
// clearactions?[token=<notification token>|app-sig=<app-sig>&uid=<uid>][&password=<password>]
|
||||
|
@ -321,7 +317,6 @@ LONG32 SnarlInterface::ClearActions(LONG32 msgToken)
|
|||
return DoRequest(Requests::ClearActionsA(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::ClearClasses()
|
||||
{
|
||||
// clearclasses?[token=app-sig=<signature>|token=<application token>][&password=<password>]
|
||||
|
@ -333,13 +328,11 @@ LONG32 SnarlInterface::ClearClasses()
|
|||
return DoRequest(Requests::ClearClassesA(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::GetLastMsgToken() const
|
||||
{
|
||||
return lastMsgToken;
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::Hide(LONG32 msgToken)
|
||||
{
|
||||
// hide?[token=<notification token>|app-sig=<app-sig>&uid=<uid>][&password=<password>]
|
||||
|
@ -351,7 +344,6 @@ LONG32 SnarlInterface::Hide(LONG32 msgToken)
|
|||
return DoRequest(Requests::HideA(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::IsVisible(LONG32 msgToken)
|
||||
{
|
||||
// isvisible?[token=<notification token>|app-sig=<app-sig>&uid=<uid>][&password=<password>]
|
||||
|
@ -363,7 +355,6 @@ LONG32 SnarlInterface::IsVisible(LONG32 msgToken)
|
|||
return DoRequest(Requests::IsVisibleA(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::Notify(LPCSTR classId, LPCSTR title, LPCSTR text, LONG32 timeout, LPCSTR iconPath, LPCSTR iconBase64, SnarlEnums::MessagePriority priority, LPCSTR uid, LPCSTR callback, LPCSTR value)
|
||||
{
|
||||
// notify?[app-sig=<signature>|token=<application token>][&password=<password>][&id=<class identifier>]
|
||||
|
@ -382,8 +373,12 @@ LONG32 SnarlInterface::Notify(LPCSTR classId, LPCSTR title, LPCSTR text, LONG32
|
|||
spl.Add("uid", uid);
|
||||
spl.Add("callback", callback);
|
||||
spl.Add("value", value);
|
||||
if (timeout != -1) spl.Add("timeout", timeout);
|
||||
if (priority != SnarlEnums::PriorityUndefined) spl.Add("priority", priority); // -1 is a legal priority
|
||||
if (timeout != -1) {
|
||||
spl.Add("timeout", timeout);
|
||||
}
|
||||
if (priority != SnarlEnums::PriorityUndefined) {
|
||||
spl.Add("priority", priority); // -1 is a legal priority
|
||||
}
|
||||
|
||||
LONG32 request = DoRequest(Requests::NotifyA(), spl);
|
||||
lastMsgToken = (request > 0) ? request : 0;
|
||||
|
@ -405,8 +400,12 @@ LONG32 SnarlInterface::Notify(LPCWSTR classId, LPCWSTR title, LPCWSTR text, LONG
|
|||
spl.Add(L"uid", uid);
|
||||
spl.Add(L"callback", callback);
|
||||
spl.Add(L"value", value);
|
||||
if (timeout != -1) spl.Add(L"timeout", timeout);
|
||||
if (priority != SnarlEnums::PriorityUndefined) spl.Add(L"priority", priority); // -1 is a legal priority
|
||||
if (timeout != -1) {
|
||||
spl.Add(L"timeout", timeout);
|
||||
}
|
||||
if (priority != SnarlEnums::PriorityUndefined) {
|
||||
spl.Add(L"priority", priority); // -1 is a legal priority
|
||||
}
|
||||
|
||||
LONG32 request = DoRequest(Requests::NotifyW(), spl);
|
||||
lastMsgToken = (request > 0) ? request : 0;
|
||||
|
@ -414,7 +413,6 @@ LONG32 SnarlInterface::Notify(LPCWSTR classId, LPCWSTR title, LPCWSTR text, LONG
|
|||
return request;
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::Register(LPCSTR signature, LPCSTR title, LPCSTR icon, LPCSTR password, HWND hWndReplyTo, LONG32 msgReply, SnarlEnums::AppFlags flags)
|
||||
{
|
||||
// register?app-sig=<signature>&title=<title>[&icon=<icon>][&password=<password>][&reply-to=<reply window>][&reply=<reply message>]
|
||||
|
@ -429,12 +427,14 @@ LONG32 SnarlInterface::Register(LPCSTR signature, LPCSTR title, LPCSTR icon, LPC
|
|||
spl.Add("flags", flags);
|
||||
|
||||
// If password was given, save and use in all other functions requiring password
|
||||
if (password != NULL && strlen(password) > 0)
|
||||
if (password != NULL && strlen(password) > 0) {
|
||||
SetPassword(password);
|
||||
}
|
||||
|
||||
LONG32 request = DoRequest(Requests::RegisterA(), spl);
|
||||
if (request > 0)
|
||||
if (request > 0) {
|
||||
appToken = request;
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
@ -451,17 +451,18 @@ LONG32 SnarlInterface::Register(LPCWSTR signature, LPCWSTR name, LPCWSTR icon, L
|
|||
spl.Add(L"flags", flags);
|
||||
|
||||
// If password was given, save and use in all other functions requiring password
|
||||
if (password != NULL && wcslen(password) > 0)
|
||||
if (password != NULL && wcslen(password) > 0) {
|
||||
SetPassword(password);
|
||||
}
|
||||
|
||||
LONG32 request = DoRequest(Requests::RegisterW(), spl);
|
||||
if (request > 0)
|
||||
if (request > 0) {
|
||||
appToken = request;
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::RemoveClass(LPCSTR classId)
|
||||
{
|
||||
// remclass?[app-sig=<signature>|token=<application token>][&password=<password>][&id=<class identifier>|&all=<0|1>]
|
||||
|
@ -487,7 +488,6 @@ LONG32 SnarlInterface::RemoveClass(LPCWSTR classId)
|
|||
return DoRequest(Requests::RemoveClassW(), spl);
|
||||
}
|
||||
|
||||
|
||||
LONG32 SnarlInterface::Unregister(LPCSTR signature)
|
||||
{
|
||||
// unregister?[app-sig=<signature>|token=<application token>][&password=<password>]
|
||||
|
@ -530,8 +530,12 @@ LONG32 SnarlInterface::Update(LONG32 msgToken, LPCSTR classId, LPCSTR title, LPC
|
|||
spl.Add("icon-base64", iconBase64);
|
||||
spl.Add("callback", callback);
|
||||
spl.Add("value", value);
|
||||
if (timeout != -1) spl.Add("timeout", timeout);
|
||||
if (priority != SnarlEnums::PriorityUndefined) spl.Add("priority", priority); // -1 is a legal priority
|
||||
if (timeout != -1) {
|
||||
spl.Add("timeout", timeout);
|
||||
}
|
||||
if (priority != SnarlEnums::PriorityUndefined) {
|
||||
spl.Add("priority", priority); // -1 is a legal priority
|
||||
}
|
||||
|
||||
return DoRequest(Requests::UpdateA(), spl);
|
||||
}
|
||||
|
@ -550,8 +554,12 @@ LONG32 SnarlInterface::Update(LONG32 msgToken, LPCWSTR classId, LPCWSTR title, L
|
|||
spl.Add(L"icon-base64", iconBase64);
|
||||
spl.Add(L"callback", callback);
|
||||
spl.Add(L"value", value);
|
||||
if (timeout != -1) spl.Add(L"timeout", timeout);
|
||||
if (priority != SnarlEnums::PriorityUndefined) spl.Add(L"priority", priority); // -1 is a legal priority
|
||||
if (timeout != -1) {
|
||||
spl.Add(L"timeout", timeout);
|
||||
}
|
||||
if (priority != SnarlEnums::PriorityUndefined) {
|
||||
spl.Add(L"priority", priority); // -1 is a legal priority
|
||||
}
|
||||
|
||||
return DoRequest(Requests::UpdateW(), spl);
|
||||
}
|
||||
|
@ -578,30 +586,26 @@ LONG32 SnarlInterface::UpdateApp(LPCWSTR title, LPCWSTR icon)
|
|||
return DoRequest(Requests::UpdateAppW(), spl);
|
||||
}*/
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Private functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
LONG32 SnarlInterface::DoRequest(LPCSTR request, SnarlParameterList<char>& spl, UINT replyTimeout)
|
||||
LONG32 SnarlInterface::DoRequest(LPCSTR request, SnarlParameterList<char> &spl, UINT replyTimeout)
|
||||
{
|
||||
// <action>[?<data>=<value>[&<data>=<value>]]
|
||||
const std::vector<SnarlParameterList<char>::PairType>&list = spl.GetList();
|
||||
const std::vector<SnarlParameterList<char>::PairType> &list = spl.GetList();
|
||||
|
||||
if (list.size() > 0)
|
||||
{
|
||||
if (list.size() > 0) {
|
||||
std::string requestStr = request;
|
||||
requestStr.append("?");
|
||||
|
||||
std::vector<SnarlParameterList<char>::PairType>::const_iterator listEnd = list.end(); // cend();
|
||||
for (std::vector<SnarlParameterList<char>::PairType>::const_iterator iter = list.begin(); // cbegin();
|
||||
iter != listEnd; ++iter)
|
||||
{
|
||||
iter != listEnd; ++iter) {
|
||||
SnarlParameterList<char>::PairType pair = *iter;
|
||||
|
||||
if (iter->second.length() > 0)
|
||||
{
|
||||
std::basic_string<char>& value = const_cast<std::basic_string<char>&>(iter->second);
|
||||
if (iter->second.length() > 0) {
|
||||
std::basic_string<char> &value = const_cast<std::basic_string<char>&>(iter->second);
|
||||
requestStr.append(iter->first).append("=").append(Escape(value));
|
||||
requestStr.append("&");
|
||||
}
|
||||
|
@ -610,28 +614,25 @@ LONG32 SnarlInterface::DoRequest(LPCSTR request, SnarlParameterList<char>& spl,
|
|||
requestStr.erase(requestStr.size() - 1);
|
||||
|
||||
return DoRequest(requestStr.c_str(), replyTimeout);
|
||||
}
|
||||
else
|
||||
} else {
|
||||
return DoRequest(request, replyTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
LONG32 SnarlInterface::DoRequest(LPCWSTR request, SnarlParameterList<wchar_t>& spl, UINT replyTimeout)
|
||||
LONG32 SnarlInterface::DoRequest(LPCWSTR request, SnarlParameterList<wchar_t> &spl, UINT replyTimeout)
|
||||
{
|
||||
// <action>[?<data>=<value>[&<data>=<value>]]
|
||||
const std::vector<SnarlParameterList<wchar_t>::PairType>&list = spl.GetList();
|
||||
const std::vector<SnarlParameterList<wchar_t>::PairType> &list = spl.GetList();
|
||||
|
||||
if (list.size() > 0)
|
||||
{
|
||||
if (list.size() > 0) {
|
||||
std::basic_string<wchar_t> requestStr = request;
|
||||
requestStr.append(L"?");
|
||||
|
||||
std::vector<SnarlParameterList<wchar_t>::PairType>::const_iterator listEnd = list.end(); // cend();
|
||||
for (std::vector<SnarlParameterList<wchar_t>::PairType>::const_iterator iter = list.begin(); // cbegin();
|
||||
iter != listEnd; ++iter)
|
||||
{
|
||||
if (iter->second.length() > 0)
|
||||
{
|
||||
std::basic_string<wchar_t>& value = const_cast<std::basic_string<wchar_t>&>(iter->second);
|
||||
iter != listEnd; ++iter) {
|
||||
if (iter->second.length() > 0) {
|
||||
std::basic_string<wchar_t> &value = const_cast<std::basic_string<wchar_t>&>(iter->second);
|
||||
requestStr.append(iter->first).append(L"=").append(Escape(value));
|
||||
requestStr.append(L"&");
|
||||
}
|
||||
|
@ -640,16 +641,17 @@ LONG32 SnarlInterface::DoRequest(LPCWSTR request, SnarlParameterList<wchar_t>& s
|
|||
requestStr.erase(requestStr.size() - 1);
|
||||
|
||||
return DoRequest(requestStr.c_str(), replyTimeout);
|
||||
}
|
||||
else
|
||||
} else {
|
||||
return DoRequest(request, replyTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
// Remember to delete [] returned string
|
||||
LPSTR SnarlInterface::WideToUTF8(LPCWSTR szWideStr)
|
||||
{
|
||||
if (szWideStr == NULL)
|
||||
if (szWideStr == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int nSize = WideCharToMultiByte(CP_UTF8, 0, szWideStr, -1, NULL, 0, NULL, NULL);
|
||||
LPSTR szUTF8 = new char[nSize];
|
||||
|
@ -662,8 +664,7 @@ void SnarlInterface::SetPassword(LPCSTR password)
|
|||
{
|
||||
ClearPassword();
|
||||
|
||||
if (password != NULL)
|
||||
{
|
||||
if (password != NULL) {
|
||||
int bufSize = (int)strlen(password) + 1;
|
||||
szPasswordA = new char[bufSize];
|
||||
szPasswordW = new wchar_t[bufSize];
|
||||
|
@ -680,8 +681,7 @@ void SnarlInterface::SetPassword(LPCWSTR password)
|
|||
{
|
||||
ClearPassword();
|
||||
|
||||
if (password != NULL)
|
||||
{
|
||||
if (password != NULL) {
|
||||
size_t bufSize = wcslen(password) + 1;
|
||||
szPasswordW = new wchar_t[bufSize];
|
||||
|
||||
|
@ -702,6 +702,6 @@ void SnarlInterface::ClearPassword()
|
|||
szPasswordW = NULL;
|
||||
}
|
||||
|
||||
|
||||
}} // namespace Snarl::V42
|
||||
}
|
||||
} // namespace Snarl::V42
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#define SNARL_INTERFACE_V42_H
|
||||
|
||||
#if defined(__MINGW32__) && !defined(MINGW_HAS_SECURE_API)
|
||||
#define MINGW_HAS_SECURE_API
|
||||
#define MINGW_HAS_SECURE_API
|
||||
#endif
|
||||
|
||||
#include <tchar.h>
|
||||
|
@ -11,397 +11,490 @@
|
|||
#include <vector>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
#ifndef SMTO_NOTIMEOUTIFNOTHUNG
|
||||
#define SMTO_NOTIMEOUTIFNOTHUNG 8
|
||||
#define SMTO_NOTIMEOUTIFNOTHUNG 8
|
||||
#endif
|
||||
|
||||
namespace Snarl
|
||||
{
|
||||
namespace V42
|
||||
{
|
||||
|
||||
namespace Snarl {
|
||||
namespace V42 {
|
||||
static LPCTSTR SnarlWindowClass = _T("w>Snarl");
|
||||
static LPCTSTR SnarlWindowTitle = _T("Snarl");
|
||||
|
||||
static LPCTSTR SnarlWindowClass = _T("w>Snarl");
|
||||
static LPCTSTR SnarlWindowTitle = _T("Snarl");
|
||||
static LPCTSTR SnarlGlobalMsg = _T("SnarlGlobalEvent");
|
||||
static LPCTSTR SnarlAppMsg = _T("SnarlAppMessage");
|
||||
|
||||
static LPCTSTR SnarlGlobalMsg = _T("SnarlGlobalEvent");
|
||||
static LPCTSTR SnarlAppMsg = _T("SnarlAppMessage");
|
||||
static const DWORD WM_SNARLTEST = WM_USER + 237;
|
||||
|
||||
static const DWORD WM_SNARLTEST = WM_USER + 237;
|
||||
/// <summary>Application requests - these values appear in wParam.<para>Application should launch its settings UI</para></summary>
|
||||
static const WPARAM AppDoPrefs = 1;
|
||||
/// <summary>Application requests - these values appear in wParam.<para>Application should show its About... dialog</para></summary>
|
||||
static const WPARAM AppDoAbout = 2;
|
||||
|
||||
/// <summary>Application requests - these values appear in wParam.<para>Application should launch its settings UI</para></summary>
|
||||
static const WPARAM AppDoPrefs = 1;
|
||||
/// <summary>Application requests - these values appear in wParam.<para>Application should show its About... dialog</para></summary>
|
||||
static const WPARAM AppDoAbout = 2;
|
||||
// Enums put in own namespace, because ANSI C++ doesn't decorate enums with tagname :(
|
||||
namespace SnarlEnums
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Global event identifiers - sent as Windows broadcast messages.
|
||||
/// These values appear in wParam of the message.
|
||||
/// </summary>
|
||||
enum GlobalEvent {
|
||||
SnarlLaunched = 1, // Snarl has just started running
|
||||
SnarlQuit = 2, // Snarl is about to stop running
|
||||
SnarlGlobalStopped = 3, // Sent when stopped by user - Also sent to registered window
|
||||
SnarlGlobalStarted = 4, // Sent when started by user - Also sent to registered window
|
||||
};
|
||||
|
||||
// Enums put in own namespace, because ANSI C++ doesn't decorate enums with tagname :(
|
||||
namespace SnarlEnums {
|
||||
enum SnarlStatus {
|
||||
Success = 0,
|
||||
|
||||
/// <summary>
|
||||
/// Global event identifiers - sent as Windows broadcast messages.
|
||||
/// These values appear in wParam of the message.
|
||||
/// </summary>
|
||||
enum GlobalEvent
|
||||
{
|
||||
SnarlLaunched = 1, // Snarl has just started running
|
||||
SnarlQuit = 2, // Snarl is about to stop running
|
||||
SnarlGlobalStopped = 3, // Sent when stopped by user - Also sent to registered window
|
||||
SnarlGlobalStarted = 4, // Sent when started by user - Also sent to registered window
|
||||
};
|
||||
// Snarl-Stopped/Started/UserAway/UserBack is defined in the GlobalEvent struct in VB6 code,
|
||||
// but are sent directly to a registered window, so in C# they are defined here instead.
|
||||
// Implemented as of Snarl R2.4 Beta3
|
||||
SnarlStopped = 3, // Sent when stopped by user - Also sent as broadcast message
|
||||
SnarlStarted, // Sent when started by user - Also sent as broadcast message
|
||||
SnarlUserAway, // Away mode was enabled
|
||||
SnarlUserBack, // Away mode was disabled
|
||||
|
||||
enum SnarlStatus
|
||||
{
|
||||
Success = 0,
|
||||
// Win32 callbacks (renamed under V42)
|
||||
CallbackRightClick = 32, // Deprecated as of V42, ex. SNARL_NOTIFICATION_CLICKED/SNARL_NOTIFICATION_CANCELLED
|
||||
CallbackTimedOut,
|
||||
CallbackInvoked, // left clicked and no default callback assigned
|
||||
CallbackMenuSelected, // HIWORD(wParam) contains 1-based menu item index
|
||||
CallbackMiddleClick, // Deprecated as of V42
|
||||
CallbackClosed,
|
||||
|
||||
// Snarl-Stopped/Started/UserAway/UserBack is defined in the GlobalEvent struct in VB6 code,
|
||||
// but are sent directly to a registered window, so in C# they are defined here instead.
|
||||
// Implemented as of Snarl R2.4 Beta3
|
||||
SnarlStopped = 3, // Sent when stopped by user - Also sent as broadcast message
|
||||
SnarlStarted, // Sent when started by user - Also sent as broadcast message
|
||||
SnarlUserAway, // Away mode was enabled
|
||||
SnarlUserBack, // Away mode was disabled
|
||||
// critical errors
|
||||
ErrorFailed = 101, // miscellaneous failure
|
||||
ErrorUnknownCommand, // specified command not recognised
|
||||
ErrorTimedOut, // Snarl took too long to respond
|
||||
//104 gen critical #4
|
||||
//105 gen critical #5
|
||||
ErrorBadSocket = 106, // invalid socket (or some other socket-related error)
|
||||
ErrorBadPacket = 107, // badly formed request
|
||||
ErrorInvalidArg = 108, // arg supplied was invalid (Added in v42.56)
|
||||
ErrorArgMissing = 109, // required argument missing
|
||||
ErrorSystem, // internal system error
|
||||
//120 libsnarl critical block
|
||||
ErrorAccessDenied = 121, // libsnarl only
|
||||
//130 SNP/3.0-specific
|
||||
ErrorUnsupportedVersion = 131, // requested SNP version is not supported
|
||||
ErrorNoActionsProvided, // empty request
|
||||
ErrorUnsupportedEncryption, // requested encryption type is not supported
|
||||
ErrorUnsupportedHashing, // requested message hashing type is not supported
|
||||
|
||||
// Win32 callbacks (renamed under V42)
|
||||
CallbackRightClick = 32, // Deprecated as of V42, ex. SNARL_NOTIFICATION_CLICKED/SNARL_NOTIFICATION_CANCELLED
|
||||
CallbackTimedOut,
|
||||
CallbackInvoked, // left clicked and no default callback assigned
|
||||
CallbackMenuSelected, // HIWORD(wParam) contains 1-based menu item index
|
||||
CallbackMiddleClick, // Deprecated as of V42
|
||||
CallbackClosed,
|
||||
// warnings
|
||||
ErrorNotRunning = 201, // Snarl handling window not found
|
||||
ErrorNotRegistered,
|
||||
ErrorAlreadyRegistered, // not used yet; sn41RegisterApp() returns existing token
|
||||
ErrorClassAlreadyExists, // not used yet
|
||||
ErrorClassBlocked,
|
||||
ErrorClassNotFound,
|
||||
ErrorNotificationNotFound,
|
||||
ErrorFlooding, // notification generated by same class within quantum
|
||||
ErrorDoNotDisturb, // DnD mode is in effect was not logged as missed
|
||||
ErrorCouldNotDisplay, // not enough space on-screen to display notification
|
||||
ErrorAuthFailure, // password mismatch
|
||||
// Release 2.4.2
|
||||
ErrorDiscarded, // discarded for some reason, e.g. foreground app match
|
||||
ErrorNotSubscribed, // subscriber not found
|
||||
|
||||
// critical errors
|
||||
ErrorFailed = 101, // miscellaneous failure
|
||||
ErrorUnknownCommand, // specified command not recognised
|
||||
ErrorTimedOut, // Snarl took too long to respond
|
||||
//104 gen critical #4
|
||||
//105 gen critical #5
|
||||
ErrorBadSocket = 106, // invalid socket (or some other socket-related error)
|
||||
ErrorBadPacket = 107, // badly formed request
|
||||
ErrorInvalidArg = 108, // arg supplied was invalid (Added in v42.56)
|
||||
ErrorArgMissing = 109, // required argument missing
|
||||
ErrorSystem, // internal system error
|
||||
//120 libsnarl critical block
|
||||
ErrorAccessDenied = 121, // libsnarl only
|
||||
//130 SNP/3.0-specific
|
||||
ErrorUnsupportedVersion = 131, // requested SNP version is not supported
|
||||
ErrorNoActionsProvided, // empty request
|
||||
ErrorUnsupportedEncryption, // requested encryption type is not supported
|
||||
ErrorUnsupportedHashing, // requested message hashing type is not supported
|
||||
// informational
|
||||
// code 250 reserved for future use
|
||||
WasMerged = 251, // notification was merged, returned token is the one we merged with
|
||||
|
||||
// warnings
|
||||
ErrorNotRunning = 201, // Snarl handling window not found
|
||||
ErrorNotRegistered,
|
||||
ErrorAlreadyRegistered, // not used yet; sn41RegisterApp() returns existing token
|
||||
ErrorClassAlreadyExists, // not used yet
|
||||
ErrorClassBlocked,
|
||||
ErrorClassNotFound,
|
||||
ErrorNotificationNotFound,
|
||||
ErrorFlooding, // notification generated by same class within quantum
|
||||
ErrorDoNotDisturb, // DnD mode is in effect was not logged as missed
|
||||
ErrorCouldNotDisplay, // not enough space on-screen to display notification
|
||||
ErrorAuthFailure, // password mismatch
|
||||
// Release 2.4.2
|
||||
ErrorDiscarded, // discarded for some reason, e.g. foreground app match
|
||||
ErrorNotSubscribed, // subscriber not found
|
||||
// callbacks
|
||||
// code 300 reserved for future use
|
||||
NotifyGone = 301, // reserved for future use
|
||||
|
||||
// informational
|
||||
// code 250 reserved for future use
|
||||
WasMerged = 251, // notification was merged, returned token is the one we merged with
|
||||
// The following are currently specific to SNP 2.0 and are effectively the
|
||||
// Win32 SNARL_CALLBACK_nnn constants with 270 added to them
|
||||
|
||||
// callbacks
|
||||
// code 300 reserved for future use
|
||||
NotifyGone = 301, // reserved for future use
|
||||
// SNARL_NOTIFY_CLICK = 302 // indicates notification was right-clicked (deprecated as of V42)
|
||||
NotifyExpired = 303,
|
||||
NotifyInvoked = 304, // note this was "ACK" in a previous life
|
||||
NotifyMenu, // indicates an item was selected from user-defined menu (deprecated as of V42)
|
||||
// SNARL_NOTIFY_EX_CLICK // user clicked the middle mouse button (deprecated as of V42)
|
||||
NotifyClosed = 307, // // user clicked the notification's close gadget (GNTP only)
|
||||
|
||||
// The following are currently specific to SNP 2.0 and are effectively the
|
||||
// Win32 SNARL_CALLBACK_nnn constants with 270 added to them
|
||||
// the following is generic to SNP and the Win32 API
|
||||
NotifyAction = 308, // user picked an action from the list, the data value will indicate which one
|
||||
|
||||
// SNARL_NOTIFY_CLICK = 302 // indicates notification was right-clicked (deprecated as of V42)
|
||||
NotifyExpired = 303,
|
||||
NotifyInvoked = 304, // note this was "ACK" in a previous life
|
||||
NotifyMenu, // indicates an item was selected from user-defined menu (deprecated as of V42)
|
||||
// SNARL_NOTIFY_EX_CLICK // user clicked the middle mouse button (deprecated as of V42)
|
||||
NotifyClosed = 307, // // user clicked the notification's close gadget (GNTP only)
|
||||
// C++ interface custom errors- not part of official API!
|
||||
ErrorCppInterface = 1001
|
||||
};
|
||||
|
||||
// the following is generic to SNP and the Win32 API
|
||||
NotifyAction = 308, // user picked an action from the list, the data value will indicate which one
|
||||
/// <summary>
|
||||
/// The priority of messages.
|
||||
/// See <cref>http://sourceforge.net/apps/mediawiki/snarlwin/index.php?title=Generic_API#notify</cref>
|
||||
/// </summary>
|
||||
enum MessagePriority {
|
||||
PriorityUndefined = -2,
|
||||
PriorityLow = -1,
|
||||
PriorityNormal = 0,
|
||||
PriorityHigh = 1
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Application flags - features this app supports.
|
||||
/// </summary>
|
||||
enum AppFlags {
|
||||
AppFlagNone = 0,
|
||||
AppHasPrefs = 1,
|
||||
AppHasAbout = 2,
|
||||
AppIsWindowless = 0x8000
|
||||
};
|
||||
|
||||
// C++ interface custom errors- not part of official API!
|
||||
ErrorCppInterface = 1001
|
||||
};
|
||||
} // namespace SnarlEnums
|
||||
|
||||
/// <summary>
|
||||
/// The priority of messages.
|
||||
/// See <cref>http://sourceforge.net/apps/mediawiki/snarlwin/index.php?title=Generic_API#notify</cref>
|
||||
/// </summary>
|
||||
enum MessagePriority
|
||||
{
|
||||
PriorityUndefined = -2,
|
||||
PriorityLow = -1,
|
||||
PriorityNormal = 0,
|
||||
PriorityHigh = 1
|
||||
};
|
||||
// ----------------------------------------------------------------------------------------
|
||||
/// SnarlParameterList class definition - Helper class, not meant for broad use
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template<class T>
|
||||
class SnarlParameterList
|
||||
{
|
||||
public:
|
||||
typedef std::pair<std::basic_string<T>, std::basic_string<T> > PairType;
|
||||
|
||||
/// <summary>
|
||||
/// Application flags - features this app supports.
|
||||
/// </summary>
|
||||
enum AppFlags
|
||||
{
|
||||
AppFlagNone = 0,
|
||||
AppHasPrefs = 1,
|
||||
AppHasAbout = 2,
|
||||
AppIsWindowless = 0x8000
|
||||
};
|
||||
|
||||
} // namespace SnarlEnums
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
/// SnarlParameterList class definition - Helper class, not meant for broad use
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template<class T>
|
||||
class SnarlParameterList
|
||||
SnarlParameterList()
|
||||
{
|
||||
public:
|
||||
typedef std::pair<std::basic_string<T>, std::basic_string<T> > PairType;
|
||||
}
|
||||
|
||||
SnarlParameterList()
|
||||
{
|
||||
explicit SnarlParameterList(int initialCapacity)
|
||||
{
|
||||
list.reserve(initialCapacity);
|
||||
}
|
||||
|
||||
void Add(const T *_key, const T *_value)
|
||||
{
|
||||
if (_value != NULL) {
|
||||
list.push_back(PairType(std::basic_string<T>(_key), std::basic_string<T>(_value))); //
|
||||
}
|
||||
}
|
||||
|
||||
explicit SnarlParameterList(int initialCapacity)
|
||||
{
|
||||
list.reserve(initialCapacity);
|
||||
}
|
||||
void Add(const T *_key, LONG32 _value)
|
||||
{
|
||||
std::basic_stringstream<T> valStr;
|
||||
valStr << _value;
|
||||
list.push_back(PairType(std::basic_string<T>(_key), valStr.str()));
|
||||
}
|
||||
|
||||
void Add(const T* _key, const T* _value)
|
||||
{
|
||||
if (_value != NULL)
|
||||
list.push_back(PairType(std::basic_string<T>(_key), std::basic_string<T>(_value))); //
|
||||
}
|
||||
|
||||
void Add(const T* _key, LONG32 _value)
|
||||
{
|
||||
void Add(const T *_key, void *_value)
|
||||
{
|
||||
if (_value != NULL) {
|
||||
std::basic_stringstream<T> valStr;
|
||||
valStr << _value;
|
||||
valStr << (INT_PTR)_value; // Uckly hack, to get stringstream to print void* as decimal not hex
|
||||
|
||||
list.push_back(PairType(std::basic_string<T>(_key), valStr.str()));
|
||||
}
|
||||
}
|
||||
|
||||
void Add(const T* _key, void* _value)
|
||||
{
|
||||
if (_value != NULL)
|
||||
{
|
||||
std::basic_stringstream<T> valStr;
|
||||
valStr << (INT_PTR)_value; // Uckly hack, to get stringstream to print void* as decimal not hex
|
||||
const std::vector<PairType> &GetList() const
|
||||
{
|
||||
return list;
|
||||
}
|
||||
|
||||
list.push_back(PairType(std::basic_string<T>(_key), valStr.str()));
|
||||
}
|
||||
}
|
||||
private:
|
||||
std::vector<PairType> list;
|
||||
};
|
||||
|
||||
const std::vector<PairType>& GetList() const
|
||||
{
|
||||
return list;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<PairType> list;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// SnarlInterface class definition
|
||||
// ----------------------------------------------------------------------------------------
|
||||
class SnarlInterface
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// SnarlInterface class definition
|
||||
// ----------------------------------------------------------------------------------------
|
||||
class SnarlInterface
|
||||
{
|
||||
public:
|
||||
/// <summary>Requests strings known by Snarl</summary>
|
||||
class Requests
|
||||
{
|
||||
public:
|
||||
/// <summary>Requests strings known by Snarl</summary>
|
||||
class Requests
|
||||
static LPCSTR AddActionA()
|
||||
{
|
||||
public:
|
||||
static LPCSTR AddActionA() { return "addaction"; }
|
||||
static LPCWSTR AddActionW() { return L"addaction"; }
|
||||
static LPCSTR AddClassA() { return "addclass"; }
|
||||
static LPCWSTR AddClassW() { return L"addclass"; }
|
||||
static LPCSTR ClearActionsA() { return "clearactions"; }
|
||||
static LPCWSTR ClearActionsW() { return L"clearactions"; }
|
||||
static LPCSTR ClearClassesA() { return "clearclasses"; }
|
||||
static LPCWSTR ClearClassesW() { return L"clearclasses"; }
|
||||
static LPCSTR HelloA() { return "hello"; }
|
||||
static LPCWSTR HelloW() { return L"hello"; }
|
||||
static LPCSTR HideA() { return "hide"; }
|
||||
static LPCWSTR HideW() { return L"hide"; }
|
||||
static LPCSTR IsVisibleA() { return "isvisible"; }
|
||||
static LPCWSTR IsVisibleW() { return L"isvisible"; }
|
||||
static LPCSTR NotifyA() { return "notify"; }
|
||||
static LPCWSTR NotifyW() { return L"notify"; }
|
||||
static LPCSTR RegisterA() { return "reg"; } // register
|
||||
static LPCWSTR RegisterW() { return L"reg"; }
|
||||
static LPCSTR RemoveClassA() { return "remclass"; }
|
||||
static LPCWSTR RemoveClassW() { return L"remclass"; }
|
||||
static LPCSTR UnregisterA() { return "unregister"; }
|
||||
static LPCWSTR UnregisterW() { return L"unregister"; }
|
||||
static LPCSTR UpdateAppA() { return "updateapp"; }
|
||||
static LPCWSTR UpdateAppW() { return L"updateapp"; }
|
||||
static LPCSTR UpdateA() { return "update"; }
|
||||
static LPCWSTR UpdateW() { return L"update"; }
|
||||
static LPCSTR VersionA() { return "version"; }
|
||||
static LPCWSTR VersionW() { return L"version"; }
|
||||
};
|
||||
return "addaction";
|
||||
}
|
||||
static LPCWSTR AddActionW()
|
||||
{
|
||||
return L"addaction";
|
||||
}
|
||||
static LPCSTR AddClassA()
|
||||
{
|
||||
return "addclass";
|
||||
}
|
||||
static LPCWSTR AddClassW()
|
||||
{
|
||||
return L"addclass";
|
||||
}
|
||||
static LPCSTR ClearActionsA()
|
||||
{
|
||||
return "clearactions";
|
||||
}
|
||||
static LPCWSTR ClearActionsW()
|
||||
{
|
||||
return L"clearactions";
|
||||
}
|
||||
static LPCSTR ClearClassesA()
|
||||
{
|
||||
return "clearclasses";
|
||||
}
|
||||
static LPCWSTR ClearClassesW()
|
||||
{
|
||||
return L"clearclasses";
|
||||
}
|
||||
static LPCSTR HelloA()
|
||||
{
|
||||
return "hello";
|
||||
}
|
||||
static LPCWSTR HelloW()
|
||||
{
|
||||
return L"hello";
|
||||
}
|
||||
static LPCSTR HideA()
|
||||
{
|
||||
return "hide";
|
||||
}
|
||||
static LPCWSTR HideW()
|
||||
{
|
||||
return L"hide";
|
||||
}
|
||||
static LPCSTR IsVisibleA()
|
||||
{
|
||||
return "isvisible";
|
||||
}
|
||||
static LPCWSTR IsVisibleW()
|
||||
{
|
||||
return L"isvisible";
|
||||
}
|
||||
static LPCSTR NotifyA()
|
||||
{
|
||||
return "notify";
|
||||
}
|
||||
static LPCWSTR NotifyW()
|
||||
{
|
||||
return L"notify";
|
||||
}
|
||||
static LPCSTR RegisterA()
|
||||
{
|
||||
return "reg"; // register
|
||||
}
|
||||
static LPCWSTR RegisterW()
|
||||
{
|
||||
return L"reg";
|
||||
}
|
||||
static LPCSTR RemoveClassA()
|
||||
{
|
||||
return "remclass";
|
||||
}
|
||||
static LPCWSTR RemoveClassW()
|
||||
{
|
||||
return L"remclass";
|
||||
}
|
||||
static LPCSTR UnregisterA()
|
||||
{
|
||||
return "unregister";
|
||||
}
|
||||
static LPCWSTR UnregisterW()
|
||||
{
|
||||
return L"unregister";
|
||||
}
|
||||
static LPCSTR UpdateAppA()
|
||||
{
|
||||
return "updateapp";
|
||||
}
|
||||
static LPCWSTR UpdateAppW()
|
||||
{
|
||||
return L"updateapp";
|
||||
}
|
||||
static LPCSTR UpdateA()
|
||||
{
|
||||
return "update";
|
||||
}
|
||||
static LPCWSTR UpdateW()
|
||||
{
|
||||
return L"update";
|
||||
}
|
||||
static LPCSTR VersionA()
|
||||
{
|
||||
return "version";
|
||||
}
|
||||
static LPCWSTR VersionW()
|
||||
{
|
||||
return L"version";
|
||||
}
|
||||
};
|
||||
|
||||
SnarlInterface();
|
||||
virtual ~SnarlInterface();
|
||||
SnarlInterface();
|
||||
virtual ~SnarlInterface();
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
// Static functions
|
||||
// ------------------------------------------------------------------------------------
|
||||
// ------------------------------------------------------------------------------------
|
||||
// Static functions
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
// Use FreeString, when SnarlInterface returns a null terminated string pointer
|
||||
static LPTSTR AllocateString(size_t n) { return new TCHAR[n]; }
|
||||
static void FreeString(LPSTR str) { delete [] str; str = NULL; }
|
||||
static void FreeString(LPCSTR str) { delete [] str; }
|
||||
static void FreeString(LPWSTR str) { delete [] str; str = NULL; }
|
||||
static void FreeString(LPCWSTR str) { delete [] str; }
|
||||
// Use FreeString, when SnarlInterface returns a null terminated string pointer
|
||||
static LPTSTR AllocateString(size_t n)
|
||||
{
|
||||
return new TCHAR[n];
|
||||
}
|
||||
static void FreeString(LPSTR str)
|
||||
{
|
||||
delete [] str;
|
||||
str = NULL;
|
||||
}
|
||||
static void FreeString(LPCSTR str)
|
||||
{
|
||||
delete [] str;
|
||||
}
|
||||
static void FreeString(LPWSTR str)
|
||||
{
|
||||
delete [] str;
|
||||
str = NULL;
|
||||
}
|
||||
static void FreeString(LPCWSTR str)
|
||||
{
|
||||
delete [] str;
|
||||
}
|
||||
|
||||
/// <summary>Send message to Snarl.</summary>
|
||||
/// <param name='request'>The request string. If using unicode version, the string will be UTF8 encoded before sending.</param>
|
||||
/// <param name='replyTimeout'>Time to wait before timeout - Default = 1000</param>
|
||||
/// <returns>
|
||||
/// Return zero or positive on Success.
|
||||
/// Negative on failure. (Get error code by abs(return_value))
|
||||
/// <see>http://sourceforge.net/apps/mediawiki/snarlwin/index.php?title=Windows_API#Return_Value</see>
|
||||
/// </returns>
|
||||
static LONG32 DoRequest(LPCSTR request, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, UINT replyTimeout = 1000);
|
||||
/// <summary>Send message to Snarl.</summary>
|
||||
/// <param name='request'>The request string. If using unicode version, the string will be UTF8 encoded before sending.</param>
|
||||
/// <param name='replyTimeout'>Time to wait before timeout - Default = 1000</param>
|
||||
/// <returns>
|
||||
/// Return zero or positive on Success.
|
||||
/// Negative on failure. (Get error code by abs(return_value))
|
||||
/// <see>http://sourceforge.net/apps/mediawiki/snarlwin/index.php?title=Windows_API#Return_Value</see>
|
||||
/// </returns>
|
||||
static LONG32 DoRequest(LPCSTR request, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, UINT replyTimeout = 1000);
|
||||
|
||||
/// <summary>Escapes a string, so it can be passed to Snarl.</summary>
|
||||
/// <remarks>
|
||||
/// Should only be used, if you are using DoRequest() and not the helper functions.
|
||||
/// Remember to Escape each key/value pair individually.
|
||||
/// </remarks>
|
||||
static std::basic_string<char>& Escape(std::basic_string<char>& str);
|
||||
static std::basic_string<wchar_t>& Escape(std::basic_string<wchar_t>& str);
|
||||
/// <summary>Escapes a string, so it can be passed to Snarl.</summary>
|
||||
/// <remarks>
|
||||
/// Should only be used, if you are using DoRequest() and not the helper functions.
|
||||
/// Remember to Escape each key/value pair individually.
|
||||
/// </remarks>
|
||||
static std::basic_string<char> &Escape(std::basic_string<char> &str);
|
||||
static std::basic_string<wchar_t> &Escape(std::basic_string<wchar_t> &str);
|
||||
|
||||
/// <summary>Returns the global Snarl Application message (V39)</summary>
|
||||
/// <returns>Returns Snarl application registered message.</returns>
|
||||
static UINT AppMsg();
|
||||
/// <summary>Returns the global Snarl Application message (V39)</summary>
|
||||
/// <returns>Returns Snarl application registered message.</returns>
|
||||
static UINT AppMsg();
|
||||
|
||||
/// <summary>
|
||||
/// Returns the value of Snarl's global registered message.
|
||||
/// Notes:
|
||||
/// Snarl registers SNARL_GLOBAL_MSG during startup which it then uses to communicate
|
||||
/// with all running applications through a Windows broadcast message. This function can
|
||||
/// only fail if for some reason the Windows RegisterWindowMessage() function fails
|
||||
/// - given this, this function *cannnot* be used to test for the presence of Snarl.
|
||||
/// </summary>
|
||||
/// <returns>A 16-bit value (translated to 32-bit) which is the registered Windows message for Snarl.</returns>
|
||||
static UINT Broadcast();
|
||||
/// <summary>
|
||||
/// Returns the value of Snarl's global registered message.
|
||||
/// Notes:
|
||||
/// Snarl registers SNARL_GLOBAL_MSG during startup which it then uses to communicate
|
||||
/// with all running applications through a Windows broadcast message. This function can
|
||||
/// only fail if for some reason the Windows RegisterWindowMessage() function fails
|
||||
/// - given this, this function *cannnot* be used to test for the presence of Snarl.
|
||||
/// </summary>
|
||||
/// <returns>A 16-bit value (translated to 32-bit) which is the registered Windows message for Snarl.</returns>
|
||||
static UINT Broadcast();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where Snarl is installed.
|
||||
/// ** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where Snarl is installed.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetAppPath();
|
||||
/// <summary>
|
||||
/// Get the path to where Snarl is installed.
|
||||
/// ** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where Snarl is installed.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetAppPath();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where the default Snarl icons are located.
|
||||
/// <para>** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!</para>
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where the default Snarl icons are located.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetIconsPath();
|
||||
/// <summary>
|
||||
/// Get the path to where the default Snarl icons are located.
|
||||
/// <para>** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!</para>
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where the default Snarl icons are located.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetIconsPath();
|
||||
|
||||
/// <summary>Returns a handle to the Snarl Dispatcher window (V37)</summary>
|
||||
/// <returns>Returns handle to Snarl Dispatcher window, or zero if it's not found.</returns>
|
||||
/// <remarks>This is now the preferred way to test if Snarl is actually running.</remarks>
|
||||
static HWND GetSnarlWindow();
|
||||
/// <summary>Returns a handle to the Snarl Dispatcher window (V37)</summary>
|
||||
/// <returns>Returns handle to Snarl Dispatcher window, or zero if it's not found.</returns>
|
||||
/// <remarks>This is now the preferred way to test if Snarl is actually running.</remarks>
|
||||
static HWND GetSnarlWindow();
|
||||
|
||||
/// <summary>Get Snarl version, if it is running.</summary>
|
||||
/// <returns>Returns a number indicating Snarl version.</returns>
|
||||
static LONG32 GetVersion();
|
||||
/// <summary>Get Snarl version, if it is running.</summary>
|
||||
/// <returns>Returns a number indicating Snarl version.</returns>
|
||||
static LONG32 GetVersion();
|
||||
|
||||
/// <summary>Check whether Snarl is running</summary>
|
||||
/// <returns>Returns true if Snarl system was found running.</returns>
|
||||
static BOOL IsSnarlRunning();
|
||||
/// <summary>Check whether Snarl is running</summary>
|
||||
/// <returns>Returns true if Snarl system was found running.</returns>
|
||||
static BOOL IsSnarlRunning();
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
/// <summary>Adds an action to an existing (on-screen or in the missed list) notification.</summary>
|
||||
LONG32 AddAction(LONG32 msgToken, LPCSTR label, LPCSTR cmd);
|
||||
LONG32 AddAction(LONG32 msgToken, LPCWSTR label, LPCWSTR cmd);
|
||||
|
||||
/// <summary>Add a notification class to Snarl.</summary>
|
||||
LONG32 AddClass(LPCSTR classId, LPCSTR name, LPCSTR title = NULL, LPCSTR text = NULL, LPCSTR icon = NULL, LPCSTR sound = NULL, LONG32 duration = NULL, LPCSTR callback = NULL, bool enabled = true);
|
||||
LONG32 AddClass(LPCWSTR classId, LPCWSTR name, LPCWSTR title = NULL, LPCWSTR text = NULL, LPCWSTR icon = NULL, LPCWSTR sound = NULL, LONG32 duration = -1, LPCWSTR callback = NULL, bool enabled = true);
|
||||
|
||||
/// <summary>Adds an action to an existing (on-screen or in the missed list) notification.</summary>
|
||||
LONG32 AddAction(LONG32 msgToken, LPCSTR label, LPCSTR cmd);
|
||||
LONG32 AddAction(LONG32 msgToken, LPCWSTR label, LPCWSTR cmd);
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearActions(LONG32 msgToken);
|
||||
|
||||
/// <summary>Add a notification class to Snarl.</summary>
|
||||
LONG32 AddClass(LPCSTR classId, LPCSTR name, LPCSTR title = NULL, LPCSTR text = NULL, LPCSTR icon = NULL, LPCSTR sound = NULL, LONG32 duration = NULL, LPCSTR callback = NULL, bool enabled = true);
|
||||
LONG32 AddClass(LPCWSTR classId, LPCWSTR name, LPCWSTR title = NULL, LPCWSTR text = NULL, LPCWSTR icon = NULL, LPCWSTR sound = NULL, LONG32 duration = -1, LPCWSTR callback = NULL, bool enabled = true);
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearClasses();
|
||||
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearActions(LONG32 msgToken);
|
||||
/// <summary>GetLastMsgToken() returns token of the last message sent to Snarl.</summary>
|
||||
/// <returns>Returns message token of last message.</returns>
|
||||
/// <remarks>This function is not in the official API!</remarks>
|
||||
LONG32 GetLastMsgToken() const;
|
||||
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearClasses();
|
||||
/// <summary>Hide a Snarl notification.</summary>
|
||||
LONG32 Hide(LONG32 msgToken);
|
||||
|
||||
/// <summary>GetLastMsgToken() returns token of the last message sent to Snarl.</summary>
|
||||
/// <returns>Returns message token of last message.</returns>
|
||||
/// <remarks>This function is not in the official API!</remarks>
|
||||
LONG32 GetLastMsgToken() const;
|
||||
/// <summary>Test if a Snarl notification is visible. If the message is visible the function returns SnarlEnums::Success.</summary>
|
||||
LONG32 IsVisible(LONG32 msgToken);
|
||||
|
||||
/// <summary>Hide a Snarl notification.</summary>
|
||||
LONG32 Hide(LONG32 msgToken);
|
||||
/// <summary>Show a Snarl notification.</summary>
|
||||
/// <returns>Returns the notification token or negative on failure.</returns>
|
||||
/// <remarks>You can use <see cref="GetLastMsgToken()" /> to get the last token.</remarks>
|
||||
LONG32 Notify(LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCSTR uid = NULL, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Notify(LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCWSTR uid = NULL, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
|
||||
/// <summary>Test if a Snarl notification is visible. If the message is visible the function returns SnarlEnums::Success.</summary>
|
||||
LONG32 IsVisible(LONG32 msgToken);
|
||||
/// <summary>Register application with Snarl.</summary>
|
||||
/// <returns>The application token or negative on failure.</returns>
|
||||
/// <remarks>The application token is saved in SnarlInterface member variable, so just use return value to check for error.</remarks>
|
||||
LONG32 Register(LPCSTR signature, LPCSTR title, LPCSTR icon = NULL, LPCSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppFlagNone);
|
||||
LONG32 Register(LPCWSTR signature, LPCWSTR title, LPCWSTR icon = NULL, LPCWSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppFlagNone);
|
||||
|
||||
/// <summary>Show a Snarl notification.</summary>
|
||||
/// <returns>Returns the notification token or negative on failure.</returns>
|
||||
/// <remarks>You can use <see cref="GetLastMsgToken()" /> to get the last token.</remarks>
|
||||
LONG32 Notify(LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCSTR uid = NULL, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Notify(LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCWSTR uid = NULL, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
/// <summary>Remove a notification class added with AddClass().</summary>
|
||||
LONG32 RemoveClass(LPCSTR classId);
|
||||
LONG32 RemoveClass(LPCWSTR classId);
|
||||
|
||||
/// <summary>Register application with Snarl.</summary>
|
||||
/// <returns>The application token or negative on failure.</returns>
|
||||
/// <remarks>The application token is saved in SnarlInterface member variable, so just use return value to check for error.</remarks>
|
||||
LONG32 Register(LPCSTR signature, LPCSTR title, LPCSTR icon = NULL, LPCSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppFlagNone);
|
||||
LONG32 Register(LPCWSTR signature, LPCWSTR title, LPCWSTR icon = NULL, LPCWSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppFlagNone);
|
||||
/// <summary>Update the text or other parameters of a visible Snarl notification.</summary>
|
||||
LONG32 Update(LONG32 msgToken, LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Update(LONG32 msgToken, LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
|
||||
/// <summary>Remove a notification class added with AddClass().</summary>
|
||||
LONG32 RemoveClass(LPCSTR classId);
|
||||
LONG32 RemoveClass(LPCWSTR classId);
|
||||
/// <summary>Unregister application with Snarl when application is closing.</summary>
|
||||
LONG32 Unregister(LPCSTR signature);
|
||||
LONG32 Unregister(LPCWSTR signature);
|
||||
|
||||
/// <summary>Update the text or other parameters of a visible Snarl notification.</summary>
|
||||
LONG32 Update(LONG32 msgToken, LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Update(LONG32 msgToken, LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, SnarlEnums::MessagePriority priority = SnarlEnums::PriorityUndefined, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
/// <summary>Update information provided when calling RegisterApp.</summary>
|
||||
/*LONG32 UpdateApp(LPCSTR title = NULL, LPCSTR icon = NULL);
|
||||
LONG32 UpdateApp(LPCWSTR title = NULL, LPCWSTR icon = NULL);*/
|
||||
|
||||
/// <summary>Unregister application with Snarl when application is closing.</summary>
|
||||
LONG32 Unregister(LPCSTR signature);
|
||||
LONG32 Unregister(LPCWSTR signature);
|
||||
private:
|
||||
|
||||
/// <summary>Update information provided when calling RegisterApp.</summary>
|
||||
/*LONG32 UpdateApp(LPCSTR title = NULL, LPCSTR icon = NULL);
|
||||
LONG32 UpdateApp(LPCWSTR title = NULL, LPCWSTR icon = NULL);*/
|
||||
/// <summary>Convert a unicode string to UTF8</summary>
|
||||
/// <returns>Returns pointer to the new string - Remember to delete [] returned string !</returns>
|
||||
/// <remarks>Remember to call FreeString on returned string !!!</remarks>
|
||||
static LPSTR WideToUTF8(LPCWSTR szWideStr);
|
||||
|
||||
static LONG32 DoRequest(LPCSTR request, SnarlParameterList<char> &spl, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, SnarlParameterList<wchar_t> &spl, UINT replyTimeout = 1000);
|
||||
|
||||
private:
|
||||
void SetPassword(LPCSTR password);
|
||||
void SetPassword(LPCWSTR password);
|
||||
void ClearPassword();
|
||||
|
||||
/// <summary>Convert a unicode string to UTF8</summary>
|
||||
/// <returns>Returns pointer to the new string - Remember to delete [] returned string !</returns>
|
||||
/// <remarks>Remember to call FreeString on returned string !!!</remarks>
|
||||
static LPSTR WideToUTF8(LPCWSTR szWideStr);
|
||||
LONG32 appToken;
|
||||
LONG32 lastMsgToken;
|
||||
LPSTR szPasswordA;
|
||||
LPWSTR szPasswordW;
|
||||
}; // class SnarlInterface
|
||||
|
||||
static LONG32 DoRequest(LPCSTR request, SnarlParameterList<char>& spl, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, SnarlParameterList<wchar_t>& spl, UINT replyTimeout = 1000);
|
||||
|
||||
void SetPassword(LPCSTR password);
|
||||
void SetPassword(LPCWSTR password);
|
||||
void ClearPassword();
|
||||
|
||||
LONG32 appToken;
|
||||
LONG32 lastMsgToken;
|
||||
LPSTR szPasswordA;
|
||||
LPWSTR szPasswordW;
|
||||
}; // class SnarlInterface
|
||||
|
||||
} // namespace V42
|
||||
} // namespace V42
|
||||
} // namespace Snarl
|
||||
|
||||
#endif // SNARL_INTERFACE_V42_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -28,57 +27,53 @@
|
|||
#include <QtDebug>
|
||||
#include <QWidget>
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
#define SNORENOTIFIER_MESSAGE_ID WM_USER + 238
|
||||
|
||||
using namespace Snore;
|
||||
using namespace Snarl::V42;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snarl,SnarlBackend)
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snarl, SnarlBackend)
|
||||
|
||||
class SnarlBackend::SnarlWidget:public QWidget
|
||||
class SnarlBackend::SnarlWidget: public QWidget
|
||||
{
|
||||
//Q_OBJECT
|
||||
public:
|
||||
SnarlWidget(SnarlBackend * snarl):
|
||||
SnarlWidget(SnarlBackend *snarl):
|
||||
m_snarl(snarl)
|
||||
{
|
||||
SNARL_GLOBAL_MESSAGE = SnarlInterface::Broadcast();
|
||||
}
|
||||
|
||||
bool winEvent( MSG * msg, long * result ){
|
||||
bool winEvent(MSG *msg, long *result)
|
||||
{
|
||||
Q_UNUSED(result);
|
||||
if(msg->message == SNARL_GLOBAL_MESSAGE){
|
||||
if (msg->message == SNARL_GLOBAL_MESSAGE) {
|
||||
int action = msg->wParam;
|
||||
if(action == SnarlEnums::SnarlLaunched){
|
||||
foreach(const Application &a,m_snarl->snore()->aplications())
|
||||
{
|
||||
if (action == SnarlEnums::SnarlLaunched) {
|
||||
foreach(const Application & a, m_snarl->snore()->aplications()) {
|
||||
m_snarl->slotRegisterApplication(a);
|
||||
}
|
||||
}
|
||||
|
||||
}else if(msg->message == SNORENOTIFIER_MESSAGE_ID){
|
||||
} else if (msg->message == SNORENOTIFIER_MESSAGE_ID) {
|
||||
int action = msg->wParam & 0xffff;
|
||||
int data = (msg->wParam & 0xffffffff) >> 16;
|
||||
|
||||
Notification notification;
|
||||
if(msg->lParam != 0)
|
||||
{
|
||||
if (msg->lParam != 0) {
|
||||
notification = m_snarl->snore()->getActiveNotificationByID(m_snarl->m_idMap.value(msg->lParam));
|
||||
}
|
||||
|
||||
Notification::CloseReasons reason = Notification::NONE;
|
||||
switch(action){
|
||||
switch (action) {
|
||||
case SnarlEnums::CallbackInvoked:
|
||||
reason = Notification::CLOSED;
|
||||
break;
|
||||
case SnarlEnums::NotifyAction:
|
||||
reason = Notification::CLOSED;
|
||||
if(notification.isValid())
|
||||
{
|
||||
if (notification.isValid()) {
|
||||
notification.data()->setActionInvoked(data);
|
||||
m_snarl->snore()->d()->notificationActionInvoked(notification);
|
||||
}
|
||||
|
@ -89,26 +84,23 @@ public:
|
|||
case SnarlEnums::CallbackTimedOut:
|
||||
reason = Notification::TIMED_OUT;
|
||||
break;
|
||||
//away stuff
|
||||
//away stuff
|
||||
case SnarlEnums::SnarlUserAway:
|
||||
snoreDebug( SNORE_DEBUG )<<"Snalr user has gone away";
|
||||
snoreDebug(SNORE_DEBUG) << "Snalr user has gone away";
|
||||
return true;
|
||||
case SnarlEnums::SnarlUserBack:
|
||||
snoreDebug( SNORE_DEBUG )<<"Snalr user has returned";
|
||||
snoreDebug(SNORE_DEBUG) << "Snalr user has returned";
|
||||
return true;
|
||||
default:
|
||||
snoreDebug( SNORE_DEBUG )<<"Unknown snarl action found!!";
|
||||
snoreDebug(SNORE_DEBUG) << "Unknown snarl action found!!";
|
||||
return false;
|
||||
}
|
||||
if(notification.isValid())
|
||||
{
|
||||
m_snarl->closeNotification(notification,reason);
|
||||
if (notification.isValid()) {
|
||||
m_snarl->closeNotification(notification, reason);
|
||||
m_snarl->m_idMap.take(msg->lParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Snarl notification already closed" << msg->lParam << action;
|
||||
snoreDebug( SNORE_DEBUG ) << m_snarl->m_idMap;
|
||||
} else {
|
||||
snoreDebug(SNORE_DEBUG) << "Snarl notification already closed" << msg->lParam << action;
|
||||
snoreDebug(SNORE_DEBUG) << m_snarl->m_idMap;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -117,11 +109,10 @@ public:
|
|||
|
||||
private:
|
||||
uint SNARL_GLOBAL_MESSAGE;
|
||||
SnarlBackend* m_snarl;
|
||||
SnarlBackend *m_snarl;
|
||||
|
||||
};
|
||||
|
||||
|
||||
SnarlBackend::SnarlBackend():
|
||||
SnoreBackend("Snarl", true, false, true)
|
||||
{
|
||||
|
@ -133,27 +124,23 @@ SnarlBackend::~SnarlBackend()
|
|||
|
||||
}
|
||||
|
||||
|
||||
bool SnarlBackend::initialize(SnoreCore *snore)
|
||||
{
|
||||
SnarlInterface *snarlInterface = new SnarlInterface();
|
||||
if(!snarlInterface->IsSnarlRunning())
|
||||
{
|
||||
if (!snarlInterface->IsSnarlRunning()) {
|
||||
delete snarlInterface;
|
||||
return false;
|
||||
}
|
||||
m_eventLoop = new SnarlBackend::SnarlWidget(this);
|
||||
snoreDebug( SNORE_DEBUG ) << "Initiating Snarl Backend, Snarl version: " << snarlInterface->GetVersion();
|
||||
snoreDebug(SNORE_DEBUG) << "Initiating Snarl Backend, Snarl version: " << snarlInterface->GetVersion();
|
||||
delete snarlInterface;
|
||||
return SnoreBackend::initialize(snore);
|
||||
}
|
||||
|
||||
bool SnarlBackend::deinitialize()
|
||||
{
|
||||
if(SnoreBackend::deinitialize())
|
||||
{
|
||||
if(m_eventLoop)
|
||||
{
|
||||
if (SnoreBackend::deinitialize()) {
|
||||
if (m_eventLoop) {
|
||||
m_eventLoop->deleteLater();
|
||||
m_eventLoop = NULL;
|
||||
}
|
||||
|
@ -162,52 +149,50 @@ bool SnarlBackend::deinitialize()
|
|||
return false;
|
||||
}
|
||||
|
||||
void SnarlBackend::slotRegisterApplication(const Application &application){
|
||||
void SnarlBackend::slotRegisterApplication(const Application &application)
|
||||
{
|
||||
|
||||
Q_ASSERT_X(!m_applications.contains(application.name()), Q_FUNC_INFO, "Application already registered");
|
||||
|
||||
SnarlInterface *snarlInterface = new SnarlInterface();
|
||||
m_applications.insert(application.name(),snarlInterface);
|
||||
m_applications.insert(application.name(), snarlInterface);
|
||||
|
||||
QString appName = application.name().replace(" ","_");//app sig must not contain spaces
|
||||
QString appName = application.name().replace(" ", "_"); //app sig must not contain spaces
|
||||
snarlInterface->Register(appName.toUtf8().constData(),
|
||||
application.name().toUtf8().constData(),
|
||||
application.icon().localUrl().toUtf8().constData(),
|
||||
0,(HWND)m_eventLoop->winId(),SNORENOTIFIER_MESSAGE_ID);
|
||||
0, (HWND)m_eventLoop->winId(), SNORENOTIFIER_MESSAGE_ID);
|
||||
|
||||
foreach(const Alert &alert,application.alerts())
|
||||
{
|
||||
foreach(const Alert & alert, application.alerts()) {
|
||||
snarlInterface->AddClass(alert.name().toUtf8().constData(),
|
||||
alert.name().toUtf8().constData(),
|
||||
0,0,alert.icon().localUrl().toUtf8().constData());
|
||||
0, 0, alert.icon().localUrl().toUtf8().constData());
|
||||
}
|
||||
}
|
||||
|
||||
void SnarlBackend::slotDeregisterApplication(const Application &application)
|
||||
{
|
||||
if(!m_applications.contains(application.name()))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Unknown apllication: " << application.name();
|
||||
if (!m_applications.contains(application.name())) {
|
||||
snoreDebug(SNORE_DEBUG) << "Unknown apllication: " << application.name();
|
||||
return;
|
||||
}
|
||||
SnarlInterface *snarlInterface = m_applications.take(application.name());
|
||||
QString appName = application.name().replace(" ","_");//app sig must not contain spaces
|
||||
QString appName = application.name().replace(" ", "_"); //app sig must not contain spaces
|
||||
snarlInterface->Unregister(appName.toUtf8().constData());
|
||||
delete snarlInterface;
|
||||
}
|
||||
|
||||
void SnarlBackend::slotNotify(Notification notification){
|
||||
if(!m_applications.contains(notification.application().name()))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Unknown apllication: " << notification.application().name();
|
||||
void SnarlBackend::slotNotify(Notification notification)
|
||||
{
|
||||
if (!m_applications.contains(notification.application().name())) {
|
||||
snoreDebug(SNORE_DEBUG) << "Unknown apllication: " << notification.application().name();
|
||||
return;
|
||||
}
|
||||
|
||||
SnarlInterface *snarlInterface = m_applications.value(notification.application().name());
|
||||
|
||||
Snarl::V42::SnarlEnums::MessagePriority priority = Snarl::V42::SnarlEnums::PriorityUndefined;
|
||||
switch(notification.priority())
|
||||
{
|
||||
switch (notification.priority()) {
|
||||
case Notification::LOW:
|
||||
priority = Snarl::V42::SnarlEnums::PriorityLow;
|
||||
break;
|
||||
|
@ -219,28 +204,24 @@ void SnarlBackend::slotNotify(Notification notification){
|
|||
break;
|
||||
}
|
||||
|
||||
ULONG32 id = 0;
|
||||
snoreDebug( SNORE_DEBUG ) << notification.icon();
|
||||
ULONG32 id = 0;
|
||||
snoreDebug(SNORE_DEBUG) << notification.icon();
|
||||
|
||||
if(!notification.isUpdate())
|
||||
{
|
||||
id = snarlInterface->Notify(notification.alert().name().toUtf8().constData(),
|
||||
Snore::toPlainText(notification.title()).toUtf8().constData(),
|
||||
Snore::toPlainText(notification.text()).toUtf8().constData(),
|
||||
notification.timeout(),
|
||||
notification.icon().isLocalFile()?notification.icon().localUrl().toUtf8().constData():0,
|
||||
!notification.icon().isLocalFile()?Icon::dataFromImage(notification.icon().image()).toBase64().constData():0,
|
||||
priority);
|
||||
if (!notification.isUpdate()) {
|
||||
id = snarlInterface->Notify(notification.alert().name().toUtf8().constData(),
|
||||
Snore::toPlainText(notification.title()).toUtf8().constData(),
|
||||
Snore::toPlainText(notification.text()).toUtf8().constData(),
|
||||
notification.timeout(),
|
||||
notification.icon().isLocalFile() ? notification.icon().localUrl().toUtf8().constData() : 0,
|
||||
!notification.icon().isLocalFile() ? Icon::dataFromImage(notification.icon().image()).toBase64().constData() : 0,
|
||||
priority);
|
||||
|
||||
foreach(const Action &a, notification.actions())
|
||||
{
|
||||
snarlInterface->AddAction(id,a.name().toUtf8().constData(),QString("@").append(QString::number(a.id())).toUtf8().constData());
|
||||
foreach(const Action & a, notification.actions()) {
|
||||
snarlInterface->AddAction(id, a.name().toUtf8().constData(), QString("@").append(QString::number(a.id())).toUtf8().constData());
|
||||
}
|
||||
m_idMap[id] = notification.id();
|
||||
notification.hints().setPrivateValue(this, "id", id);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//update message
|
||||
id = notification.old().hints().privateValue(this, "id").toUInt();
|
||||
snarlInterface->Update(id,
|
||||
|
@ -248,8 +229,8 @@ void SnarlBackend::slotNotify(Notification notification){
|
|||
Snore::toPlainText(notification.title()).toUtf8().constData(),
|
||||
Snore::toPlainText(notification.text()).toUtf8().constData(),
|
||||
notification.timeout(),
|
||||
notification.icon().isLocalFile()?notification.icon().localUrl().toUtf8().constData():0,
|
||||
!notification.icon().isLocalFile()?Icon::dataFromImage(notification.icon().image()).toBase64().constData():0,
|
||||
notification.icon().isLocalFile() ? notification.icon().localUrl().toUtf8().constData() : 0,
|
||||
!notification.icon().isLocalFile() ? Icon::dataFromImage(notification.icon().image()).toBase64().constData() : 0,
|
||||
priority);
|
||||
}
|
||||
|
||||
|
@ -260,9 +241,8 @@ void SnarlBackend::slotNotify(Notification notification){
|
|||
|
||||
void SnarlBackend::slotCloseNotification(Notification notification)
|
||||
{
|
||||
if(!m_applications.contains(notification.application().name()))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Unknown apllication: " << notification.application().name();
|
||||
if (!m_applications.contains(notification.application().name())) {
|
||||
snoreDebug(SNORE_DEBUG) << "Unknown apllication: " << notification.application().name();
|
||||
return;
|
||||
}
|
||||
ULONG32 id = notification.hints().privateValue(this, "id").toUInt();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -22,9 +21,7 @@
|
|||
#include "core/plugins/snorebackend.h"
|
||||
#include "SnarlInterface.h"
|
||||
|
||||
|
||||
|
||||
class SnarlBackend:public Snore::SnoreBackend
|
||||
class SnarlBackend: public Snore::SnoreBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(Snore::SnoreBackend)
|
||||
|
@ -37,8 +34,8 @@ public:
|
|||
|
||||
private:
|
||||
class SnarlWidget;
|
||||
SnarlBackend::SnarlWidget* m_eventLoop;
|
||||
QHash<QString,Snarl::V42::SnarlInterface*> m_applications;
|
||||
SnarlBackend::SnarlWidget *m_eventLoop;
|
||||
QHash<QString, Snarl::V42::SnarlInterface *> m_applications;
|
||||
|
||||
public slots:
|
||||
void slotRegisterApplication(const Snore::Application &application);
|
||||
|
@ -47,9 +44,8 @@ public slots:
|
|||
void slotCloseNotification(Snore::Notification notification);
|
||||
|
||||
private:
|
||||
QHash<LONG32,uint> m_idMap;
|
||||
QHash<LONG32, uint> m_idMap;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // SNARL_BACKEND_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -29,9 +28,9 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
NotifyWidget::NotifyWidget(int pos,QWidget *parent) :
|
||||
NotifyWidget::NotifyWidget(int pos, QWidget *parent) :
|
||||
QDeclarativeView(QUrl("qrc:/notification.qml"), parent),
|
||||
m_animation( new QPropertyAnimation(this, "pos")),
|
||||
m_animation(new QPropertyAnimation(this, "pos")),
|
||||
m_id(pos),
|
||||
m_mem(QString("SnoreNotifyWidget_rev%1_id%2").arg(QString::number(SHARED_MEM_TYPE_REV()), QString::number(m_id))),
|
||||
m_ready(true)
|
||||
|
@ -39,36 +38,31 @@ NotifyWidget::NotifyWidget(int pos,QWidget *parent) :
|
|||
m_qmlNotification = rootObject();
|
||||
|
||||
this->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
| Qt::WindowDoesNotAcceptFocus
|
||||
#endif
|
||||
);
|
||||
if(m_mem.create(sizeof(SHARED_MEM_TYPE)))
|
||||
{
|
||||
#endif
|
||||
);
|
||||
if (m_mem.create(sizeof(SHARED_MEM_TYPE))) {
|
||||
m_mem.lock();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE*)m_mem.data();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE *)m_mem.data();
|
||||
data->free = true;
|
||||
data->date = QTime::currentTime();
|
||||
m_mem.unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!m_mem.attach())
|
||||
{
|
||||
} else {
|
||||
if (!m_mem.attach()) {
|
||||
qFatal("Failed to atatche to shared mem");
|
||||
}
|
||||
m_mem.lock();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE*)m_mem.data();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE *)m_mem.data();
|
||||
m_mem.unlock();
|
||||
snoreDebug( SNORE_DEBUG ) << "Status" << data->free << data->date.elapsed() / 1000;
|
||||
snoreDebug(SNORE_DEBUG) << "Status" << data->free << data->date.elapsed() / 1000;
|
||||
}
|
||||
|
||||
|
||||
setResizeMode(QDeclarativeView::SizeRootObjectToView);
|
||||
|
||||
connect( m_qmlNotification, SIGNAL(invoked()), this, SLOT(slotInvoked()));
|
||||
connect( m_qmlNotification, SIGNAL(dismissed()), this, SLOT(slotDismissed()));
|
||||
|
||||
connect(m_qmlNotification, SIGNAL(invoked()), this, SLOT(slotInvoked()));
|
||||
connect(m_qmlNotification, SIGNAL(dismissed()), this, SLOT(slotDismissed()));
|
||||
|
||||
}
|
||||
|
||||
NotifyWidget::~NotifyWidget()
|
||||
|
@ -78,9 +72,9 @@ NotifyWidget::~NotifyWidget()
|
|||
void NotifyWidget::display(const Notification ¬ification)
|
||||
{
|
||||
update(notification);
|
||||
snoreDebug( SNORE_DEBUG ) << notification.id();
|
||||
snoreDebug(SNORE_DEBUG) << notification.id();
|
||||
show();
|
||||
|
||||
|
||||
QRect desktop = QDesktopWidget().availableGeometry();
|
||||
|
||||
resize(computeSize());
|
||||
|
@ -89,7 +83,7 @@ void NotifyWidget::display(const Notification ¬ification)
|
|||
|
||||
QPoint dest(desktop.topRight().x() - width(), desktop.topRight().y() + space + (space + height()) * m_id);
|
||||
QPoint start(desktop.topRight().x(), dest.y());
|
||||
|
||||
|
||||
m_animation->setDuration(500);
|
||||
m_animation->setStartValue(start);
|
||||
m_animation->setEndValue(dest);
|
||||
|
@ -98,44 +92,38 @@ void NotifyWidget::display(const Notification ¬ification)
|
|||
|
||||
void NotifyWidget::update(const Notification ¬ification)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << m_id << notification.id();
|
||||
snoreDebug(SNORE_DEBUG) << m_id << notification.id();
|
||||
m_notification = notification;
|
||||
QColor color;
|
||||
QVariant vcolor = notification.application().constHints().privateValue(parent(), "backgroundColor");
|
||||
if(vcolor.isValid())
|
||||
{
|
||||
if (vcolor.isValid()) {
|
||||
color = vcolor.value<QColor>();
|
||||
}
|
||||
else
|
||||
{
|
||||
color = computeBackgrondColor(notification.application().icon().image().scaled(20,20));
|
||||
} else {
|
||||
color = computeBackgrondColor(notification.application().icon().image().scaled(20, 20));
|
||||
notification.application().constHints().setPrivateValue(parent(), "backgroundColor", color);
|
||||
}
|
||||
QRgb gray = qGray(qGray(color.rgb()) - qGray(QColor(Qt::white).rgb()));
|
||||
QColor textColor = QColor(gray, gray, gray);
|
||||
QMetaObject::invokeMethod(m_qmlNotification, "update", Qt::QueuedConnection,
|
||||
Q_ARG( QVariant, notification.title()),
|
||||
Q_ARG( QVariant, notification.text()),
|
||||
Q_ARG( QVariant, QUrl::fromLocalFile(notification.icon().localUrl())),
|
||||
Q_ARG( QVariant, QUrl::fromLocalFile(notification.application().icon().localUrl())),
|
||||
Q_ARG( QVariant, color),
|
||||
Q_ARG( QVariant, textColor));
|
||||
Q_ARG(QVariant, notification.title()),
|
||||
Q_ARG(QVariant, notification.text()),
|
||||
Q_ARG(QVariant, QUrl::fromLocalFile(notification.icon().localUrl())),
|
||||
Q_ARG(QVariant, QUrl::fromLocalFile(notification.application().icon().localUrl())),
|
||||
Q_ARG(QVariant, color),
|
||||
Q_ARG(QVariant, textColor));
|
||||
}
|
||||
|
||||
bool NotifyWidget::acquire()
|
||||
{
|
||||
bool out = false;
|
||||
if(m_ready)
|
||||
{
|
||||
if (m_ready) {
|
||||
m_mem.lock();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE*)m_mem.data();
|
||||
snoreDebug( SNORE_DEBUG ) << m_id << data->free << data->date.elapsed() / 1000;
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE *)m_mem.data();
|
||||
snoreDebug(SNORE_DEBUG) << m_id << data->free << data->date.elapsed() / 1000;
|
||||
bool timedout = data->date.elapsed() / 1000 > 60;
|
||||
if(data->free || timedout)
|
||||
{
|
||||
if(timedout)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Notification Lock timed out" << data->date.elapsed() / 1000;
|
||||
if (data->free || timedout) {
|
||||
if (timedout) {
|
||||
snoreDebug(SNORE_DEBUG) << "Notification Lock timed out" << data->date.elapsed() / 1000;
|
||||
}
|
||||
data->free = false;
|
||||
data->date = QTime::currentTime();
|
||||
|
@ -150,13 +138,11 @@ bool NotifyWidget::acquire()
|
|||
bool NotifyWidget::release()
|
||||
{
|
||||
bool out = false;
|
||||
if(!m_ready)
|
||||
{
|
||||
if (!m_ready) {
|
||||
m_mem.lock();
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE*)m_mem.data();
|
||||
snoreDebug( SNORE_DEBUG ) << m_id << data->free << data->date.elapsed() / 1000 << m_notification.id();
|
||||
if(!data->free)
|
||||
{
|
||||
SHARED_MEM_TYPE *data = (SHARED_MEM_TYPE *)m_mem.data();
|
||||
snoreDebug(SNORE_DEBUG) << m_id << data->free << data->date.elapsed() / 1000 << m_notification.id();
|
||||
if (!data->free) {
|
||||
data->free = true;
|
||||
m_ready = true;
|
||||
out = true;
|
||||
|
@ -192,11 +178,9 @@ QColor NotifyWidget::computeBackgrondColor(const QImage &img)
|
|||
qulonglong r = 0;
|
||||
qulonglong g = 0;
|
||||
qulonglong b = 0;
|
||||
for(int x = 0; x < img.width(); ++x)
|
||||
{
|
||||
for(int y = 0; y < img.height(); ++y)
|
||||
{
|
||||
QRgb c = img.pixel(x,y);
|
||||
for (int x = 0; x < img.width(); ++x) {
|
||||
for (int y = 0; y < img.height(); ++y) {
|
||||
QRgb c = img.pixel(x, y);
|
||||
r += qRed(c);
|
||||
g += qGreen(c);
|
||||
b += qBlue(c);
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -28,13 +27,11 @@
|
|||
#include <QtDeclarative>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
bool free;
|
||||
QTime date;
|
||||
|
||||
}SHARED_MEM_TYPE;
|
||||
} SHARED_MEM_TYPE;
|
||||
|
||||
inline int SHARED_MEM_TYPE_REV()
|
||||
{
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -17,7 +16,6 @@
|
|||
along with SnoreNotify. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "snorenotifier.h"
|
||||
#include "notifywidget.h"
|
||||
#include "core/notification/notification_p.h"
|
||||
|
@ -25,7 +23,7 @@
|
|||
#include <QApplication>
|
||||
#include <QThread>
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snore,SnoreNotifier)
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snore, SnoreNotifier)
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
|
@ -37,8 +35,7 @@ SnoreNotifier::SnoreNotifier():
|
|||
|
||||
SnoreNotifier::~SnoreNotifier()
|
||||
{
|
||||
foreach (NotifyWidget *w, m_widgets)
|
||||
{
|
||||
foreach(NotifyWidget * w, m_widgets) {
|
||||
w->deleteLater();
|
||||
}
|
||||
}
|
||||
|
@ -46,40 +43,28 @@ SnoreNotifier::~SnoreNotifier()
|
|||
void SnoreNotifier::slotNotify(Snore::Notification notification)
|
||||
{
|
||||
|
||||
if(notification.isUpdate())
|
||||
{
|
||||
if(notification.old().hints().privateValue(this, "id").isValid())
|
||||
{
|
||||
if (notification.isUpdate()) {
|
||||
if (notification.old().hints().privateValue(this, "id").isValid()) {
|
||||
NotifyWidget *w = m_widgets[notification.old().hints().privateValue(this, "id").toInt()];
|
||||
if(w->isVisible() && w->notification().isValid() && w->notification().id() == notification.old().id())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "replacing notification" << w->notification().id() << notification.id();
|
||||
if (w->isVisible() && w->notification().isValid() && w->notification().id() == notification.old().id()) {
|
||||
snoreDebug(SNORE_DEBUG) << "replacing notification" << w->notification().id() << notification.id();
|
||||
w->update(notification);
|
||||
notification.hints().setPrivateValue(this, "id", w->id());
|
||||
startTimeout(notification);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int i = 0; i < m_queue.length(); ++i)
|
||||
{
|
||||
} else {
|
||||
for (int i = 0; i < m_queue.length(); ++i) {
|
||||
Notification n = m_queue.at(i);
|
||||
if(n.id() == notification.old().id())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "replacing qued notification" << n.id() << notification.id();
|
||||
m_queue.replace(i,notification);
|
||||
if (n.id() == notification.old().id()) {
|
||||
snoreDebug(SNORE_DEBUG) << "replacing qued notification" << n.id() << notification.id();
|
||||
m_queue.replace(i, notification);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(m_queue.isEmpty())
|
||||
{
|
||||
foreach (NotifyWidget *w, m_widgets)
|
||||
{
|
||||
if(w->acquire())
|
||||
{
|
||||
} else {
|
||||
if (m_queue.isEmpty()) {
|
||||
foreach(NotifyWidget * w, m_widgets) {
|
||||
if (w->acquire()) {
|
||||
w->display(notification);
|
||||
notification.hints().setPrivateValue(this, "id", w->id());
|
||||
startTimeout(notification);
|
||||
|
@ -100,10 +85,9 @@ void SnoreNotifier::slotCloseNotification(Snore::Notification notification)
|
|||
//the timer will show the next
|
||||
}
|
||||
|
||||
|
||||
void SnoreNotifier::slotDismissed()
|
||||
{
|
||||
NotifyWidget *widget = qobject_cast<NotifyWidget*>(sender());
|
||||
NotifyWidget *widget = qobject_cast<NotifyWidget *>(sender());
|
||||
Notification notification = widget->notification();
|
||||
closeNotification(notification, Notification::DISMISSED);
|
||||
slotCloseNotification(notification);
|
||||
|
@ -111,32 +95,26 @@ void SnoreNotifier::slotDismissed()
|
|||
|
||||
void SnoreNotifier::slotInvoked()
|
||||
{
|
||||
NotifyWidget *widget = qobject_cast<NotifyWidget*>(sender());
|
||||
NotifyWidget *widget = qobject_cast<NotifyWidget *>(sender());
|
||||
Notification notification = widget->notification();
|
||||
snore()->d()->notificationActionInvoked(notification);
|
||||
closeNotification(notification,Notification::CLOSED);
|
||||
closeNotification(notification, Notification::CLOSED);
|
||||
slotCloseNotification(notification);
|
||||
}
|
||||
|
||||
void SnoreNotifier::slotProcessQueue()
|
||||
{
|
||||
if(m_queue.isEmpty())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "queue is empty";
|
||||
if (m_queue.isEmpty()) {
|
||||
snoreDebug(SNORE_DEBUG) << "queue is empty";
|
||||
m_timer->stop();
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (NotifyWidget *w, m_widgets)
|
||||
{
|
||||
if(w->acquire())
|
||||
{
|
||||
} else {
|
||||
foreach(NotifyWidget * w, m_widgets) {
|
||||
if (w->acquire()) {
|
||||
Notification notification = m_queue.takeFirst();
|
||||
w->display(notification);
|
||||
notification.hints().setPrivateValue(this, "id", w->id());
|
||||
startTimeout(notification);
|
||||
if(m_queue.isEmpty())
|
||||
{
|
||||
if (m_queue.isEmpty()) {
|
||||
m_timer->stop();
|
||||
return;
|
||||
}
|
||||
|
@ -148,25 +126,21 @@ void SnoreNotifier::slotProcessQueue()
|
|||
|
||||
void SnoreNotifier::setup()
|
||||
{
|
||||
for(int i=0;i<m_widgets.size();++i)
|
||||
{
|
||||
for (int i = 0; i < m_widgets.size(); ++i) {
|
||||
NotifyWidget *w = new NotifyWidget(i);
|
||||
m_widgets[i] = w;
|
||||
connect(w, SIGNAL(dismissed()), this, SLOT(slotDismissed()));
|
||||
connect(w, SIGNAL(invoked()), this, SLOT(slotInvoked()));
|
||||
}
|
||||
|
||||
|
||||
m_timer = new QTimer(this);
|
||||
m_timer->setInterval(500);
|
||||
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotProcessQueue()));
|
||||
}
|
||||
|
||||
|
||||
bool SnoreNotifier::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(SnoreBackend::initialize(snore))
|
||||
{
|
||||
if (SnoreBackend::initialize(snore)) {
|
||||
return metaObject()->invokeMethod(this, "setup", Qt::QueuedConnection);
|
||||
}
|
||||
return false;
|
||||
|
@ -174,10 +148,8 @@ bool SnoreNotifier::initialize(SnoreCore *snore)
|
|||
|
||||
bool SnoreNotifier::deinitialize()
|
||||
{
|
||||
if(SnoreBackend::deinitialize())
|
||||
{
|
||||
for(int i=0;i<m_widgets.size();++i)
|
||||
{
|
||||
if (SnoreBackend::deinitialize()) {
|
||||
for (int i = 0; i < m_widgets.size(); ++i) {
|
||||
m_widgets[i]->release();
|
||||
m_widgets[i]->deleteLater();
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -50,10 +49,9 @@ private slots:
|
|||
private:
|
||||
|
||||
QList<Snore::Notification> m_queue;
|
||||
QVector<NotifyWidget*> m_widgets;
|
||||
QVector<NotifyWidget *> m_widgets;
|
||||
QTimer *m_timer;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // SNORENOTIFIER_H
|
||||
|
|
|
@ -13,8 +13,7 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snoretoast,SnoreToast)
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_snoretoast, SnoreToast)
|
||||
|
||||
SnoreToast::SnoreToast():
|
||||
SnoreBackend("Windows 8", true, false)
|
||||
|
@ -28,30 +27,27 @@ SnoreToast::~SnoreToast()
|
|||
|
||||
bool SnoreToast::initialize(SnoreCore *snore)
|
||||
{
|
||||
if(QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "SnoreToast does not work on windows" << QSysInfo::windowsVersion();
|
||||
if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8) {
|
||||
snoreDebug(SNORE_DEBUG) << "SnoreToast does not work on windows" << QSysInfo::windowsVersion();
|
||||
return false;
|
||||
}
|
||||
return SnoreBackend::initialize(snore);
|
||||
}
|
||||
|
||||
|
||||
void SnoreToast::slotNotify(Notification notification)
|
||||
{
|
||||
QProcess *p = new QProcess(this);
|
||||
p->setReadChannelMode(QProcess::MergedChannels);
|
||||
|
||||
connect(p,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp,SIGNAL(aboutToQuit()),p,SLOT(kill()));
|
||||
connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp, SIGNAL(aboutToQuit()), p, SLOT(kill()));
|
||||
|
||||
QStringList arguements;
|
||||
arguements << "-t"
|
||||
<< Snore::toPlainText(notification.title())
|
||||
<< "-m"
|
||||
<< Snore::toPlainText(notification.text());
|
||||
if(notification.icon().isValid())
|
||||
{
|
||||
if (notification.icon().isValid()) {
|
||||
arguements << "-p"
|
||||
<< QDir::toNativeSeparators(notification.icon().localUrl());
|
||||
}
|
||||
|
@ -60,20 +56,18 @@ void SnoreToast::slotNotify(Notification notification)
|
|||
<< appId(notification.application())
|
||||
<< "-id"
|
||||
<< QString::number(notification.id());
|
||||
if(notification.hints().value("silent",true).toBool())
|
||||
{
|
||||
if (notification.hints().value("silent", true).toBool()) {
|
||||
arguements << "-silent";
|
||||
}
|
||||
snoreDebug( SNORE_DEBUG ) << "SnoreToast" << arguements;
|
||||
snoreDebug(SNORE_DEBUG) << "SnoreToast" << arguements;
|
||||
p->start("SnoreToast", arguements);
|
||||
|
||||
p->setProperty("SNORE_NOTIFICATION_ID",notification.id());
|
||||
p->setProperty("SNORE_NOTIFICATION_ID", notification.id());
|
||||
}
|
||||
|
||||
void SnoreToast::slotRegisterApplication(const Application &application)
|
||||
{
|
||||
if(!application.constHints().contains("windows_app_id"))
|
||||
{
|
||||
if (!application.constHints().contains("windows_app_id")) {
|
||||
QProcess *p = new QProcess(this);
|
||||
p->setReadChannelMode(QProcess::MergedChannels);
|
||||
|
||||
|
@ -82,11 +76,11 @@ void SnoreToast::slotRegisterApplication(const Application &application)
|
|||
<< QString("SnoreNotify\\%1").arg(qApp->applicationName())
|
||||
<< QDir::toNativeSeparators(qApp->applicationFilePath())
|
||||
<< appId(application);
|
||||
snoreDebug( SNORE_DEBUG ) << "SnoreToast" << arguements;
|
||||
snoreDebug(SNORE_DEBUG) << "SnoreToast" << arguements;
|
||||
p->start("SnoreToast", arguements);
|
||||
|
||||
connect(p,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp,SIGNAL(aboutToQuit()),p,SLOT(kill()));
|
||||
connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp, SIGNAL(aboutToQuit()), p, SLOT(kill()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -98,27 +92,25 @@ void SnoreToast::slotCloseNotification(Notification notification)
|
|||
QStringList arguements;
|
||||
arguements << "-close"
|
||||
<< QString::number(notification.id());
|
||||
snoreDebug( SNORE_DEBUG ) << "SnoreToast" << arguements;
|
||||
snoreDebug(SNORE_DEBUG) << "SnoreToast" << arguements;
|
||||
p->start("SnoreToast", arguements);
|
||||
|
||||
connect(p,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp,SIGNAL(aboutToQuit()),p,SLOT(kill()));
|
||||
connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotToastNotificationClosed(int,QProcess::ExitStatus)));
|
||||
connect(qApp, SIGNAL(aboutToQuit()), p, SLOT(kill()));
|
||||
}
|
||||
|
||||
void SnoreToast::slotToastNotificationClosed(int code, QProcess::ExitStatus)
|
||||
{
|
||||
QProcess *p = qobject_cast<QProcess*>(sender());
|
||||
snoreDebug( SNORE_DEBUG ) << p->readAll();
|
||||
if(p->property("SNORE_NOTIFICATION_ID").isNull())
|
||||
{
|
||||
QProcess *p = qobject_cast<QProcess *>(sender());
|
||||
snoreDebug(SNORE_DEBUG) << p->readAll();
|
||||
if (p->property("SNORE_NOTIFICATION_ID").isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Notification n = getActiveNotificationByID(p->property("SNORE_NOTIFICATION_ID").toUInt());
|
||||
Notification::CloseReasons reason = Notification::CLOSED;
|
||||
|
||||
switch(code)
|
||||
{
|
||||
switch (code) {
|
||||
case 0:
|
||||
reason = Notification::CLOSED;
|
||||
snore()->d()->notificationActionInvoked(n);
|
||||
|
@ -134,11 +126,11 @@ void SnoreToast::slotToastNotificationClosed(int code, QProcess::ExitStatus)
|
|||
break;
|
||||
case -1:
|
||||
//failed
|
||||
snoreDebug( SNORE_WARNING ) << "SnoreToast failed to display " << n;
|
||||
snoreDebug(SNORE_WARNING) << "SnoreToast failed to display " << n;
|
||||
break;
|
||||
}
|
||||
|
||||
closeNotification(n,reason);
|
||||
closeNotification(n, reason);
|
||||
|
||||
}
|
||||
|
||||
|
@ -146,8 +138,7 @@ QString SnoreToast::appId(const Application &application)
|
|||
{
|
||||
|
||||
QString appID = application.constHints().value("windows_app_id").toString();
|
||||
if(appID.isEmpty())
|
||||
{
|
||||
if (appID.isEmpty()) {
|
||||
appID = QString("%1.%2.SnoreToast").arg(qApp->organizationName(), qApp->applicationName()).remove(" ");
|
||||
}
|
||||
return appID;
|
||||
|
|
|
@ -17,7 +17,7 @@ public:
|
|||
public slots:
|
||||
void slotNotify(Snore::Notification notification);
|
||||
void slotRegisterApplication(const Snore::Application &application);
|
||||
void slotCloseNotification ( Snore::Notification notification );
|
||||
void slotCloseNotification(Snore::Notification notification);
|
||||
|
||||
private slots:
|
||||
void slotToastNotificationClosed(int code, QProcess::ExitStatus);
|
||||
|
@ -25,7 +25,6 @@ private slots:
|
|||
private:
|
||||
QString appId(const Snore::Application &application);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // TOASTER_H
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
#include <QDebug>
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_trayicon,TrayIconNotifer)
|
||||
Q_EXPORT_PLUGIN2(libsnore_backend_trayicon, TrayIconNotifer)
|
||||
|
||||
TrayIconNotifer::TrayIconNotifer () :
|
||||
SnoreBackend ( "SystemTray",true,false ),
|
||||
TrayIconNotifer::TrayIconNotifer() :
|
||||
SnoreBackend("SystemTray", true, false),
|
||||
m_trayIcon(NULL),
|
||||
m_displayed(-1),
|
||||
m_currentlyDisplaying(false)
|
||||
|
@ -25,23 +25,21 @@ TrayIconNotifer::~TrayIconNotifer()
|
|||
|
||||
}
|
||||
|
||||
bool TrayIconNotifer::initialize(SnoreCore *snore){
|
||||
bool TrayIconNotifer::initialize(SnoreCore *snore)
|
||||
{
|
||||
m_trayIcon = snore->trayIcon();
|
||||
if(m_trayIcon == NULL)
|
||||
{
|
||||
if (m_trayIcon == NULL) {
|
||||
return false;
|
||||
}
|
||||
connect(m_trayIcon,SIGNAL(messageClicked()),this,SLOT(actionInvoked()));
|
||||
connect(m_trayIcon, SIGNAL(messageClicked()), this, SLOT(actionInvoked()));
|
||||
return SnoreBackend::initialize(snore);
|
||||
}
|
||||
|
||||
bool TrayIconNotifer::deinitialize()
|
||||
{
|
||||
if(SnoreBackend::deinitialize())
|
||||
{
|
||||
if(m_trayIcon)
|
||||
{
|
||||
disconnect(m_trayIcon,SIGNAL(messageClicked()),this,SLOT(actionInvoked()));
|
||||
if (SnoreBackend::deinitialize()) {
|
||||
if (m_trayIcon) {
|
||||
disconnect(m_trayIcon, SIGNAL(messageClicked()), this, SLOT(actionInvoked()));
|
||||
m_trayIcon = NULL;
|
||||
m_currentlyDisplaying = false;
|
||||
}
|
||||
|
@ -50,7 +48,7 @@ bool TrayIconNotifer::deinitialize()
|
|||
return false;
|
||||
}
|
||||
|
||||
void TrayIconNotifer::slotNotify( Notification notification )
|
||||
void TrayIconNotifer::slotNotify(Notification notification)
|
||||
{
|
||||
m_notificationQue.append(notification);
|
||||
displayNotification();
|
||||
|
@ -58,36 +56,33 @@ void TrayIconNotifer::slotNotify( Notification notification )
|
|||
|
||||
void TrayIconNotifer::slotCloseNotification(Notification n)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << n;
|
||||
snoreDebug(SNORE_DEBUG) << n;
|
||||
m_currentlyDisplaying = false;
|
||||
displayNotification();
|
||||
}
|
||||
|
||||
void TrayIconNotifer::displayNotification()
|
||||
{
|
||||
if(m_currentlyDisplaying)
|
||||
{
|
||||
if (m_currentlyDisplaying) {
|
||||
return;
|
||||
}
|
||||
if(m_notificationQue.isEmpty())
|
||||
{
|
||||
if (m_notificationQue.isEmpty()) {
|
||||
m_currentlyDisplaying = false;
|
||||
return;
|
||||
}
|
||||
m_currentlyDisplaying = true;
|
||||
Notification notification = m_notificationQue.takeFirst();
|
||||
m_displayed = notification.id();
|
||||
m_trayIcon->showMessage ( Snore::toPlainText(notification.title()),Snore::toPlainText(notification.text()),QSystemTrayIcon::NoIcon,notification.timeout() *1000 );
|
||||
m_trayIcon->showMessage(Snore::toPlainText(notification.title()), Snore::toPlainText(notification.text()), QSystemTrayIcon::NoIcon, notification.timeout() * 1000);
|
||||
startTimeout(notification);
|
||||
}
|
||||
|
||||
void TrayIconNotifer::actionInvoked()
|
||||
{
|
||||
Notification n = getActiveNotificationByID(m_displayed);
|
||||
if(n.isValid())
|
||||
{
|
||||
if (n.isValid()) {
|
||||
snore()->d()->notificationActionInvoked(n);
|
||||
closeNotification(n,Notification::CLOSED);
|
||||
closeNotification(n, Notification::CLOSED);
|
||||
m_currentlyDisplaying = false;
|
||||
displayNotification();
|
||||
}
|
||||
|
|
|
@ -3,20 +3,20 @@
|
|||
|
||||
#include "core/plugins/snorebackend.h"
|
||||
|
||||
|
||||
namespace Snore{
|
||||
class SnoreCore;
|
||||
namespace Snore
|
||||
{
|
||||
class SnoreCore;
|
||||
}
|
||||
|
||||
class QSystemTrayIcon;
|
||||
|
||||
class TrayIconNotifer:public Snore::SnoreBackend
|
||||
class TrayIconNotifer: public Snore::SnoreBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(Snore::SnoreBackend)
|
||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0")
|
||||
public:
|
||||
TrayIconNotifer ();
|
||||
TrayIconNotifer();
|
||||
virtual ~TrayIconNotifer();
|
||||
virtual bool initialize(Snore::SnoreCore *snore);
|
||||
virtual bool deinitialize();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -32,27 +31,26 @@
|
|||
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_frontend_freedesktop,FreedesktopFrontend)
|
||||
Q_EXPORT_PLUGIN2(libsnore_frontend_freedesktop, FreedesktopFrontend)
|
||||
|
||||
FreedesktopFrontend::FreedesktopFrontend():
|
||||
SnoreFrontend("Freedesktop")
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
FreedesktopFrontend::~FreedesktopFrontend(){
|
||||
FreedesktopFrontend::~FreedesktopFrontend()
|
||||
{
|
||||
QDBusConnection dbus = QDBusConnection::sessionBus();
|
||||
dbus.unregisterService( "org.freedesktop.Notifications" );
|
||||
dbus.unregisterService("org.freedesktop.Notifications");
|
||||
}
|
||||
|
||||
bool FreedesktopFrontend::initialize(SnoreCore *snore)
|
||||
{
|
||||
m_adaptor = new NotificationsAdaptor(this);
|
||||
QDBusConnection dbus = QDBusConnection::sessionBus();
|
||||
if(dbus.registerService( "org.freedesktop.Notifications" ) &&
|
||||
dbus.registerObject( "/org/freedesktop/Notifications", this ))
|
||||
{
|
||||
if (dbus.registerService("org.freedesktop.Notifications") &&
|
||||
dbus.registerObject("/org/freedesktop/Notifications", this)) {
|
||||
return SnoreFrontend::initialize(snore);
|
||||
}
|
||||
return false;
|
||||
|
@ -60,11 +58,10 @@ bool FreedesktopFrontend::initialize(SnoreCore *snore)
|
|||
|
||||
bool FreedesktopFrontend::deinitialize()
|
||||
{
|
||||
if(SnoreFrontend::deinitialize())
|
||||
{
|
||||
if (SnoreFrontend::deinitialize()) {
|
||||
QDBusConnection dbus = QDBusConnection::sessionBus();
|
||||
dbus.unregisterService("org.freedesktop.Notifications" );
|
||||
dbus.unregisterObject("/org/freedesktop/Notifications" );
|
||||
dbus.unregisterService("org.freedesktop.Notifications");
|
||||
dbus.unregisterObject("/org/freedesktop/Notifications");
|
||||
m_adaptor->deleteLater();
|
||||
m_adaptor = NULL;
|
||||
return true;
|
||||
|
@ -74,15 +71,14 @@ bool FreedesktopFrontend::deinitialize()
|
|||
|
||||
void FreedesktopFrontend::actionInvoked(Notification notification)
|
||||
{
|
||||
if(notification.actionInvoked().isValid())
|
||||
{
|
||||
emit ActionInvoked(notification.id(),QString::number(notification.actionInvoked().id()));
|
||||
if (notification.actionInvoked().isValid()) {
|
||||
emit ActionInvoked(notification.id(), QString::number(notification.actionInvoked().id()));
|
||||
}
|
||||
}
|
||||
|
||||
void FreedesktopFrontend::notificationClosed(Notification notification)
|
||||
{
|
||||
emit NotificationClosed(notification.id(),notification.closeReason());
|
||||
emit NotificationClosed(notification.id(), notification.closeReason());
|
||||
}
|
||||
|
||||
uint FreedesktopFrontend::Notify(const QString &app_name, uint replaces_id,
|
||||
|
@ -93,86 +89,71 @@ uint FreedesktopFrontend::Notify(const QString &app_name, uint replaces_id,
|
|||
Application app;
|
||||
Notification::Prioritys priotity = Notification::NORMAL;
|
||||
|
||||
if(hints.contains("image_data"))
|
||||
{
|
||||
if (hints.contains("image_data")) {
|
||||
FreedesktopImageHint image;
|
||||
hints["image_data"].value<QDBusArgument>() >> image;
|
||||
icon = Icon(image.toQImage());
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
icon = Icon(":/root/snore.png");
|
||||
}
|
||||
|
||||
if(!snore()->aplications().contains(app_name))
|
||||
{
|
||||
if (!snore()->aplications().contains(app_name)) {
|
||||
qDebug() << QIcon::themeSearchPaths();
|
||||
QIcon qicon = QIcon::fromTheme(app_icon, QIcon(":/root/snore.png") );
|
||||
QIcon qicon = QIcon::fromTheme(app_icon, QIcon(":/root/snore.png"));
|
||||
QSize max;
|
||||
foreach (const QSize &s, qicon.availableSizes()) {
|
||||
if(s.width()*s.height()>max.width()*max.height())
|
||||
{
|
||||
foreach(const QSize & s, qicon.availableSizes()) {
|
||||
if (s.width()*s.height() > max.width()*max.height()) {
|
||||
max = s;
|
||||
}
|
||||
}
|
||||
Icon appIcon( qicon.pixmap( max ).toImage());
|
||||
Icon appIcon(qicon.pixmap(max).toImage());
|
||||
Alert alert("DBus Alert", appIcon);
|
||||
app = Application(app_name, appIcon);
|
||||
app.addAlert(alert);
|
||||
snore()->registerApplication(app);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
app = snore()->aplications()[app_name];
|
||||
}
|
||||
|
||||
if (hints.contains("urgency"))
|
||||
{
|
||||
priotity = Notification::Prioritys(hints["urgency"].toInt()-1);
|
||||
if (hints.contains("urgency")) {
|
||||
priotity = Notification::Prioritys(hints["urgency"].toInt() - 1);
|
||||
}
|
||||
|
||||
Notification noti;
|
||||
if(replaces_id != 0 && snore()->getActiveNotificationByID(replaces_id).isValid())
|
||||
{
|
||||
noti = Notification(snore()->getActiveNotificationByID(replaces_id),summary, body, icon, timeout==-1?Notification::defaultTimeout():timeout/1000, priotity);
|
||||
}
|
||||
else
|
||||
{
|
||||
noti = Notification(app, *app.alerts().begin(), summary, body, icon, timeout==-1?Notification::defaultTimeout():timeout/1000, priotity);
|
||||
if (replaces_id != 0 && snore()->getActiveNotificationByID(replaces_id).isValid()) {
|
||||
noti = Notification(snore()->getActiveNotificationByID(replaces_id), summary, body, icon, timeout == -1 ? Notification::defaultTimeout() : timeout / 1000, priotity);
|
||||
} else {
|
||||
noti = Notification(app, *app.alerts().begin(), summary, body, icon, timeout == -1 ? Notification::defaultTimeout() : timeout / 1000, priotity);
|
||||
}
|
||||
noti.data()->setSource(this);
|
||||
for(int i = 0;i < actions.length(); i+=2)
|
||||
{
|
||||
noti.addAction(Action(actions.at(i).toInt(),actions.at(i+1)));
|
||||
for (int i = 0; i < actions.length(); i += 2) {
|
||||
noti.addAction(Action(actions.at(i).toInt(), actions.at(i + 1)));
|
||||
}
|
||||
|
||||
snore()->broadcastNotification(noti);
|
||||
return noti.id();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void FreedesktopFrontend::CloseNotification(uint id)
|
||||
{
|
||||
Notification noti = snore()->getActiveNotificationByID(id);
|
||||
if(noti.isValid())
|
||||
{
|
||||
snore()->requestCloseNotification(noti,Notification::TIMED_OUT);
|
||||
if (noti.isValid()) {
|
||||
snore()->requestCloseNotification(noti, Notification::TIMED_OUT);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList FreedesktopFrontend::GetCapabilities()
|
||||
{
|
||||
return QStringList()
|
||||
<< "body"
|
||||
<< "urgency"
|
||||
// << "body-hyperlinks"
|
||||
<< "body-markup"
|
||||
<< "icon-static"
|
||||
<< "actions";
|
||||
<< "body"
|
||||
<< "urgency"
|
||||
// << "body-hyperlinks"
|
||||
<< "body-markup"
|
||||
<< "icon-static"
|
||||
<< "actions";
|
||||
}
|
||||
|
||||
QString FreedesktopFrontend::GetServerInformation(QString& vendor, QString& version, QString& specVersion)
|
||||
QString FreedesktopFrontend::GetServerInformation(QString &vendor, QString &version, QString &specVersion)
|
||||
{
|
||||
vendor = "SnoreNotify";
|
||||
version = Version::version();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -39,21 +38,20 @@ public:
|
|||
void actionInvoked(Snore::Notification notification);
|
||||
void notificationClosed(Snore::Notification notification);
|
||||
uint Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, const QString &body, const QStringList &actions, const QVariantMap &hints, int timeout);
|
||||
void CloseNotification( uint id );
|
||||
void CloseNotification(uint id);
|
||||
|
||||
QStringList GetCapabilities();
|
||||
QString GetServerInformation(QString& vendor, QString& version, QString& specVersion);
|
||||
QString GetServerInformation(QString &vendor, QString &version, QString &specVersion);
|
||||
|
||||
signals:
|
||||
void NotificationClosed( uint id, uint reason );
|
||||
void ActionInvoked( uint id, const QString& actionKey );
|
||||
void NotificationClosed(uint id, uint reason);
|
||||
void ActionInvoked(uint id, const QString &actionKey);
|
||||
|
||||
private:
|
||||
Snore::Alert m_alert;
|
||||
Snore::Icon m_icon;
|
||||
NotificationsAdaptor *m_adaptor;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif//FREEDESKTOPNOTIFICATION_FRONTEND_H
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,7 +23,6 @@
|
|||
#include "core/notification/notification.h"
|
||||
#include "core/notification/notification_p.h"
|
||||
|
||||
|
||||
#include <QDir>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QEventLoop>
|
||||
|
@ -38,25 +36,24 @@ Parser::Parser(SnarlNetworkFrontend *snarl):
|
|||
QObject(snarl),
|
||||
snarl(snarl)
|
||||
{
|
||||
getSnpType.insert("type",TYPE);
|
||||
getSnpType.insert("app",APP);
|
||||
getSnpType.insert("version",VERSION);
|
||||
getSnpType.insert("action",ACTION);
|
||||
getSnpType.insert("register",REGISTER);
|
||||
getSnpType.insert("add_class",ADD_CLASS);
|
||||
getSnpType.insert("notification",NOTIFICATION);
|
||||
getSnpType.insert("unregister",UNREGISTER);
|
||||
getSnpType.insert("class",CLASS);
|
||||
getSnpType.insert("title",TITLE);
|
||||
getSnpType.insert("text",TEXT);
|
||||
getSnpType.insert("icon",ICON);
|
||||
getSnpType.insert("timeout",TIMEOUT);
|
||||
getSnpType.insert("type", TYPE);
|
||||
getSnpType.insert("app", APP);
|
||||
getSnpType.insert("version", VERSION);
|
||||
getSnpType.insert("action", ACTION);
|
||||
getSnpType.insert("register", REGISTER);
|
||||
getSnpType.insert("add_class", ADD_CLASS);
|
||||
getSnpType.insert("notification", NOTIFICATION);
|
||||
getSnpType.insert("unregister", UNREGISTER);
|
||||
getSnpType.insert("class", CLASS);
|
||||
getSnpType.insert("title", TITLE);
|
||||
getSnpType.insert("text", TEXT);
|
||||
getSnpType.insert("icon", ICON);
|
||||
getSnpType.insert("timeout", TIMEOUT);
|
||||
}
|
||||
|
||||
|
||||
void Parser::parse(Notification &sNotification,const QString &msg,QTcpSocket* client)
|
||||
void Parser::parse(Notification &sNotification, const QString &msg, QTcpSocket *client)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << msg;
|
||||
snoreDebug(SNORE_DEBUG) << msg;
|
||||
QStringList splitted(msg.split("#?"));
|
||||
snpTypes action(ERROR);
|
||||
|
||||
|
@ -70,12 +67,10 @@ void Parser::parse(Notification &sNotification,const QString &msg,QTcpSocket* cl
|
|||
QString key;
|
||||
QString value;
|
||||
|
||||
foreach(QString s,splitted)
|
||||
{
|
||||
key = s.mid(0,s.indexOf("=")).toLower();
|
||||
value = s.mid(s.indexOf("=")+1);
|
||||
switch(getSnpType.value(key))
|
||||
{
|
||||
foreach(QString s, splitted) {
|
||||
key = s.mid(0, s.indexOf("=")).toLower();
|
||||
value = s.mid(s.indexOf("=") + 1);
|
||||
switch (getSnpType.value(key)) {
|
||||
case APP:
|
||||
appName = value;
|
||||
break;
|
||||
|
@ -102,66 +97,50 @@ void Parser::parse(Notification &sNotification,const QString &msg,QTcpSocket* cl
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
Application app;
|
||||
Alert alert;
|
||||
|
||||
if(snarl->m_applications.contains(client))
|
||||
{
|
||||
if (snarl->m_applications.contains(client)) {
|
||||
app = snarl->m_applications[client];
|
||||
}
|
||||
|
||||
|
||||
if(!alertName.isEmpty() && app.isValid())
|
||||
{
|
||||
if(app.alerts().contains(alertName))
|
||||
{
|
||||
if (!alertName.isEmpty() && app.isValid()) {
|
||||
if (app.alerts().contains(alertName)) {
|
||||
alert = app.alerts()[alertName];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
switch(action)
|
||||
{
|
||||
case NOTIFICATION:
|
||||
{
|
||||
if(!snarl->snore()->aplications().contains(app.name()))
|
||||
{
|
||||
switch (action) {
|
||||
case NOTIFICATION: {
|
||||
if (!snarl->snore()->aplications().contains(app.name())) {
|
||||
snarl->snore()->registerApplication(app);
|
||||
}
|
||||
|
||||
if(!alert.isActive())
|
||||
{
|
||||
if (!alert.isActive()) {
|
||||
break;
|
||||
}
|
||||
sNotification = Notification(app,alert,title,text,icon,timeout);
|
||||
sNotification = Notification(app, alert, title, text, icon, timeout);
|
||||
sNotification.data()->setSource(snarl);
|
||||
sNotification.hints().setPrivateValue(snarl, "clientSocket", client);
|
||||
break;
|
||||
}
|
||||
case ADD_CLASS:
|
||||
if(alertName.isEmpty())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "Error registering alert with empty name";
|
||||
if (alertName.isEmpty()) {
|
||||
snoreDebug(SNORE_DEBUG) << "Error registering alert with empty name";
|
||||
break;
|
||||
}
|
||||
alert = Alert(alertName, icon);
|
||||
app.addAlert(alert);
|
||||
break;
|
||||
case REGISTER:
|
||||
if(!snarl->m_applications.contains(client))
|
||||
{
|
||||
if (!snarl->m_applications.contains(client)) {
|
||||
snarl->m_applications[client] = Application(appName, icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << appName << "already registred";
|
||||
} else {
|
||||
snoreDebug(SNORE_DEBUG) << appName << "already registred";
|
||||
}
|
||||
break;
|
||||
case UNREGISTER:
|
||||
snarl->snore()->deregisterApplication( app );
|
||||
snarl->snore()->deregisterApplication(app);
|
||||
snarl->m_applications.take(client);
|
||||
break;
|
||||
case ERROR:
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -25,20 +24,18 @@
|
|||
#include <QSharedPointer>
|
||||
#include <QObject>
|
||||
|
||||
|
||||
|
||||
class Parser : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Parser(class SnarlNetworkFrontend* snarl);
|
||||
Parser(class SnarlNetworkFrontend *snarl);
|
||||
|
||||
void parse(Snore::Notification &sNotification, const QString &msg, class QTcpSocket* client);
|
||||
void parse(Snore::Notification &sNotification, const QString &msg, class QTcpSocket *client);
|
||||
|
||||
private:
|
||||
class SnarlNetworkFrontend *snarl;
|
||||
|
||||
enum snpTypes{
|
||||
enum snpTypes {
|
||||
TYPE,
|
||||
APP,
|
||||
VERSION,
|
||||
|
@ -56,7 +53,7 @@ private:
|
|||
|
||||
};
|
||||
|
||||
QHash<QString,Parser::snpTypes> getSnpType;
|
||||
QHash<QString, Parser::snpTypes> getSnpType;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,8 +26,7 @@
|
|||
#include <iostream>
|
||||
using namespace Snore;
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_frontend_snarlnetwork,SnarlNetworkFrontend)
|
||||
|
||||
Q_EXPORT_PLUGIN2(libsnore_frontend_snarlnetwork, SnarlNetworkFrontend)
|
||||
|
||||
SnarlNetworkFrontend::SnarlNetworkFrontend():
|
||||
SnoreFrontend("SnarlNetwork")
|
||||
|
@ -36,20 +34,18 @@ SnarlNetworkFrontend::SnarlNetworkFrontend():
|
|||
|
||||
}
|
||||
|
||||
SnarlNetworkFrontend::~SnarlNetworkFrontend(){
|
||||
SnarlNetworkFrontend::~SnarlNetworkFrontend()
|
||||
{
|
||||
}
|
||||
|
||||
bool SnarlNetworkFrontend::initialize(SnoreCore *snore)
|
||||
{
|
||||
parser = new Parser(this);
|
||||
tcpServer = new QTcpServer(this);
|
||||
if(!tcpServer->listen(QHostAddress::Any,port))
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << "The port is already used";
|
||||
if (!tcpServer->listen(QHostAddress::Any, port)) {
|
||||
snoreDebug(SNORE_DEBUG) << "The port is already used";
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(handleConnection()));
|
||||
std::cout << "The Snarl Network Protokoll is developed for Snarl <http://www.fullphat.net/>" << std::endl;
|
||||
}
|
||||
|
@ -58,8 +54,7 @@ bool SnarlNetworkFrontend::initialize(SnoreCore *snore)
|
|||
|
||||
bool SnarlNetworkFrontend::deinitialize()
|
||||
{
|
||||
if(SnoreFrontend::deinitialize())
|
||||
{
|
||||
if (SnoreFrontend::deinitialize()) {
|
||||
parser->deleteLater();
|
||||
parser = NULL;
|
||||
|
||||
|
@ -70,17 +65,15 @@ bool SnarlNetworkFrontend::deinitialize()
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
void SnarlNetworkFrontend::actionInvoked(Snore::Notification notification)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << notification.closeReason();
|
||||
callback(notification,"SNP/1.1/304/Notification acknowledged/");
|
||||
snoreDebug(SNORE_DEBUG) << notification.closeReason();
|
||||
callback(notification, "SNP/1.1/304/Notification acknowledged/");
|
||||
}
|
||||
|
||||
void SnarlNetworkFrontend::notificationClosed(Snore::Notification notification)
|
||||
{
|
||||
switch(notification.closeReason())
|
||||
{
|
||||
switch (notification.closeReason()) {
|
||||
case Notification::TIMED_OUT:
|
||||
callback(notification, "SNP/1.1/303/Notification timed out/");
|
||||
break;
|
||||
|
@ -88,7 +81,7 @@ void SnarlNetworkFrontend::notificationClosed(Snore::Notification notification)
|
|||
callback(notification, "SNP/1.1/307/Notification closed/");
|
||||
break;
|
||||
case Notification::DISMISSED:
|
||||
callback(notification,"SNP/1.1/302/Notification cancelled/");
|
||||
callback(notification, "SNP/1.1/302/Notification cancelled/");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -96,31 +89,26 @@ void SnarlNetworkFrontend::notificationClosed(Snore::Notification notification)
|
|||
void SnarlNetworkFrontend::handleConnection()
|
||||
{
|
||||
QTcpSocket *client = tcpServer->nextPendingConnection();
|
||||
connect(client,SIGNAL(readyRead()),this,SLOT(handleMessages()));
|
||||
connect(client,SIGNAL(disconnected()), client, SLOT(deleteLater()));
|
||||
connect(client, SIGNAL(readyRead()), this, SLOT(handleMessages()));
|
||||
connect(client, SIGNAL(disconnected()), client, SLOT(deleteLater()));
|
||||
}
|
||||
|
||||
void SnarlNetworkFrontend::handleMessages()
|
||||
{
|
||||
const QString out("SNP/1.1/0/OK");
|
||||
QTcpSocket *client = qobject_cast<QTcpSocket*>(sender());
|
||||
QTcpSocket *client = qobject_cast<QTcpSocket *>(sender());
|
||||
|
||||
QStringList messages(QString::fromAscii(client->readAll()).trimmed().split("\r\n"));
|
||||
foreach(const QString &s, messages)
|
||||
{
|
||||
if(s.isEmpty())
|
||||
{
|
||||
foreach(const QString & s, messages) {
|
||||
if (s.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
Notification noti;
|
||||
parser->parse(noti, s, client);
|
||||
if(noti.isValid())
|
||||
{
|
||||
if (noti.isValid()) {
|
||||
snore()->broadcastNotification(noti);
|
||||
write(client, QString("%1/%2\r\n").arg(out,QString::number(noti.id())));
|
||||
}
|
||||
else
|
||||
{
|
||||
write(client, QString("%1/%2\r\n").arg(out, QString::number(noti.id())));
|
||||
} else {
|
||||
write(client, QString("%1\r\n").arg(out));
|
||||
}
|
||||
}
|
||||
|
@ -128,9 +116,8 @@ void SnarlNetworkFrontend::handleMessages()
|
|||
|
||||
void SnarlNetworkFrontend::callback(Notification &sn, const QString msg)
|
||||
{
|
||||
if(sn.hints().containsPrivateValue(this, "clientSocket"))
|
||||
{
|
||||
QTcpSocket *client = qobject_cast<QTcpSocket*>(sn.hints().privateValue(this, "clientSocket").value<QObject*>());
|
||||
if (sn.hints().containsPrivateValue(this, "clientSocket")) {
|
||||
QTcpSocket *client = qobject_cast<QTcpSocket *>(sn.hints().privateValue(this, "clientSocket").value<QObject *>());
|
||||
write(client, QString("%1%2\r\n").arg(msg, QString::number(sn.id())));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -27,7 +26,6 @@
|
|||
#include <QTcpSocket>
|
||||
#include <QTcpServer>
|
||||
|
||||
|
||||
class SnarlNetworkFrontend : public Snore::SnoreFrontend
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -35,7 +33,7 @@ class SnarlNetworkFrontend : public Snore::SnoreFrontend
|
|||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationFrontend/1.0")
|
||||
friend class Parser;
|
||||
public:
|
||||
static const int port=9887;
|
||||
static const int port = 9887;
|
||||
|
||||
public:
|
||||
SnarlNetworkFrontend();
|
||||
|
@ -53,13 +51,13 @@ private slots:
|
|||
private:
|
||||
QTcpServer *tcpServer;
|
||||
Parser *parser;
|
||||
QHash<QTcpSocket*,Snore::Application> m_applications;
|
||||
QHash<QTcpSocket *, Snore::Application> m_applications;
|
||||
|
||||
void callback(Snore::Notification &sn,QString msg);
|
||||
void callback(Snore::Notification &sn, QString msg);
|
||||
|
||||
inline void write(QTcpSocket *dest,const QString &msg)
|
||||
inline void write(QTcpSocket *dest, const QString &msg)
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG ) << msg;
|
||||
snoreDebug(SNORE_DEBUG) << msg;
|
||||
dest->write(msg.toAscii());
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -35,7 +34,7 @@
|
|||
using namespace Snore;
|
||||
|
||||
SnoreNotify::SnoreNotify():
|
||||
m_settings("SnoreNotify","SnoreNotify")
|
||||
m_settings("SnoreNotify", "SnoreNotify")
|
||||
{
|
||||
m_trayIcon = new TrayIcon();
|
||||
m_snore = new SnoreCore(m_trayIcon->trayIcon());
|
||||
|
@ -43,11 +42,12 @@ SnoreNotify::SnoreNotify():
|
|||
load();
|
||||
m_trayIcon->initConextMenu(m_snore);
|
||||
|
||||
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(exit()));
|
||||
snoreDebug( SNORE_DEBUG ) << "Snorenotfiy initialized with" << m_snore->primaryNotificationBackend();
|
||||
connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(exit()));
|
||||
snoreDebug(SNORE_DEBUG) << "Snorenotfiy initialized with" << m_snore->primaryNotificationBackend();
|
||||
}
|
||||
|
||||
SnoreNotify::~SnoreNotify(){
|
||||
SnoreNotify::~SnoreNotify()
|
||||
{
|
||||
delete m_snore;
|
||||
delete m_trayIcon;
|
||||
}
|
||||
|
@ -55,26 +55,23 @@ SnoreNotify::~SnoreNotify(){
|
|||
void SnoreNotify::load()
|
||||
{
|
||||
QString backend = m_settings.value("notificationBackend").toString();
|
||||
if(!backend.isEmpty())
|
||||
{
|
||||
if(!m_snore->setPrimaryNotificationBackend(backend))
|
||||
{
|
||||
if (!backend.isEmpty()) {
|
||||
if (!m_snore->setPrimaryNotificationBackend(backend)) {
|
||||
m_snore->setPrimaryNotificationBackend();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_snore->setPrimaryNotificationBackend();
|
||||
}
|
||||
}
|
||||
void SnoreNotify::save(){
|
||||
m_settings.setValue("notificationBackend",m_snore->primaryNotificationBackend());
|
||||
void SnoreNotify::save()
|
||||
{
|
||||
m_settings.setValue("notificationBackend", m_snore->primaryNotificationBackend());
|
||||
}
|
||||
|
||||
void SnoreNotify::exit(){
|
||||
snoreDebug( SNORE_DEBUG )<<"Saving snore settings";
|
||||
foreach(const Application &a,m_snore->aplications())
|
||||
{
|
||||
void SnoreNotify::exit()
|
||||
{
|
||||
snoreDebug(SNORE_DEBUG) << "Saving snore settings";
|
||||
foreach(const Application & a, m_snore->aplications()) {
|
||||
m_snore->deregisterApplication(a);
|
||||
}
|
||||
save();
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -22,11 +21,12 @@
|
|||
|
||||
#include <QtCore>
|
||||
|
||||
namespace Snore{
|
||||
namespace Snore
|
||||
{
|
||||
class SnoreCore;
|
||||
}
|
||||
|
||||
class SnoreNotify:public QObject
|
||||
class SnoreNotify: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -32,7 +31,7 @@ using namespace Snore;
|
|||
TrayIcon::TrayIcon():
|
||||
m_trayIcon(new QSystemTrayIcon(QIcon(":/root/snore.png"))),
|
||||
m_app("SnoreNotify Test", Icon(":/root/snore.png")),
|
||||
m_alert("Default",Icon(":/root/snore.png"))
|
||||
m_alert("Default", Icon(":/root/snore.png"))
|
||||
{
|
||||
m_app.addAlert(m_alert);
|
||||
}
|
||||
|
@ -44,8 +43,7 @@ void TrayIcon::initConextMenu(SnoreCore *snore)
|
|||
|
||||
m_trayMenu = new QMenu("SnoreNotify");
|
||||
QString version = QString("SnoreNotify %1").arg(Version::version());
|
||||
if(Version::revision() != "")
|
||||
{
|
||||
if (Version::revision() != "") {
|
||||
version += QString("-%1").arg(Version::revision());
|
||||
}
|
||||
m_trayMenu->addAction(version);
|
||||
|
@ -54,19 +52,16 @@ void TrayIcon::initConextMenu(SnoreCore *snore)
|
|||
m_trayMenu->addSeparator();
|
||||
m_backendActions = new QActionGroup(m_trayMenu);
|
||||
m_backendActions->setExclusive(true);
|
||||
foreach(const QString &back,m_snore->notificationBackends())
|
||||
{
|
||||
foreach(const QString & back, m_snore->notificationBackends()) {
|
||||
QAction *b = m_trayMenu->addAction(back, this, SLOT(setPrimaryBackend()));
|
||||
b->setCheckable(true);
|
||||
if(back == m_snore->primaryNotificationBackend())
|
||||
{
|
||||
if (back == m_snore->primaryNotificationBackend()) {
|
||||
b->setChecked(true);
|
||||
}
|
||||
m_backendActions->addAction(b);
|
||||
}
|
||||
m_trayMenu->addSeparator();
|
||||
m_trayMenu->addAction("Exit",qApp,SLOT(quit()));
|
||||
|
||||
m_trayMenu->addAction("Exit", qApp, SLOT(quit()));
|
||||
|
||||
m_trayIcon->setContextMenu(m_trayMenu);
|
||||
}
|
||||
|
@ -76,19 +71,18 @@ void TrayIcon::hide()
|
|||
m_trayIcon->setVisible(false);
|
||||
}
|
||||
|
||||
QSystemTrayIcon* TrayIcon::trayIcon()
|
||||
QSystemTrayIcon *TrayIcon::trayIcon()
|
||||
{
|
||||
return m_trayIcon;
|
||||
}
|
||||
|
||||
void TrayIcon::setPrimaryBackend(){
|
||||
QAction *a = qobject_cast<QAction*>(sender());
|
||||
void TrayIcon::setPrimaryBackend()
|
||||
{
|
||||
QAction *a = qobject_cast<QAction *>(sender());
|
||||
m_snore->setPrimaryNotificationBackend(a->text());
|
||||
|
||||
foreach (QAction *action, m_backendActions->actions())
|
||||
{
|
||||
if(action->text() == m_snore->primaryNotificationBackend())
|
||||
{
|
||||
foreach(QAction * action, m_backendActions->actions()) {
|
||||
if (action->text() == m_snore->primaryNotificationBackend()) {
|
||||
action->setChecked(true);
|
||||
break;
|
||||
}
|
||||
|
@ -98,8 +92,7 @@ void TrayIcon::setPrimaryBackend(){
|
|||
void TrayIcon::slotTestNotification()
|
||||
{
|
||||
|
||||
if(!m_snore->aplications().contains(m_app.name()))
|
||||
{
|
||||
if (!m_snore->aplications().contains(m_app.name())) {
|
||||
m_snore->registerApplication(m_app);
|
||||
}
|
||||
Notification noti(m_app, m_alert, "Hello World",
|
||||
|
@ -110,13 +103,13 @@ void TrayIcon::slotTestNotification()
|
|||
"3<br>"
|
||||
"4<br>"
|
||||
"5<br>", Icon(":/root/snore.png"));
|
||||
noti.addAction(Action(1,"Test Action"));
|
||||
noti.addAction(Action(1, "Test Action"));
|
||||
m_snore->broadcastNotification(noti);
|
||||
|
||||
QTimer *timer = new QTimer(this);
|
||||
m_notifications[timer] = noti;
|
||||
timer->setSingleShot(true);
|
||||
timer->setInterval(noti.timeout()/2*1000);
|
||||
timer->setInterval(noti.timeout() / 2 * 1000);
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(sloutUpdateTestNotification()));
|
||||
timer->start();
|
||||
|
||||
|
@ -125,7 +118,7 @@ void TrayIcon::slotTestNotification()
|
|||
|
||||
void TrayIcon::sloutUpdateTestNotification()
|
||||
{
|
||||
QTimer *timer = qobject_cast<QTimer*>(sender());
|
||||
QTimer *timer = qobject_cast<QTimer *>(sender());
|
||||
Notification noti = m_notifications.take(timer);
|
||||
Notification update(noti, "Hello World",
|
||||
"<b>This is Snore</b><br>"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
SnoreNotify is a Notification Framework based on Qt
|
||||
Copyright (C) 2013-2014 Patrick von Reth <vonreth@kde.org>
|
||||
|
||||
|
||||
SnoreNotify is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
|
@ -24,15 +23,14 @@
|
|||
#include <QAction>
|
||||
#include "core/snore.h"
|
||||
|
||||
|
||||
class TrayIcon:public QObject
|
||||
class TrayIcon: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TrayIcon();
|
||||
void initConextMenu(Snore::SnoreCore *snore);
|
||||
void hide();
|
||||
class QSystemTrayIcon* trayIcon();
|
||||
class QSystemTrayIcon *trayIcon();
|
||||
|
||||
private:
|
||||
class QSystemTrayIcon *m_trayIcon;
|
||||
|
@ -42,8 +40,7 @@ private:
|
|||
Snore::Application m_app;
|
||||
Snore::Alert m_alert;
|
||||
|
||||
QHash<QTimer*,Snore::Notification> m_notifications;
|
||||
|
||||
QHash<QTimer *, Snore::Notification> m_notifications;
|
||||
|
||||
public slots:
|
||||
void setPrimaryBackend();
|
||||
|
|
Loading…
Reference in New Issue