[WIP] Support to build with static Qt and static plugins
This commit is contained in:
parent
b8d39da311
commit
96fd4a7914
|
@ -40,28 +40,82 @@ find_package(Qt5Core REQUIRED)
|
||||||
find_package(Qt5Network REQUIRED)
|
find_package(Qt5Network REQUIRED)
|
||||||
find_package(Qt5Gui REQUIRED)
|
find_package(Qt5Gui REQUIRED)
|
||||||
find_package(Qt5Widgets QUIET)
|
find_package(Qt5Widgets QUIET)
|
||||||
|
find_package(Qt5Quick QUIET)
|
||||||
|
|
||||||
|
set_package_properties(Qt5Quick PROPERTIES
|
||||||
|
PURPOSE "Support builtin notifiaction backend."
|
||||||
|
TYPE OPTIONAL)
|
||||||
|
|
||||||
set_package_properties(Qt5Widgets PROPERTIES
|
set_package_properties(Qt5Widgets PROPERTIES
|
||||||
PURPOSE "Supprot for the daemon and the settings dialog as well as some backends."
|
PURPOSE "Supprot for the daemon and the settings dialog as well as some backends."
|
||||||
TYPE OPTIONAL)
|
TYPE OPTIONAL)
|
||||||
|
|
||||||
|
|
||||||
|
option(SNORE_STATIC "Build a static snore" OFF)
|
||||||
|
option(SNORE_STATIC_QT "Build a static snore" OFF)
|
||||||
|
|
||||||
set(LIBSNORE_INCLUDE_DIR ${KDE_INSTALL_INCLUDEDIR}/libsnore)
|
set(LIBSNORE_INCLUDE_DIR ${KDE_INSTALL_INCLUDEDIR}/libsnore)
|
||||||
|
|
||||||
set(LIBSNORE_PLUGIN_PATH ${KDE_INSTALL_PLUGINDIR}/libsnore${SNORE_SUFFIX})
|
set(LIBSNORE_PLUGIN_PATH ${KDE_INSTALL_PLUGINDIR}/libsnore${SNORE_SUFFIX})
|
||||||
set(SNORE_PLUGIN_INSTALL_PATH LIBRARY DESTINATION ${LIBSNORE_PLUGIN_PATH})
|
set(SNORE_PLUGIN_INSTALL_PATH LIBRARY DESTINATION ${LIBSNORE_PLUGIN_PATH})
|
||||||
message(STATUS "Installing plugins to ${LIBSNORE_PLUGIN_PATH}")
|
|
||||||
|
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
||||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
|
||||||
|
if (SNORE_STATIC_QT)
|
||||||
|
if (WIN32)
|
||||||
|
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
set(d "d")
|
||||||
|
else()
|
||||||
|
set(d "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
set(SUFFIX "lib")
|
||||||
|
foreach(_bt DEBUG RELEASE RELWITHDEBINFO)
|
||||||
|
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_${_bt} ${CMAKE_CXX_FLAGS_${_bt}})
|
||||||
|
endforeach(_bt DEBUG RELEASE RELWITHDEBINFO)
|
||||||
|
else()
|
||||||
|
set(SUFFIX "a")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
link_libraries(
|
||||||
|
"${_qt5Core_install_prefix}/lib/qtharfbuzzng${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/lib/qtpcre${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/lib/qtpng${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/lib/qtfreetype${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/lib/Qt5PlatformSupport${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/plugins/platforms/qwindows${d}.${SUFFIX}"
|
||||||
|
"Ws2_32"
|
||||||
|
"Imm32"
|
||||||
|
"Winmm"
|
||||||
|
"Iphlpapi"
|
||||||
|
"opengl32"
|
||||||
|
)
|
||||||
|
if (Qt5Quick_FOUND)
|
||||||
|
link_libraries(
|
||||||
|
"${_qt5Core_install_prefix}/qml/QtQuick.2/qtquick2plugin${d}.${SUFFIX}"
|
||||||
|
"${_qt5Core_install_prefix}/qml/QtQuick/Window.2/windowplugin${d}.${SUFFIX}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(data)
|
add_subdirectory(data)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if (NOT SNORE_STATIC)
|
||||||
add_subdirectory(autotest)
|
add_subdirectory(autotest)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po")
|
if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po")
|
||||||
ecm_install_po_files_as_qm(po)
|
ecm_install_po_files_as_qm(po)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
generate_snore_plugin_header()
|
||||||
|
|
||||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES)
|
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES)
|
||||||
|
|
|
@ -2,7 +2,7 @@ include(libsnore/SnoreAddPlugin.cmake)
|
||||||
|
|
||||||
add_subdirectory(libsnore)
|
add_subdirectory(libsnore)
|
||||||
|
|
||||||
if(Qt5Widgets_FOUND)
|
if(Qt5Widgets_FOUND AND NOT SNORE_STATIC)
|
||||||
ecm_optional_add_subdirectory(daemon)
|
ecm_optional_add_subdirectory(daemon)
|
||||||
add_feature_info(BUILD_daemon BUILD_daemon "Build and install the snorenotify daemon which receives and redirects notifications.")
|
add_feature_info(BUILD_daemon BUILD_daemon "Build and install the snorenotify daemon which receives and redirects notifications.")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -6,9 +6,9 @@ if(NOT SNORE_REVISION)
|
||||||
set(SNORE_REVISION "")
|
set(SNORE_REVISION "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h")
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h")
|
||||||
|
|
||||||
|
|
||||||
ecm_create_qm_loader(SnoreNotify_QM_LOADER snorenotify${SNORE_SUFFIX}_qt)
|
ecm_create_qm_loader(SnoreNotify_QM_LOADER snorenotify${SNORE_SUFFIX}_qt)
|
||||||
|
|
||||||
QT5_ADD_RESOURCES(SNORENOTIFY_RCS ${SNORE_RCS})
|
QT5_ADD_RESOURCES(SNORENOTIFY_RCS ${SNORE_RCS})
|
||||||
|
@ -41,10 +41,14 @@ list(APPEND SnoreNotify_HDR
|
||||||
utils.h
|
utils.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/snore_exports.h
|
${CMAKE_CURRENT_BINARY_DIR}/snore_exports.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/version.h
|
${CMAKE_CURRENT_BINARY_DIR}/version.h
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/snore_static_plugins.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT SNORE_STATIC)
|
||||||
add_library( libsnore SHARED ${SnoreNotify_SRCS} ${SnoreNotify_QM_LOADER})
|
add_library( libsnore SHARED ${SnoreNotify_SRCS} ${SnoreNotify_QM_LOADER})
|
||||||
|
else()
|
||||||
|
add_library( libsnore STATIC ${SnoreNotify_SRCS} ${SnoreNotify_QM_LOADER})
|
||||||
|
endif()
|
||||||
set_target_properties( libsnore PROPERTIES
|
set_target_properties( libsnore PROPERTIES
|
||||||
OUTPUT_NAME "snore${SNORE_SUFFIX}"
|
OUTPUT_NAME "snore${SNORE_SUFFIX}"
|
||||||
VERSION "${SNORE_VERSION_MAJOR}.${SNORE_VERSION_MINOR}.${SNORE_VERSION_PATCH}"
|
VERSION "${SNORE_VERSION_MAJOR}.${SNORE_VERSION_MINOR}.${SNORE_VERSION_PATCH}"
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
include(CMakeParseArguments)
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
function(_test_type TYPE)
|
function(_test_type TYPE)
|
||||||
|
@ -16,29 +15,77 @@ function(_test_name UPPER LOWER)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
function(generate_snore_plugin_header)
|
||||||
|
set(SNORE_PLUGIN_LOADING "")
|
||||||
|
foreach(PLUGIN ${SNORE_PLUGIN_LIST})
|
||||||
|
set(SNORE_PLUGIN_LOADING "${SNORE_PLUGIN_LOADING}Q_IMPORT_PLUGIN(${PLUGIN})\n")
|
||||||
|
endforeach()
|
||||||
|
set(SNORE_RESOURCE_LOADING "Q_INIT_RESOURCE(snore);")
|
||||||
|
foreach(RESOURCE ${SNORE_PLUGIN_RESOURCES})
|
||||||
|
set(SNORE_RESOURCE_LOADING "${SNORE_RESOURCE_LOADING}\n Q_INIT_RESOURCE(${RESOURCE});")
|
||||||
|
endforeach()
|
||||||
|
configure_file("${PROJECT_SOURCE_DIR}/src/libsnore/snore_static_plugins.h.in" "${PROJECT_BINARY_DIR}/src/libsnore/snore_static_plugins.h")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(add_snore_plugin SNORE_NAME)
|
function(add_snore_plugin SNORE_NAME)
|
||||||
set(options)
|
set(options)
|
||||||
set(oneValueArgs TYPE)
|
set(oneValueArgs TYPE)
|
||||||
set(multiValueArgs SETTINGS_SOURCES SETTINGS_LIBS SOURCES LIBS)
|
set(multiValueArgs SETTINGS_SOURCES SETTINGS_LIBS SOURCES LIBS RESOURCES)
|
||||||
cmake_parse_arguments(SNORE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
cmake_parse_arguments(SNORE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||||
|
|
||||||
string( TOLOWER "${SNORE_NAME}" SNORE_NAME_LOWERCASE)
|
string(REGEX REPLACE "[ \t\r\n]" "" SNORE_NAME_NO_SPACE ${SNORE_NAME})
|
||||||
|
string( TOLOWER "${SNORE_NAME_NO_SPACE}" SNORE_NAME_LOWERCASE)
|
||||||
_test_name(${SNORE_NAME} ${SNORE_NAME_LOWERCASE})
|
_test_name(${SNORE_NAME} ${SNORE_NAME_LOWERCASE})
|
||||||
string(REGEX REPLACE "[ \t\r\n]" "" SNORE_NAME_LOWERCASE ${SNORE_NAME_LOWERCASE})
|
|
||||||
|
|
||||||
_test_type(${SNORE_TYPE})
|
_test_type(${SNORE_TYPE})
|
||||||
string( TOLOWER "${SNORE_TYPE}" SNORE_TYPE_LOWERCASE)
|
string( TOLOWER "${SNORE_TYPE}" SNORE_TYPE_LOWERCASE)
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/snore_plugin.json "{ \"name\" : \"${SNORE_NAME}\" }")
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/snore_plugin.json "{ \"name\" : \"${SNORE_NAME}\" }")
|
||||||
|
|
||||||
|
if(NOT SNORE_STATIC)
|
||||||
add_library(libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} MODULE ${SNORE_SOURCES})
|
add_library(libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} MODULE ${SNORE_SOURCES})
|
||||||
target_link_libraries(libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} Snore::Libsnore ${SNORE_LIBS})
|
|
||||||
install(TARGETS libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} ${SNORE_PLUGIN_INSTALL_PATH})
|
install(TARGETS libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} ${SNORE_PLUGIN_INSTALL_PATH})
|
||||||
|
else()
|
||||||
|
list(APPEND SNORE_PLUGIN_LIST "${SNORE_NAME_NO_SPACE}")
|
||||||
|
add_library(libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} STATIC ${SNORE_SOURCES})
|
||||||
|
#todo install and export the plugins
|
||||||
|
#install(TARGETS libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
set_property( TARGET libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE}
|
||||||
|
APPEND
|
||||||
|
PROPERTY COMPILE_DEFINITIONS QT_STATICPLUGIN)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} Snore::Libsnore ${SNORE_LIBS})
|
||||||
|
|
||||||
if(SNORE_SETTINGS_SOURCES AND Qt5Widgets_FOUND)
|
if(SNORE_SETTINGS_SOURCES AND Qt5Widgets_FOUND)
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/snore_settings_plugin.json "{ \"name\" : \"${SNORE_NAME}${SNORE_TYPE}\" }")
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/snore_settings_plugin.json "{ \"name\" : \"${SNORE_NAME}${SNORE_TYPE}\" }")
|
||||||
|
|
||||||
|
if(NOT SNORE_STATIC)
|
||||||
add_library(libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} MODULE ${SNORE_SETTINGS_SOURCES} )
|
add_library(libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} MODULE ${SNORE_SETTINGS_SOURCES} )
|
||||||
target_link_libraries(libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} Snore::Libsnore Snore::LibsnoreSettings ${SNORE_SETTINGS_LIBS})
|
|
||||||
install(TARGETS libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} ${SNORE_PLUGIN_INSTALL_PATH})
|
install(TARGETS libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} ${SNORE_PLUGIN_INSTALL_PATH})
|
||||||
|
else()
|
||||||
|
add_library(libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} STATIC ${SNORE_SETTINGS_SOURCES} )
|
||||||
|
set_property( TARGET libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE}
|
||||||
|
APPEND
|
||||||
|
PROPERTY COMPILE_DEFINITIONS QT_STATICPLUGIN)
|
||||||
|
list(APPEND SNORE_PLUGINS libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} )
|
||||||
|
list(APPEND SNORE_PLUGIN_LIST "${SNORE_NAME_NO_SPACE}SettingsPlugin")
|
||||||
|
endif()
|
||||||
|
target_link_libraries(libsnore_settings_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE} Snore::Libsnore Snore::LibsnoreSettings ${SNORE_SETTINGS_LIBS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SNORE_STATIC)
|
||||||
|
list(REMOVE_DUPLICATES SNORE_PLUGIN_LIST)
|
||||||
|
set(SNORE_PLUGIN_LIST ${SNORE_PLUGIN_LIST} CACHE INTERNAL "A list of all plugins names." FORCE)
|
||||||
|
|
||||||
|
list(APPEND SNORE_PLUGIN_RESOURCES "${SNORE_RESOURCES}")
|
||||||
|
list(APPEND SNORE_PLUGINS libsnore_${SNORE_TYPE_LOWERCASE}_${SNORE_NAME_LOWERCASE})
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES SNORE_PLUGINS)
|
||||||
|
set(SNORE_PLUGINS ${SNORE_PLUGINS} CACHE INTERNAL "A list of all plugins." FORCE)
|
||||||
|
list(REMOVE_DUPLICATES SNORE_PLUGIN_RESOURCES)
|
||||||
|
set(SNORE_PLUGIN_RESOURCES ${SNORE_PLUGIN_RESOURCES} CACHE INTERNAL "A list of all plugins resources." FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
using namespace Snore;
|
using namespace Snore;
|
||||||
|
|
||||||
|
|
|
@ -24,21 +24,32 @@
|
||||||
#include "snorefrontend.h"
|
#include "snorefrontend.h"
|
||||||
#include "libsnore/version.h"
|
#include "libsnore/version.h"
|
||||||
|
|
||||||
|
#define SNORE_CONFIG_ONLY
|
||||||
|
#include "libsnore/snore_static_plugins.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
||||||
using namespace Snore;
|
namespace Snore {
|
||||||
|
|
||||||
QHash<SnorePlugin::PluginTypes, QHash<QString, PluginContainer *> > PluginContainer::s_pluginCache;
|
QHash<SnorePlugin::PluginTypes, QHash<QString, PluginContainer *> > PluginContainer::s_pluginCache;
|
||||||
|
|
||||||
|
|
||||||
|
PluginContainer::PluginContainer(const QString &pluginName, SnorePlugin::PluginTypes type, SnorePlugin *plugin):
|
||||||
|
m_pluginName(pluginName),
|
||||||
|
m_pluginType(type),
|
||||||
|
m_plugin(plugin)
|
||||||
|
{
|
||||||
|
m_plugin->m_name = pluginName;
|
||||||
|
}
|
||||||
|
|
||||||
PluginContainer::PluginContainer(const QString &fileName, const QString &pluginName, SnorePlugin::PluginTypes type):
|
PluginContainer::PluginContainer(const QString &fileName, const QString &pluginName, SnorePlugin::PluginTypes type):
|
||||||
m_pluginFile(fileName),
|
m_pluginFile(fileName),
|
||||||
m_pluginName(pluginName),
|
m_pluginName(pluginName),
|
||||||
m_pluginType(type),
|
m_pluginType(type),
|
||||||
m_loader(pluginDir().absoluteFilePath(file()))
|
m_loader(pluginDir().absoluteFilePath(file()))
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginContainer::~PluginContainer()
|
PluginContainer::~PluginContainer()
|
||||||
|
@ -48,24 +59,18 @@ PluginContainer::~PluginContainer()
|
||||||
|
|
||||||
SnorePlugin *PluginContainer::load()
|
SnorePlugin *PluginContainer::load()
|
||||||
{
|
{
|
||||||
if (!m_loader.isLoaded() && !m_loader.load()) {
|
if (!m_plugin && !m_loader.isLoaded() && !m_loader.load()) {
|
||||||
qCWarning(SNORE) << "Failed loading plugin: " << m_loader.errorString();
|
qCWarning(SNORE) << "Failed loading plugin: " << m_loader.errorString();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (!m_plugin) {
|
if (!m_plugin) {
|
||||||
m_plugin = qobject_cast<SnorePlugin *> (m_loader.instance());
|
m_plugin = qobject_cast<SnorePlugin *> (m_loader.instance());
|
||||||
m_plugin->m_container = this;
|
m_plugin->m_name = name();
|
||||||
m_plugin->setDefaultSettings();
|
m_plugin->setDefaultSettings();
|
||||||
}
|
}
|
||||||
return m_plugin;
|
return m_plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginContainer::unload()
|
|
||||||
{
|
|
||||||
m_loader.unload();
|
|
||||||
m_plugin = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString &PluginContainer::file()
|
const QString &PluginContainer::file()
|
||||||
{
|
{
|
||||||
return m_pluginFile;
|
return m_pluginFile;
|
||||||
|
@ -94,9 +99,9 @@ void PluginContainer::updatePluginCache()
|
||||||
list.clear();
|
list.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !SNORE_STATIC
|
||||||
foreach(const SnorePlugin::PluginTypes type, SnorePlugin::types()) {
|
foreach(const SnorePlugin::PluginTypes type, SnorePlugin::types()) {
|
||||||
foreach(const QFileInfo & file, pluginDir().entryInfoList(
|
foreach(const QFileInfo & file, pluginDir().entryInfoList(pluginFileFilters(type), QDir::Files)) {
|
||||||
QStringList(pluginFileFilters(type)), QDir::Files)) {
|
|
||||||
qCDebug(SNORE) << "adding" << file.absoluteFilePath();
|
qCDebug(SNORE) << "adding" << file.absoluteFilePath();
|
||||||
QPluginLoader loader(file.absoluteFilePath());
|
QPluginLoader loader(file.absoluteFilePath());
|
||||||
QJsonObject data = loader.metaData()[QStringLiteral("MetaData")].toObject();
|
QJsonObject data = loader.metaData()[QStringLiteral("MetaData")].toObject();
|
||||||
|
@ -108,6 +113,18 @@ void PluginContainer::updatePluginCache()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
foreach (const QStaticPlugin plugin, QPluginLoader::staticPlugins()) {
|
||||||
|
QJsonObject data = plugin.metaData()[QStringLiteral("MetaData")].toObject();
|
||||||
|
QString name = data.value(QStringLiteral("name")).toString();
|
||||||
|
if (!name.isEmpty()) {
|
||||||
|
SnorePlugin *sp = qobject_cast<SnorePlugin*>(plugin.instance());
|
||||||
|
PluginContainer *info = new PluginContainer(name, sp->type(), sp);
|
||||||
|
s_pluginCache[sp->type()].insert(name, info);
|
||||||
|
qCDebug(SNORE) << "added" << sp->type() << ":" << name << "to cache";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const QHash<QString, PluginContainer *> PluginContainer::pluginCache(SnorePlugin::PluginTypes type)
|
const QHash<QString, PluginContainer *> PluginContainer::pluginCache(SnorePlugin::PluginTypes type)
|
||||||
|
@ -170,3 +187,4 @@ const QDir &PluginContainer::pluginDir()
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -35,10 +35,10 @@ class PluginContainer
|
||||||
public:
|
public:
|
||||||
static const QHash<QString, PluginContainer *> pluginCache(SnorePlugin::PluginTypes type);
|
static const QHash<QString, PluginContainer *> pluginCache(SnorePlugin::PluginTypes type);
|
||||||
|
|
||||||
|
PluginContainer(const QString &pluginName, SnorePlugin::PluginTypes type, SnorePlugin *plugin);
|
||||||
PluginContainer(const QString &fileName, const QString &pluginName, SnorePlugin::PluginTypes type);
|
PluginContainer(const QString &fileName, const QString &pluginName, SnorePlugin::PluginTypes type);
|
||||||
~PluginContainer();
|
~PluginContainer();
|
||||||
SnorePlugin *load();
|
SnorePlugin *load();
|
||||||
void unload();
|
|
||||||
const QString &file();
|
const QString &file();
|
||||||
const QString &name();
|
const QString &name();
|
||||||
SnorePlugin::PluginTypes type();
|
SnorePlugin::PluginTypes type();
|
||||||
|
|
|
@ -79,8 +79,7 @@ QString SnorePlugin::normaliseKey(const QString &key) const
|
||||||
|
|
||||||
const QString &SnorePlugin::name() const
|
const QString &SnorePlugin::name() const
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(m_container, Q_FUNC_INFO, "Plugin container not set.");
|
return m_name;
|
||||||
return m_container->name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString SnorePlugin::typeName() const
|
const QString SnorePlugin::typeName() const
|
||||||
|
|
|
@ -162,7 +162,7 @@ private:
|
||||||
void setDefaultSettingsPlugin();
|
void setDefaultSettingsPlugin();
|
||||||
|
|
||||||
bool m_enabled = false;
|
bool m_enabled = false;
|
||||||
PluginContainer *m_container = nullptr;
|
QString m_name;
|
||||||
QString m_error;
|
QString m_error;
|
||||||
Hint m_hints;
|
Hint m_hints;
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
PluginTypes type() const override
|
PluginTypes type() const override
|
||||||
{
|
{
|
||||||
return SnorePlugin::Settings;
|
return SnorePlugin::Settings;
|
||||||
};
|
}
|
||||||
|
|
||||||
virtual PluginSettingsWidget *settingsWidget(SnorePlugin *parent) = 0;
|
virtual PluginSettingsWidget *settingsWidget(SnorePlugin *parent) = 0;
|
||||||
|
|
||||||
|
@ -50,14 +50,16 @@ Q_DECLARE_INTERFACE(Snore::SettingsPlugin,
|
||||||
"org.Snore.SettingsPlugin/1.0")
|
"org.Snore.SettingsPlugin/1.0")
|
||||||
|
|
||||||
#define SNORE_DECLARE_SETTINGS_PLUGIN( NAME )\
|
#define SNORE_DECLARE_SETTINGS_PLUGIN( NAME )\
|
||||||
class NAMESettings : public Snore::SettingsPlugin{\
|
namespace SnorePlugin {\
|
||||||
|
class NAME ##SettingsPlugin : public Snore::SettingsPlugin {\
|
||||||
Q_OBJECT\
|
Q_OBJECT\
|
||||||
Q_INTERFACES(Snore::SettingsPlugin)\
|
Q_INTERFACES(Snore::SettingsPlugin)\
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.SettingsPlugin/1.0" FILE "snore_settings_plugin.json")\
|
Q_PLUGIN_METADATA(IID "org.Snore.SettingsPlugin/1.0" FILE "snore_settings_plugin.json")\
|
||||||
public:\
|
public:\
|
||||||
Snore::PluginSettingsWidget *settingsWidget(Snore::SnorePlugin *parent) override{\
|
Snore::PluginSettingsWidget *settingsWidget(Snore::SnorePlugin *parent) override{\
|
||||||
return new NAME(parent);\
|
return new NAME ##Settings(parent);\
|
||||||
}\
|
}\
|
||||||
};
|
};\
|
||||||
|
}
|
||||||
|
|
||||||
#endif // SETTINGSPLUGIN_H
|
#endif // SETTINGSPLUGIN_H
|
||||||
|
|
|
@ -17,8 +17,11 @@ set(snoresettings_HDR
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/snore_settings_exports.h
|
${CMAKE_CURRENT_BINARY_DIR}/snore_settings_exports.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT SNORE_STATIC)
|
||||||
add_library( libsnoresettings SHARED ${snoresettings_SRCS})
|
add_library( libsnoresettings SHARED ${snoresettings_SRCS})
|
||||||
|
else()
|
||||||
|
add_library( libsnoresettings STATIC ${snoresettings_SRCS})
|
||||||
|
endif()
|
||||||
set_target_properties( libsnoresettings PROPERTIES
|
set_target_properties( libsnoresettings PROPERTIES
|
||||||
OUTPUT_NAME "snoresettings${SNORE_SUFFIX}"
|
OUTPUT_NAME "snoresettings${SNORE_SUFFIX}"
|
||||||
VERSION "${SNORE_VERSION_MAJOR}.${SNORE_VERSION_MINOR}.${SNORE_VERSION_PATCH}"
|
VERSION "${SNORE_VERSION_MAJOR}.${SNORE_VERSION_MINOR}.${SNORE_VERSION_PATCH}"
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#ifndef SNORE_STATIC_PLUGINS_H
|
||||||
|
#define SNORE_STATIC_PLUGINS_H
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QtPlugin>
|
||||||
|
|
||||||
|
#cmakedefine01 SNORE_STATIC
|
||||||
|
#cmakedefine01 SNORE_STATIC_QT
|
||||||
|
#cmakedefine01 Qt5Quick_FOUND
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SNORE_CONFIG_ONLY
|
||||||
|
#if SNORE_STATIC_QT
|
||||||
|
|
||||||
|
#if Qt5Quick_FOUND
|
||||||
|
Q_IMPORT_PLUGIN(QtQuick2Plugin)
|
||||||
|
Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
|
||||||
|
#else
|
||||||
|
#error Unsupported platform
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SNORE_STATIC
|
||||||
|
namespace SnorePlugin {}
|
||||||
|
|
||||||
|
|
||||||
|
using namespace SnorePlugin;
|
||||||
|
${SNORE_PLUGIN_LOADING}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
static void loadSnoreResources()
|
||||||
|
{
|
||||||
|
// prevent multiple symbols
|
||||||
|
static const auto load = []() {
|
||||||
|
${SNORE_RESOURCE_LOADING}
|
||||||
|
};
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Q_COREAPP_STARTUP_FUNCTION(loadSnoreResources)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -4,7 +4,9 @@ add_feature_info(BUILD_backends BUILD_backends "Build and install the backends,
|
||||||
ecm_optional_add_subdirectory(secondary_backends)
|
ecm_optional_add_subdirectory(secondary_backends)
|
||||||
add_feature_info(BUILD_secondary_backends BUILD_secondary_backends "Build and install the secondary_backends, which are used to display non interactive notifications.")
|
add_feature_info(BUILD_secondary_backends BUILD_secondary_backends "Build and install the secondary_backends, which are used to display non interactive notifications.")
|
||||||
|
|
||||||
|
if (NOT SNORE_STATIC)
|
||||||
ecm_optional_add_subdirectory(frontends)
|
ecm_optional_add_subdirectory(frontends)
|
||||||
add_feature_info(BUILD_frontends BUILD_frontends "Build and install the frontends, which are used to receive notifications.")
|
add_feature_info(BUILD_frontends BUILD_frontends "Build and install the frontends, which are used to receive notifications.")
|
||||||
|
endif()
|
||||||
|
|
||||||
ecm_optional_add_subdirectory(plugins)
|
ecm_optional_add_subdirectory(plugins)
|
||||||
|
|
|
@ -8,9 +8,7 @@
|
||||||
|
|
||||||
#include "fredesktopnotification.h"
|
#include "fredesktopnotification.h"
|
||||||
|
|
||||||
using namespace Snore;
|
SnorePlugin::Freedesktop::Freedesktop()
|
||||||
|
|
||||||
FreedesktopBackend::FreedesktopBackend()
|
|
||||||
{
|
{
|
||||||
m_interface = new org::freedesktop::Notifications(QStringLiteral("org.freedesktop.Notifications"),
|
m_interface = new org::freedesktop::Notifications(QStringLiteral("org.freedesktop.Notifications"),
|
||||||
QStringLiteral("/org/freedesktop/Notifications"),
|
QStringLiteral("/org/freedesktop/Notifications"),
|
||||||
|
@ -21,29 +19,29 @@ FreedesktopBackend::FreedesktopBackend()
|
||||||
m_supportsRichtext = reply.value().contains(QStringLiteral("body-markup"));
|
m_supportsRichtext = reply.value().contains(QStringLiteral("body-markup"));
|
||||||
watcher->deleteLater();
|
watcher->deleteLater();
|
||||||
});
|
});
|
||||||
connect(this, &FreedesktopBackend::enabledChanged, [this](bool enabled) {
|
connect(this, &Freedesktop::enabledChanged, [this](bool enabled) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
connect(m_interface, &org::freedesktop::Notifications::ActionInvoked, this, &FreedesktopBackend::slotActionInvoked);
|
connect(m_interface, &org::freedesktop::Notifications::ActionInvoked, this, &Freedesktop::slotActionInvoked);
|
||||||
connect(m_interface, &org::freedesktop::Notifications::NotificationClosed, this , &FreedesktopBackend::slotNotificationClosed);
|
connect(m_interface, &org::freedesktop::Notifications::NotificationClosed, this , &Freedesktop::slotNotificationClosed);
|
||||||
} else {
|
} else {
|
||||||
disconnect(m_interface, &org::freedesktop::Notifications::ActionInvoked, this, &FreedesktopBackend::slotActionInvoked);
|
disconnect(m_interface, &org::freedesktop::Notifications::ActionInvoked, this, &Freedesktop::slotActionInvoked);
|
||||||
disconnect(m_interface, &org::freedesktop::Notifications::NotificationClosed, this , &FreedesktopBackend::slotNotificationClosed);
|
disconnect(m_interface, &org::freedesktop::Notifications::NotificationClosed, this , &Freedesktop::slotNotificationClosed);
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FreedesktopBackend::canCloseNotification() const
|
bool SnorePlugin::Freedesktop::canCloseNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FreedesktopBackend::canUpdateNotification() const
|
bool SnorePlugin::Freedesktop::canUpdateNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreedesktopBackend::slotNotify(Notification noti)
|
void SnorePlugin::Freedesktop::slotNotify(Snore::Notification noti)
|
||||||
{
|
{
|
||||||
if (noti.data()->sourceAndTargetAreSimilar(this)) {
|
if (noti.data()->sourceAndTargetAreSimilar(this)) {
|
||||||
return;
|
return;
|
||||||
|
@ -78,8 +76,8 @@ void FreedesktopBackend::slotNotify(Notification noti)
|
||||||
m_dbusIdMap.take(updateId);
|
m_dbusIdMap.take(updateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString title = noti.application().name() + QLatin1String(" - ") + noti.title(m_supportsRichtext ? Utils::AllMarkup : Utils::NoMarkup);
|
QString title = noti.application().name() + QLatin1String(" - ") + noti.title(m_supportsRichtext ? Snore::Utils::AllMarkup : Snore::Utils::NoMarkup);
|
||||||
QString body(noti.text(m_supportsRichtext ? Utils::AllMarkup : Utils::NoMarkup));
|
QString body(noti.text(m_supportsRichtext ? Snore::Utils::AllMarkup : Snore::Utils::NoMarkup));
|
||||||
//TODO: add app icon hint?
|
//TODO: add app icon hint?
|
||||||
QDBusPendingReply<uint> id = m_interface->Notify(noti.application().name(), updateId, QString(), title,
|
QDBusPendingReply<uint> id = m_interface->Notify(noti.application().name(), updateId, QString(), title,
|
||||||
body, actions, hints, noti.isSticky() ? -1 : noti.timeout() * 1000);
|
body, actions, hints, noti.isSticky() ? -1 : noti.timeout() * 1000);
|
||||||
|
@ -92,24 +90,24 @@ void FreedesktopBackend::slotNotify(Notification noti)
|
||||||
qCDebug(SNORE) << noti.id() << "|" << id.value();
|
qCDebug(SNORE) << noti.id() << "|" << id.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreedesktopBackend::slotActionInvoked(const uint id, const QString &actionID)
|
void SnorePlugin::Freedesktop::slotActionInvoked(const uint id, const QString &actionID)
|
||||||
{
|
{
|
||||||
qCDebug(SNORE) << id << m_dbusIdMap[id];
|
qCDebug(SNORE) << id << m_dbusIdMap[id];
|
||||||
Notification noti = m_dbusIdMap[id];
|
Snore::Notification noti = m_dbusIdMap[id];
|
||||||
if (!noti.isValid()) {
|
if (!noti.isValid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
slotNotificationActionInvoked(noti, noti.actions().value(actionID.toInt()));;
|
slotNotificationActionInvoked(noti, noti.actions().value(actionID.toInt()));;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreedesktopBackend::slotCloseNotification(Notification notification)
|
void SnorePlugin::Freedesktop::slotCloseNotification(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
uint id = notification.hints().privateValue(this, "id").toUInt();
|
uint id = notification.hints().privateValue(this, "id").toUInt();
|
||||||
qCDebug(SNORE) << notification.id() << id;
|
qCDebug(SNORE) << notification.id() << id;
|
||||||
m_interface->CloseNotification(id);
|
m_interface->CloseNotification(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreedesktopBackend::slotNotificationClosed(const uint id, const uint reason)
|
void SnorePlugin::Freedesktop::slotNotificationClosed(const uint id, const uint reason)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
@ -123,26 +121,26 @@ void FreedesktopBackend::slotNotificationClosed(const uint id, const uint reason
|
||||||
*
|
*
|
||||||
* 4 - Undefined/reserved reasons.
|
* 4 - Undefined/reserved reasons.
|
||||||
*/
|
*/
|
||||||
Notification::CloseReasons closeReason;
|
Snore::Notification::CloseReasons closeReason;
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case (1):
|
case (1):
|
||||||
closeReason = Notification::TimedOut;
|
closeReason = Snore::Notification::TimedOut;
|
||||||
break;
|
break;
|
||||||
case (2):
|
case (2):
|
||||||
closeReason = Notification::Dismissed;
|
closeReason = Snore::Notification::Dismissed;
|
||||||
break;
|
break;
|
||||||
case (3):
|
case (3):
|
||||||
closeReason = Notification::Closed;
|
closeReason = Snore::Notification::Closed;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
closeReason = Notification::None;
|
closeReason = Snore::Notification::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
qCDebug(SNORE) << id << "|" << closeReason << reason;
|
qCDebug(SNORE) << id << "|" << closeReason << reason;
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Notification noti = m_dbusIdMap.take(id);
|
Snore::Notification noti = m_dbusIdMap.take(id);
|
||||||
if (noti.isValid()) {
|
if (noti.isValid()) {
|
||||||
closeNotification(noti, closeReason);
|
closeNotification(noti, closeReason);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,16 @@
|
||||||
#include "libsnore/plugins/snorebackend.h"
|
#include "libsnore/plugins/snorebackend.h"
|
||||||
#include "notificationinterface.h"
|
#include "notificationinterface.h"
|
||||||
|
|
||||||
class FreedesktopBackend: public Snore::SnoreBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class Freedesktop: public Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
FreedesktopBackend();
|
Freedesktop();
|
||||||
~FreedesktopBackend() = default;
|
~Freedesktop() = default;
|
||||||
|
|
||||||
bool canCloseNotification() const override;
|
bool canCloseNotification() const override;
|
||||||
bool canUpdateNotification() const override;
|
bool canUpdateNotification() const override;
|
||||||
|
@ -29,4 +31,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif // FREEDESKTOPNOTIFICATION_H
|
#endif // FREEDESKTOPNOTIFICATION_H
|
||||||
|
|
|
@ -24,64 +24,63 @@
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
using namespace Snore;
|
|
||||||
|
|
||||||
GrowlBackend *GrowlBackend::s_instance = nullptr;
|
SnorePlugin::Growl *SnorePlugin::Growl::s_instance = nullptr;
|
||||||
|
|
||||||
GrowlBackend::GrowlBackend()
|
SnorePlugin::Growl::Growl()
|
||||||
{
|
{
|
||||||
s_instance = this;
|
s_instance = this;
|
||||||
|
|
||||||
auto func = [](growl_callback_data * data)->void {
|
auto func = [](growl_callback_data * data)->void {
|
||||||
qCDebug(SNORE) << data->id << QString::fromUtf8(data->reason) << QString::fromUtf8(data->data);
|
qCDebug(SNORE) << data->id << QString::fromUtf8(data->reason) << QString::fromUtf8(data->data);
|
||||||
Notification n = Snore::SnoreCore::instance().getActiveNotificationByID(data->id);
|
Snore::Notification n = Snore::SnoreCore::instance().getActiveNotificationByID(data->id);
|
||||||
if (!n.isValid())
|
if (!n.isValid())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Notification::CloseReasons r = Notification::None;
|
Snore::Notification::CloseReasons r = Snore::Notification::None;
|
||||||
std::string reason(data->reason);
|
std::string reason(data->reason);
|
||||||
if (reason == "TIMEDOUT")
|
if (reason == "TIMEDOUT")
|
||||||
{
|
{
|
||||||
r = Notification::TimedOut;
|
r = Snore::Notification::TimedOut;
|
||||||
} else if (reason == "CLOSED")
|
} else if (reason == "CLOSED")
|
||||||
{
|
{
|
||||||
r = Notification::Dismissed;
|
r = Snore::Notification::Dismissed;
|
||||||
} else if (reason == "CLICK")
|
} else if (reason == "CLICK")
|
||||||
{
|
{
|
||||||
r = Notification::Activated;
|
r = Snore::Notification::Activated;
|
||||||
s_instance->slotNotificationActionInvoked(n);
|
s_instance->slotNotificationActionInvoked(n);
|
||||||
}
|
}
|
||||||
s_instance->closeNotification(n, r);
|
s_instance->closeNotification(n, r);
|
||||||
};
|
};
|
||||||
Growl::init((GROWL_CALLBACK)static_cast<void(*)(growl_callback_data *)>(func));
|
::Growl::init((GROWL_CALLBACK)static_cast<void(*)(growl_callback_data *)>(func));
|
||||||
}
|
}
|
||||||
|
|
||||||
GrowlBackend::~GrowlBackend()
|
SnorePlugin::Growl::~Growl()
|
||||||
{
|
{
|
||||||
Growl::shutdown();
|
::Growl::shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GrowlBackend::isReady()
|
bool SnorePlugin::Growl::isReady()
|
||||||
{
|
{
|
||||||
bool running = Growl::isRunning(GROWL_TCP, settingsValue(QStringLiteral("Host")).toString().toUtf8().constData());
|
bool running = ::Growl::isRunning(GROWL_TCP, settingsValue(QStringLiteral("Host")).toString().toUtf8().constData());
|
||||||
if (!running) {
|
if (!running) {
|
||||||
setErrorString(tr("%1 is not running.").arg(name()));
|
setErrorString(tr("%1 is not running.").arg(name()));
|
||||||
}
|
}
|
||||||
return running;
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrowlBackend::slotRegisterApplication(const Application &application)
|
void SnorePlugin::Growl::slotRegisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
qCDebug(SNORE) << application.name();
|
qCDebug(SNORE) << application.name();
|
||||||
std::vector<std::string> alerts;
|
std::vector<std::string> alerts;
|
||||||
alerts.reserve(application.alerts().size());
|
alerts.reserve(application.alerts().size());
|
||||||
foreach(const Alert & a, application.alerts()) {
|
foreach(const Snore::Alert & a, application.alerts()) {
|
||||||
qCDebug(SNORE) << a.name();
|
qCDebug(SNORE) << a.name();
|
||||||
alerts.push_back(a.name().toUtf8().constData());
|
alerts.push_back(a.name().toUtf8().constData());
|
||||||
}
|
}
|
||||||
|
|
||||||
Growl *growl = new Growl(GROWL_TCP, settingsValue(QStringLiteral("Host")).toString().toUtf8().constData(),
|
::Growl *growl = new ::Growl(GROWL_TCP, settingsValue(QStringLiteral("Host")).toString().toUtf8().constData(),
|
||||||
settingsValue(QStringLiteral("Password")).toString().toUtf8().constData(),
|
settingsValue(QStringLiteral("Password")).toString().toUtf8().constData(),
|
||||||
application.name().toUtf8().constData());
|
application.name().toUtf8().constData());
|
||||||
m_applications.insert(application.name(), growl);
|
m_applications.insert(application.name(), growl);
|
||||||
|
@ -89,18 +88,18 @@ void GrowlBackend::slotRegisterApplication(const Application &application)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrowlBackend::slotDeregisterApplication(const Application &application)
|
void SnorePlugin::Growl::slotDeregisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
Growl *growl = m_applications.take(application.name());
|
::Growl *growl = m_applications.take(application.name());
|
||||||
if (growl == nullptr) {
|
if (growl == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
delete growl;
|
delete growl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrowlBackend::slotNotify(Notification notification)
|
void SnorePlugin::Growl::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
Growl *growl = m_applications.value(notification.application().name());
|
::Growl *growl = m_applications.value(notification.application().name());
|
||||||
QString alert = notification.alert().name();
|
QString alert = notification.alert().name();
|
||||||
qCDebug(SNORE) << "Notify Growl:" << notification.application() << alert << notification.title();
|
qCDebug(SNORE) << "Notify Growl:" << notification.application() << alert << notification.title();
|
||||||
|
|
||||||
|
@ -115,7 +114,7 @@ void GrowlBackend::slotNotify(Notification notification)
|
||||||
slotNotificationDisplayed(notification);
|
slotNotificationDisplayed(notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrowlBackend::setDefaultSettings()
|
void SnorePlugin::Growl::setDefaultSettings()
|
||||||
{
|
{
|
||||||
SnoreBackend::setDefaultSettings();
|
SnoreBackend::setDefaultSettings();
|
||||||
setDefaultSettingsValue(QStringLiteral("Host"), QLatin1String("localhost"));
|
setDefaultSettingsValue(QStringLiteral("Host"), QLatin1String("localhost"));
|
||||||
|
|
|
@ -23,15 +23,17 @@
|
||||||
#include "growl.hpp"
|
#include "growl.hpp"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class GrowlBackend: public Snore::SnoreBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class Growl: public Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GrowlBackend();
|
Growl();
|
||||||
~GrowlBackend();
|
~Growl();
|
||||||
bool isReady() override;
|
bool isReady() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -39,8 +41,8 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//a static instance for the static callback methode
|
//a static instance for the static callback methode
|
||||||
static GrowlBackend *s_instance;
|
static Growl *s_instance;
|
||||||
QHash<QString, Growl *> m_applications;
|
QHash<QString, ::Growl *> m_applications;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void slotRegisterApplication(const Snore::Application &application) override;
|
void slotRegisterApplication(const Snore::Application &application) override;
|
||||||
|
@ -49,4 +51,5 @@ public Q_SLOTS:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
#endif // GROWL_BACKEND_H
|
#endif // GROWL_BACKEND_H
|
||||||
|
|
|
@ -19,9 +19,7 @@
|
||||||
|
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
|
||||||
using namespace Snore;
|
GrowlSettings::GrowlSettings(Snore::SnorePlugin *plugin, QWidget *parent):
|
||||||
|
|
||||||
GrowlSettings::GrowlSettings(SnorePlugin *plugin, QWidget *parent):
|
|
||||||
PluginSettingsWidget(plugin, parent),
|
PluginSettingsWidget(plugin, parent),
|
||||||
m_host(new QLineEdit),
|
m_host(new QLineEdit),
|
||||||
m_password(new QLineEdit)
|
m_password(new QLineEdit)
|
||||||
|
|
|
@ -39,6 +39,6 @@ private:
|
||||||
QLineEdit *m_password;
|
QLineEdit *m_password;
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(GrowlSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Growl)
|
||||||
|
|
||||||
#endif // GROWLSETTINGS_H
|
#endif // GROWLSETTINGS_H
|
||||||
|
|
|
@ -32,14 +32,13 @@
|
||||||
|
|
||||||
#define SNORENOTIFIER_MESSAGE_ID WM_USER + 238
|
#define SNORENOTIFIER_MESSAGE_ID WM_USER + 238
|
||||||
|
|
||||||
using namespace Snore;
|
|
||||||
using namespace Snarl::V42;
|
using namespace Snarl::V42;
|
||||||
|
|
||||||
class SnarlBackend::SnarlWidget: public QWidget
|
class SnarlWidget: public QWidget
|
||||||
{
|
{
|
||||||
//Q_OBJECT
|
//Q_OBJECT
|
||||||
public:
|
public:
|
||||||
SnarlWidget(SnarlBackend *snarl):
|
SnarlWidget(SnorePlugin::Snarl *snarl):
|
||||||
m_snarl(snarl)
|
m_snarl(snarl)
|
||||||
{
|
{
|
||||||
SNARL_GLOBAL_MESSAGE = SnarlInterface::Broadcast();
|
SNARL_GLOBAL_MESSAGE = SnarlInterface::Broadcast();
|
||||||
|
@ -52,7 +51,7 @@ public:
|
||||||
if (msg->message == SNARL_GLOBAL_MESSAGE) {
|
if (msg->message == SNARL_GLOBAL_MESSAGE) {
|
||||||
int action = msg->wParam;
|
int action = msg->wParam;
|
||||||
if (action == SnarlEnums::SnarlLaunched) {
|
if (action == SnarlEnums::SnarlLaunched) {
|
||||||
for (const Application &a : SnoreCore::instance().aplications()) {
|
for (const Snore::Application &a : Snore::SnoreCore::instance().aplications()) {
|
||||||
m_snarl->slotRegisterApplication(a);
|
m_snarl->slotRegisterApplication(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,30 +60,30 @@ public:
|
||||||
int action = msg->wParam & 0xffff;
|
int action = msg->wParam & 0xffff;
|
||||||
int data = (msg->wParam & 0xffffffff) >> 16;
|
int data = (msg->wParam & 0xffffffff) >> 16;
|
||||||
|
|
||||||
Notification notification;
|
Snore::Notification notification;
|
||||||
if (msg->lParam != 0) {
|
if (msg->lParam != 0) {
|
||||||
notification = m_snarl->m_idMap.value(msg->lParam);
|
notification = m_snarl->m_idMap.value(msg->lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
Notification::CloseReasons reason = Notification::None;
|
Snore::Notification::CloseReasons reason = Snore::Notification::None;
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case SnarlEnums::CallbackInvoked:
|
case SnarlEnums::CallbackInvoked:
|
||||||
reason = Notification::Activated;
|
reason = Snore::Notification::Activated;
|
||||||
qCDebug(SNORE) << "Notification clicked";
|
qCDebug(SNORE) << "Notification clicked";
|
||||||
break;
|
break;
|
||||||
case SnarlEnums::NotifyAction:
|
case SnarlEnums::NotifyAction:
|
||||||
reason = Notification::Activated;
|
reason = Snore::Notification::Activated;
|
||||||
qCDebug(SNORE) << "Notification action invoked";
|
qCDebug(SNORE) << "Notification action invoked";
|
||||||
if (notification.isValid()) {
|
if (notification.isValid()) {
|
||||||
m_snarl->slotNotificationActionInvoked(notification, notification.actions().value(data));
|
m_snarl->slotNotificationActionInvoked(notification, notification.actions().value(data));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SnarlEnums::CallbackClosed:
|
case SnarlEnums::CallbackClosed:
|
||||||
reason = Notification::Dismissed;
|
reason = Snore::Notification::Dismissed;
|
||||||
qCDebug(SNORE) << "Notification dismissed";
|
qCDebug(SNORE) << "Notification dismissed";
|
||||||
break;
|
break;
|
||||||
case SnarlEnums::CallbackTimedOut:
|
case SnarlEnums::CallbackTimedOut:
|
||||||
reason = Notification::TimedOut;
|
reason = Snore::Notification::TimedOut;
|
||||||
qCDebug(SNORE) << "Notification timed out";
|
qCDebug(SNORE) << "Notification timed out";
|
||||||
break;
|
break;
|
||||||
//away stuff
|
//away stuff
|
||||||
|
@ -113,32 +112,32 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint SNARL_GLOBAL_MESSAGE;
|
uint SNARL_GLOBAL_MESSAGE;
|
||||||
SnarlBackend *m_snarl;
|
SnorePlugin::Snarl *m_snarl;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SnarlBackend::SnarlBackend()
|
SnorePlugin::Snarl::Snarl()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SnarlBackend::~SnarlBackend()
|
SnorePlugin::Snarl::~Snarl()
|
||||||
{
|
{
|
||||||
if (m_eventLoop) {
|
if (m_eventLoop) {
|
||||||
delete m_eventLoop;
|
delete m_eventLoop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnarlBackend::canCloseNotification() const
|
bool SnorePlugin::Snarl::canCloseNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnarlBackend::canUpdateNotification() const
|
bool SnorePlugin::Snarl::canUpdateNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnarlBackend::isReady()
|
bool SnorePlugin::Snarl::isReady()
|
||||||
{
|
{
|
||||||
if (!qobject_cast< QApplication * >(qApp)) {
|
if (!qobject_cast< QApplication * >(qApp)) {
|
||||||
setErrorString(tr("This plugin only works with QApplication"));
|
setErrorString(tr("This plugin only works with QApplication"));
|
||||||
|
@ -146,7 +145,7 @@ bool SnarlBackend::isReady()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_eventLoop) {
|
if (!m_eventLoop) {
|
||||||
m_eventLoop = new SnarlBackend::SnarlWidget(this);
|
m_eventLoop = new SnarlWidget(this);
|
||||||
}
|
}
|
||||||
bool running = SnarlInterface::IsSnarlRunning();
|
bool running = SnarlInterface::IsSnarlRunning();
|
||||||
if (!running) {
|
if (!running) {
|
||||||
|
@ -155,18 +154,16 @@ bool SnarlBackend::isReady()
|
||||||
return running;
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnarlBackend::setDefaultSettings()
|
void SnorePlugin::Snarl::setDefaultSettings()
|
||||||
{
|
{
|
||||||
|
|
||||||
setDefaultSettingsValue(QLatin1String("Password"), QString());
|
setDefaultSettingsValue(QLatin1String("Password"), QString());
|
||||||
SnoreBackend::setDefaultSettings();
|
SnoreBackend::setDefaultSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnarlBackend::slotRegisterApplication(const Application &application)
|
void SnorePlugin::Snarl::slotRegisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
if (!m_eventLoop) {
|
Q_ASSERT(m_eventLoop);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_ASSERT_X(!m_applications.contains(application.name()), Q_FUNC_INFO, "Application already registered");
|
Q_ASSERT_X(!m_applications.contains(application.name()), Q_FUNC_INFO, "Application already registered");
|
||||||
|
|
||||||
|
@ -182,14 +179,14 @@ void SnarlBackend::slotRegisterApplication(const Application &application)
|
||||||
(HWND)m_eventLoop->winId(), SNORENOTIFIER_MESSAGE_ID);
|
(HWND)m_eventLoop->winId(), SNORENOTIFIER_MESSAGE_ID);
|
||||||
qCDebug(SNORE) << result;
|
qCDebug(SNORE) << result;
|
||||||
|
|
||||||
foreach(const Alert & alert, application.alerts()) {
|
foreach(const Snore::Alert & alert, application.alerts()) {
|
||||||
snarlInterface->AddClass(alert.name().toUtf8().constData(),
|
snarlInterface->AddClass(alert.name().toUtf8().constData(),
|
||||||
alert.name().toUtf8().constData(),
|
alert.name().toUtf8().constData(),
|
||||||
0, 0, alert.icon().localUrl(QSize(128, 128)).toUtf8().constData());
|
0, 0, alert.icon().localUrl(QSize(128, 128)).toUtf8().constData());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnarlBackend::slotDeregisterApplication(const Application &application)
|
void SnorePlugin::Snarl::slotDeregisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
if (!m_applications.contains(application.name())) {
|
if (!m_applications.contains(application.name())) {
|
||||||
qCDebug(SNORE) << "Unknown apllication: " << application.name();
|
qCDebug(SNORE) << "Unknown apllication: " << application.name();
|
||||||
|
@ -201,7 +198,7 @@ void SnarlBackend::slotDeregisterApplication(const Application &application)
|
||||||
delete snarlInterface;
|
delete snarlInterface;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnarlBackend::slotNotify(Notification notification)
|
void SnorePlugin::Snarl::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
if (!m_applications.contains(notification.application().name())) {
|
if (!m_applications.contains(notification.application().name())) {
|
||||||
qCDebug(SNORE) << "Unknown apllication: " << notification.application().name();
|
qCDebug(SNORE) << "Unknown apllication: " << notification.application().name();
|
||||||
|
@ -210,13 +207,13 @@ void SnarlBackend::slotNotify(Notification notification)
|
||||||
|
|
||||||
SnarlInterface *snarlInterface = m_applications.value(notification.application().name());
|
SnarlInterface *snarlInterface = m_applications.value(notification.application().name());
|
||||||
|
|
||||||
Snarl::V42::SnarlEnums::MessagePriority priority = Snarl::V42::SnarlEnums::PriorityUndefined;
|
::Snarl::V42::SnarlEnums::MessagePriority priority = ::Snarl::V42::SnarlEnums::PriorityUndefined;
|
||||||
if (notification.priority() > 1) {
|
if (notification.priority() > 1) {
|
||||||
priority = Snarl::V42::SnarlEnums::PriorityHigh;
|
priority = ::Snarl::V42::SnarlEnums::PriorityHigh;
|
||||||
} else if (notification.priority() < -1) {
|
} else if (notification.priority() < -1) {
|
||||||
priority = Snarl::V42::SnarlEnums::PriorityLow;
|
priority = ::Snarl::V42::SnarlEnums::PriorityLow;
|
||||||
} else {
|
} else {
|
||||||
priority = static_cast<Snarl::V42::SnarlEnums::MessagePriority>(notification.priority());
|
priority = static_cast<::Snarl::V42::SnarlEnums::MessagePriority>(notification.priority());
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG32 id = 0;
|
ULONG32 id = 0;
|
||||||
|
@ -228,10 +225,10 @@ void SnarlBackend::slotNotify(Notification notification)
|
||||||
notification.text().toUtf8().constData(),
|
notification.text().toUtf8().constData(),
|
||||||
notification.timeout(),
|
notification.timeout(),
|
||||||
nullptr,
|
nullptr,
|
||||||
Utils::dataFromImage(notification.icon().pixmap(QSize(128, 128)).toImage()).toBase64().constData(),
|
Snore::Utils::dataFromImage(notification.icon().pixmap(QSize(128, 128)).toImage()).toBase64().constData(),
|
||||||
priority);
|
priority);
|
||||||
|
|
||||||
foreach(const Action & a, notification.actions()) {
|
foreach(const Snore::Action & a, notification.actions()) {
|
||||||
snarlInterface->AddAction(id, a.name().toUtf8().constData(), (QLatin1Char('@') + QString::number(a.id())).toUtf8().constData());
|
snarlInterface->AddAction(id, a.name().toUtf8().constData(), (QLatin1Char('@') + QString::number(a.id())).toUtf8().constData());
|
||||||
}
|
}
|
||||||
m_idMap[id] = notification;
|
m_idMap[id] = notification;
|
||||||
|
@ -245,7 +242,7 @@ void SnarlBackend::slotNotify(Notification notification)
|
||||||
notification.text().toUtf8().constData(),
|
notification.text().toUtf8().constData(),
|
||||||
notification.timeout(),
|
notification.timeout(),
|
||||||
nullptr,
|
nullptr,
|
||||||
Utils::dataFromImage(notification.icon().pixmap(QSize(128, 128)).toImage()).toBase64().constData(),
|
Snore::Utils::dataFromImage(notification.icon().pixmap(QSize(128, 128)).toImage()).toBase64().constData(),
|
||||||
priority);
|
priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +251,7 @@ void SnarlBackend::slotNotify(Notification notification)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnarlBackend::slotCloseNotification(Notification notification)
|
void SnorePlugin::Snarl::slotCloseNotification(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
if (!m_applications.contains(notification.application().name())) {
|
if (!m_applications.contains(notification.application().name())) {
|
||||||
qCDebug(SNORE) << "Unknown apllication: " << notification.application().name();
|
qCDebug(SNORE) << "Unknown apllication: " << notification.application().name();
|
||||||
|
|
|
@ -21,14 +21,18 @@
|
||||||
#include "libsnore/plugins/snorebackend.h"
|
#include "libsnore/plugins/snorebackend.h"
|
||||||
#include "SnarlInterface.h"
|
#include "SnarlInterface.h"
|
||||||
|
|
||||||
class SnarlBackend: public Snore::SnoreBackend
|
class SnarlWidget;
|
||||||
|
|
||||||
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class Snarl : public Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
SnarlBackend();
|
Snarl();
|
||||||
~SnarlBackend();
|
~Snarl();
|
||||||
|
|
||||||
virtual bool canCloseNotification() const override;
|
virtual bool canCloseNotification() const override;
|
||||||
virtual bool canUpdateNotification() const override;
|
virtual bool canUpdateNotification() const override;
|
||||||
|
@ -39,9 +43,9 @@ protected:
|
||||||
void setDefaultSettings() override;
|
void setDefaultSettings() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class SnarlWidget;
|
friend class SnarlWidget;
|
||||||
SnarlBackend::SnarlWidget *m_eventLoop = nullptr;
|
SnarlWidget *m_eventLoop = nullptr;
|
||||||
QHash<QString, Snarl::V42::SnarlInterface *> m_applications;
|
QHash<QString, ::Snarl::V42::SnarlInterface *> m_applications;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void slotRegisterApplication(const Snore::Application &application) override;
|
void slotRegisterApplication(const Snore::Application &application) override;
|
||||||
|
@ -53,5 +57,6 @@ private:
|
||||||
QHash<LONG32, Snore::Notification> m_idMap;
|
QHash<LONG32, Snore::Notification> m_idMap;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif // SNARL_BACKEND_H
|
#endif // SNARL_BACKEND_H
|
||||||
|
|
|
@ -19,9 +19,7 @@
|
||||||
|
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
|
||||||
using namespace Snore;
|
SnarlSettings::SnarlSettings(Snore::SnorePlugin *plugin, QWidget *parent):
|
||||||
|
|
||||||
SnarlSettings::SnarlSettings(SnorePlugin *plugin, QWidget *parent):
|
|
||||||
PluginSettingsWidget(plugin, parent),
|
PluginSettingsWidget(plugin, parent),
|
||||||
m_password(new QLineEdit)
|
m_password(new QLineEdit)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,6 +38,6 @@ private:
|
||||||
QLineEdit *m_password;
|
QLineEdit *m_password;
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(SnarlSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Snarl)
|
||||||
|
|
||||||
#endif // SNARLSETTINGS_H
|
#endif // SNARLSETTINGS_H
|
||||||
|
|
|
@ -1,13 +1,9 @@
|
||||||
find_package(Qt5Quick QUIET)
|
|
||||||
set_package_properties(Qt5Quick PROPERTIES
|
|
||||||
PURPOSE "Adding builtin notifiaction backend."
|
|
||||||
TYPE OPTIONAL)
|
|
||||||
|
|
||||||
if(Qt5Quick_FOUND)
|
if(Qt5Quick_FOUND)
|
||||||
QT5_ADD_RESOURCES(SNORENOTIFIER_RCS ${CMAKE_CURRENT_SOURCE_DIR}/snore_notification.qrc)
|
QT5_ADD_RESOURCES(SNORENOTIFIER_RCS ${CMAKE_CURRENT_SOURCE_DIR}/snore_notification.qrc)
|
||||||
|
|
||||||
add_snore_plugin(Snore SOURCES snorenotifier.cpp
|
add_snore_plugin(Snore SOURCES snorenotifier.cpp
|
||||||
notifywidget.cpp
|
notifywidget.cpp
|
||||||
${SNORENOTIFIER_RCS}
|
${SNORENOTIFIER_RCS}
|
||||||
TYPE Backend SETTINGS_SOURCES snorenotifiersettings.cpp LIBS Qt5::Quick)
|
TYPE Backend SETTINGS_SOURCES snorenotifiersettings.cpp LIBS Qt5::Quick
|
||||||
|
RESOURCES snore_notification )
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -24,16 +24,18 @@
|
||||||
#include <QQmlProperty>
|
#include <QQmlProperty>
|
||||||
|
|
||||||
using namespace Snore;
|
using namespace Snore;
|
||||||
|
using namespace SnorePlugin;
|
||||||
|
|
||||||
NotifyWidget::NotifyWidget(int id, const SnoreNotifier *parent) :
|
NotifyWidget::NotifyWidget(int id, const ::SnorePlugin::Snore *parent) :
|
||||||
m_id(id),
|
m_id(id),
|
||||||
m_parent(parent),
|
m_parent(parent),
|
||||||
m_mem(QLatin1String("SnoreNotifyWidget_rev") + QString::number(SHARED_MEM_TYPE_REV()) + QLatin1String("_id") + QString::number(m_id)),
|
m_mem(QStringLiteral("SnoreNotifyWidget_rev%1_id%2").arg(SHARED_MEM_TYPE_REV(), m_id)),
|
||||||
m_ready(true),
|
m_ready(true),
|
||||||
m_fontFamily(qApp->font().family())
|
m_fontFamily(qApp->font().family())
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5,7,0)// Qt 5.7+ is broken and can only display it in black and white.
|
||||||
if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8) {
|
if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS8) {
|
||||||
m_fontFamily = QStringLiteral("Segoe UI Symbol");
|
m_fontFamily = QStringLiteral("Segoe UI Symbol");
|
||||||
emit fontFamilyChanged();
|
emit fontFamilyChanged();
|
||||||
|
@ -44,6 +46,7 @@ NotifyWidget::NotifyWidget(int id, const SnoreNotifier *parent) :
|
||||||
emit fontFamilyChanged();
|
emit fontFamilyChanged();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
QQmlApplicationEngine *engine = new QQmlApplicationEngine(this);
|
QQmlApplicationEngine *engine = new QQmlApplicationEngine(this);
|
||||||
engine->rootContext()->setContextProperty(QStringLiteral("notifyWidget"), this);
|
engine->rootContext()->setContextProperty(QStringLiteral("notifyWidget"), this);
|
||||||
|
@ -187,6 +190,9 @@ void NotifyWidget::syncSettings()
|
||||||
|
|
||||||
QColor NotifyWidget::computeBackgrondColor(const QImage &img)
|
QColor NotifyWidget::computeBackgrondColor(const QImage &img)
|
||||||
{
|
{
|
||||||
|
if (img.isNull())
|
||||||
|
return Qt::black;
|
||||||
|
|
||||||
int stepSize = img.depth() / 8;
|
int stepSize = img.depth() / 8;
|
||||||
qulonglong r = 0;
|
qulonglong r = 0;
|
||||||
qulonglong g = 0;
|
qulonglong g = 0;
|
||||||
|
|
|
@ -24,7 +24,9 @@
|
||||||
|
|
||||||
#include <QtQuick/QtQuick>
|
#include <QtQuick/QtQuick>
|
||||||
|
|
||||||
class SnoreNotifier;
|
namespace SnorePlugin {
|
||||||
|
class Snore;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool free;
|
bool free;
|
||||||
|
@ -54,7 +56,7 @@ class NotifyWidget : public QObject
|
||||||
Q_PROPERTY(QString fontFamily MEMBER m_fontFamily NOTIFY fontFamilyChanged)
|
Q_PROPERTY(QString fontFamily MEMBER m_fontFamily NOTIFY fontFamilyChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit NotifyWidget(int id, const SnoreNotifier *parent);
|
explicit NotifyWidget(int id, const SnorePlugin::Snore *parent);
|
||||||
~NotifyWidget();
|
~NotifyWidget();
|
||||||
|
|
||||||
void display(const Snore::Notification ¬ification);
|
void display(const Snore::Notification ¬ification);
|
||||||
|
@ -91,7 +93,7 @@ private:
|
||||||
|
|
||||||
Snore::Notification m_notification;
|
Snore::Notification m_notification;
|
||||||
int m_id;
|
int m_id;
|
||||||
const SnoreNotifier *m_parent;
|
const SnorePlugin::Snore *m_parent;
|
||||||
QSharedMemory m_mem;
|
QSharedMemory m_mem;
|
||||||
bool m_ready;
|
bool m_ready;
|
||||||
|
|
||||||
|
|
|
@ -23,42 +23,22 @@
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
using namespace Snore;
|
SnorePlugin::Snore::Snore():
|
||||||
|
|
||||||
SnoreNotifier::SnoreNotifier():
|
|
||||||
m_widgets(3),
|
|
||||||
m_timer(new QTimer(this))
|
m_timer(new QTimer(this))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_widgets.size(); ++i) {
|
|
||||||
NotifyWidget *w = new NotifyWidget(i, this);
|
|
||||||
m_widgets[i] = w;
|
|
||||||
connect(w, &NotifyWidget::dismissed, [this, w]() {
|
|
||||||
Notification notification = w->notification();
|
|
||||||
closeNotification(notification, Notification::Dismissed);
|
|
||||||
slotCloseNotification(notification);
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(w, &NotifyWidget::invoked, [this, w]() {
|
|
||||||
Notification notification = w->notification();
|
|
||||||
slotNotificationActionInvoked(notification);
|
|
||||||
closeNotification(notification, Notification::Activated);
|
|
||||||
slotCloseNotification(notification);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
m_timer->setInterval(1000);
|
m_timer->setInterval(1000);
|
||||||
connect(m_timer, &QTimer::timeout, this, &SnoreNotifier::slotQueueTimeout);
|
connect(m_timer, &QTimer::timeout, this, &Snore::slotQueueTimeout);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SnoreNotifier::~SnoreNotifier()
|
SnorePlugin::Snore::~Snore()
|
||||||
{
|
{
|
||||||
qDeleteAll(m_widgets);
|
qDeleteAll(m_widgets);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifier::slotNotify(Snore::Notification notification)
|
void SnorePlugin::Snore::slotNotify(::Snore::Notification notification)
|
||||||
{
|
{
|
||||||
auto display = [this](NotifyWidget * w, Snore::Notification notification) {
|
auto display = [this](NotifyWidget * w, ::Snore::Notification notification) {
|
||||||
w->display(notification);
|
w->display(notification);
|
||||||
notification.hints().setPrivateValue(this, "id", w->id());
|
notification.hints().setPrivateValue(this, "id", w->id());
|
||||||
slotNotificationDisplayed(notification);
|
slotNotificationDisplayed(notification);
|
||||||
|
@ -73,7 +53,7 @@ void SnoreNotifier::slotNotify(Snore::Notification notification)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < m_queue.length(); ++i) {
|
for (int i = 0; i < m_queue.length(); ++i) {
|
||||||
Notification n = m_queue.at(i);
|
::Snore::Notification n = m_queue.at(i);
|
||||||
if (n.id() == notification.old().id()) {
|
if (n.id() == notification.old().id()) {
|
||||||
qCDebug(SNORE) << "replacing qued notification" << n.id() << notification.id();
|
qCDebug(SNORE) << "replacing qued notification" << n.id() << notification.id();
|
||||||
m_queue.replace(i, notification);
|
m_queue.replace(i, notification);
|
||||||
|
@ -97,14 +77,39 @@ void SnoreNotifier::slotNotify(Snore::Notification notification)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifier::slotCloseNotification(Snore::Notification notification)
|
void SnorePlugin::Snore::slotCloseNotification(::Snore::Notification notification)
|
||||||
{
|
{
|
||||||
NotifyWidget *w = m_widgets[notification.hints().privateValue(this, "id").toInt()];
|
NotifyWidget *w = m_widgets[notification.hints().privateValue(this, "id").toInt()];
|
||||||
w->release();
|
w->release();
|
||||||
slotQueueTimeout();
|
slotQueueTimeout();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifier::slotQueueTimeout()
|
void SnorePlugin::Snore::slotRegisterApplication(const ::Snore::Application &)
|
||||||
|
{
|
||||||
|
if (!m_widgets.isEmpty())
|
||||||
|
return;
|
||||||
|
m_widgets.resize(3);
|
||||||
|
for (int i = 0; i < m_widgets.size(); ++i) {
|
||||||
|
auto *w = new NotifyWidget(i, this);
|
||||||
|
m_widgets[i] = w;
|
||||||
|
connect(w, &NotifyWidget::dismissed, [this, w]() {
|
||||||
|
::Snore::Notification notification = w->notification();
|
||||||
|
closeNotification(notification, ::Snore::Notification::Dismissed);
|
||||||
|
slotCloseNotification(notification);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(w, &NotifyWidget::invoked, [this, w]() {
|
||||||
|
::Snore::Notification notification = w->notification();
|
||||||
|
slotNotificationActionInvoked(notification);
|
||||||
|
closeNotification(notification, ::Snore::Notification::Activated);
|
||||||
|
slotCloseNotification(notification);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SnorePlugin::Snore::slotQueueTimeout()
|
||||||
{
|
{
|
||||||
if (m_queue.isEmpty()) {
|
if (m_queue.isEmpty()) {
|
||||||
qCDebug(SNORE) << "queue is empty";
|
qCDebug(SNORE) << "queue is empty";
|
||||||
|
@ -112,7 +117,7 @@ void SnoreNotifier::slotQueueTimeout()
|
||||||
} else {
|
} else {
|
||||||
foreach(NotifyWidget * w, m_widgets) {
|
foreach(NotifyWidget * w, m_widgets) {
|
||||||
if (!m_queue.isEmpty() && w->acquire(m_queue.first().timeout())) {
|
if (!m_queue.isEmpty() && w->acquire(m_queue.first().timeout())) {
|
||||||
Notification notification = m_queue.takeFirst();
|
::Snore::Notification notification = m_queue.takeFirst();
|
||||||
notification.hints().setPrivateValue(this, "id", w->id());
|
notification.hints().setPrivateValue(this, "id", w->id());
|
||||||
w->display(notification);
|
w->display(notification);
|
||||||
slotNotificationDisplayed(notification);
|
slotNotificationDisplayed(notification);
|
||||||
|
@ -121,17 +126,17 @@ void SnoreNotifier::slotQueueTimeout()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnoreNotifier::canCloseNotification() const
|
bool SnorePlugin::Snore::canCloseNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnoreNotifier::canUpdateNotification() const
|
bool SnorePlugin::Snore::canUpdateNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifier::setDefaultSettings()
|
void SnorePlugin::Snore::setDefaultSettings()
|
||||||
{
|
{
|
||||||
setDefaultSettingsValue(QStringLiteral("Position"), Qt::TopRightCorner);
|
setDefaultSettingsValue(QStringLiteral("Position"), Qt::TopRightCorner);
|
||||||
SnoreBackend::setDefaultSettings();
|
SnoreBackend::setDefaultSettings();
|
||||||
|
|
|
@ -23,14 +23,16 @@
|
||||||
|
|
||||||
#include "notifywidget.h"
|
#include "notifywidget.h"
|
||||||
|
|
||||||
class SnoreNotifier : public Snore::SnoreBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class Snore : public ::Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
SnoreNotifier();
|
Snore();
|
||||||
~SnoreNotifier();
|
~Snore();
|
||||||
|
|
||||||
bool canCloseNotification() const override;
|
bool canCloseNotification() const override;
|
||||||
bool canUpdateNotification() const override;
|
bool canUpdateNotification() const override;
|
||||||
|
@ -38,17 +40,18 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void setDefaultSettings() override;
|
void setDefaultSettings() override;
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
virtual void slotNotify(Snore::Notification notification) override;
|
virtual void slotNotify(::Snore::Notification notification) override;
|
||||||
virtual void slotCloseNotification(Snore::Notification notification) override;
|
virtual void slotCloseNotification(::Snore::Notification notification) override;
|
||||||
|
void slotRegisterApplication(const ::Snore::Application &application);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void slotQueueTimeout();
|
void slotQueueTimeout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Snore::Notification> m_queue;
|
QList<::Snore::Notification> m_queue;
|
||||||
QVector<NotifyWidget *> m_widgets;
|
QVector<NotifyWidget *> m_widgets;
|
||||||
QTimer *m_timer;
|
QTimer *m_timer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
#endif // SNORENOTIFIER_H
|
#endif // SNORENOTIFIER_H
|
||||||
|
|
|
@ -20,9 +20,7 @@
|
||||||
|
|
||||||
#include <QComboBox>
|
#include <QComboBox>
|
||||||
|
|
||||||
using namespace Snore;
|
SnoreSettings::SnoreSettings(Snore::SnorePlugin *snore, QWidget *parent) :
|
||||||
|
|
||||||
SnoreNotifierSettings::SnoreNotifierSettings(SnorePlugin *snore, QWidget *parent) :
|
|
||||||
PluginSettingsWidget(snore, parent),
|
PluginSettingsWidget(snore, parent),
|
||||||
m_comboBox(new QComboBox)
|
m_comboBox(new QComboBox)
|
||||||
{
|
{
|
||||||
|
@ -33,17 +31,16 @@ SnoreNotifierSettings::SnoreNotifierSettings(SnorePlugin *snore, QWidget *parent
|
||||||
addRow(tr("Position:"), m_comboBox);
|
addRow(tr("Position:"), m_comboBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
SnoreNotifierSettings::~SnoreNotifierSettings()
|
SnoreSettings::~SnoreSettings()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifierSettings::load()
|
void SnoreSettings::load()
|
||||||
{
|
{
|
||||||
m_comboBox->setCurrentIndex(settingsValue(QStringLiteral("Position")).toInt());
|
m_comboBox->setCurrentIndex(settingsValue(QStringLiteral("Position")).toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreNotifierSettings::save()
|
void SnoreSettings::save()
|
||||||
{
|
{
|
||||||
setSettingsValue(QStringLiteral("Position"), m_comboBox->currentIndex());
|
setSettingsValue(QStringLiteral("Position"), m_comboBox->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,12 @@ class SnorePlugin;
|
||||||
}
|
}
|
||||||
class QComboBox;
|
class QComboBox;
|
||||||
|
|
||||||
class SnoreNotifierSettings : public Snore::PluginSettingsWidget
|
class SnoreSettings : public Snore::PluginSettingsWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit SnoreNotifierSettings(Snore::SnorePlugin *snore, QWidget *parent = nullptr);
|
explicit SnoreSettings(Snore::SnorePlugin *snore, QWidget *parent = nullptr);
|
||||||
~SnoreNotifierSettings();
|
~SnoreSettings();
|
||||||
void load();
|
void load();
|
||||||
void save();
|
void save();
|
||||||
|
|
||||||
|
@ -40,6 +40,6 @@ private:
|
||||||
QComboBox *m_comboBox;
|
QComboBox *m_comboBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(SnoreNotifierSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN( Snore )
|
||||||
|
|
||||||
#endif // SNORENOTIFIERSETTINGS_H
|
#endif // SNORENOTIFIERSETTINGS_H
|
||||||
|
|
|
@ -12,9 +12,7 @@
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
using namespace Snore;
|
bool SnorePlugin::WindowsToast::isReady()
|
||||||
|
|
||||||
bool SnoreToast::isReady()
|
|
||||||
{
|
{
|
||||||
if (errorString().isEmpty() && QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8) {
|
if (errorString().isEmpty() && QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8) {
|
||||||
setErrorString(tr("%1 needs at least Windows 8 to run.").arg(name()));
|
setErrorString(tr("%1 needs at least Windows 8 to run.").arg(name()));
|
||||||
|
@ -23,12 +21,12 @@ bool SnoreToast::isReady()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SnoreToast::canCloseNotification() const
|
bool SnorePlugin::WindowsToast::canCloseNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreToast::slotNotify(Notification notification)
|
void SnorePlugin::WindowsToast::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
QProcess *p = createProcess(notification);
|
QProcess *p = createProcess(notification);
|
||||||
|
|
||||||
|
@ -51,21 +49,21 @@ void SnoreToast::slotNotify(Notification notification)
|
||||||
qCDebug(SNORE) << "SnoreToast" << arguements;
|
qCDebug(SNORE) << "SnoreToast" << arguements;
|
||||||
|
|
||||||
connect(p, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), [this, notification](int code) {
|
connect(p, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), [this, notification](int code) {
|
||||||
Notification::CloseReasons reason = Notification::None;
|
Snore::Notification::CloseReasons reason = Snore::Notification::None;
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case 0:
|
case 0:
|
||||||
reason = Notification::Activated;
|
reason = Snore::Notification::Activated;
|
||||||
slotNotificationActionInvoked(notification);
|
slotNotificationActionInvoked(notification);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
//hidden;
|
//hidden;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
reason = Notification::Dismissed;
|
reason = Snore::Notification::Dismissed;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
reason = Notification::TimedOut;
|
reason = Snore::Notification::TimedOut;
|
||||||
break;
|
break;
|
||||||
case -1:
|
case -1:
|
||||||
//failed
|
//failed
|
||||||
|
@ -78,11 +76,11 @@ void SnoreToast::slotNotify(Notification notification)
|
||||||
p->start(QLatin1String("SnoreToast"), arguements);
|
p->start(QLatin1String("SnoreToast"), arguements);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreToast::slotRegisterApplication(const Application &application)
|
void SnorePlugin::WindowsToast::slotRegisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
if (!application.constHints().contains("windows-app-id")) {
|
if (!application.constHints().contains("windows-app-id")) {
|
||||||
qCInfo(SNORE) << "No windows-app-id found in hints. Installing default shortcut with appID.";
|
qCInfo(SNORE) << "No windows-app-id found in hints. Installing default shortcut with appID.";
|
||||||
QProcess *p = createProcess(Notification());
|
QProcess *p = createProcess(Snore::Notification());
|
||||||
QStringList arguements;
|
QStringList arguements;
|
||||||
arguements << QLatin1String("-install")
|
arguements << QLatin1String("-install")
|
||||||
<< QLatin1String("SnoreNotify\\") + qApp->applicationName()
|
<< QLatin1String("SnoreNotify\\") + qApp->applicationName()
|
||||||
|
@ -93,7 +91,7 @@ void SnoreToast::slotRegisterApplication(const Application &application)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnoreToast::slotCloseNotification(Notification notification)
|
void SnorePlugin::WindowsToast::slotCloseNotification(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
QProcess *p = createProcess(notification);
|
QProcess *p = createProcess(notification);
|
||||||
|
|
||||||
|
@ -104,7 +102,7 @@ void SnoreToast::slotCloseNotification(Notification notification)
|
||||||
p->start(QLatin1String("SnoreToast"), arguements);
|
p->start(QLatin1String("SnoreToast"), arguements);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SnoreToast::appId(const Application &application)
|
QString SnorePlugin::WindowsToast::appId(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
QString appID = application.constHints().value("windows-app-id").toString();
|
QString appID = application.constHints().value("windows-app-id").toString();
|
||||||
if (appID.isEmpty()) {
|
if (appID.isEmpty()) {
|
||||||
|
@ -113,7 +111,7 @@ QString SnoreToast::appId(const Application &application)
|
||||||
return appID;
|
return appID;
|
||||||
}
|
}
|
||||||
|
|
||||||
QProcess *SnoreToast::createProcess(Notification noti)
|
QProcess *SnorePlugin::WindowsToast::createProcess(Snore::Notification noti)
|
||||||
{
|
{
|
||||||
QProcess *p = new QProcess(this);
|
QProcess *p = new QProcess(this);
|
||||||
p->setReadChannelMode(QProcess::MergedChannels);
|
p->setReadChannelMode(QProcess::MergedChannels);
|
||||||
|
@ -127,7 +125,7 @@ QProcess *SnoreToast::createProcess(Notification noti)
|
||||||
setErrorString(name() + p->errorString());
|
setErrorString(name() + p->errorString());
|
||||||
qCDebug(SNORE) << p->readAll();
|
qCDebug(SNORE) << p->readAll();
|
||||||
if (noti.isValid()) {
|
if (noti.isValid()) {
|
||||||
closeNotification(noti, Notification::None);
|
closeNotification(noti, Snore::Notification::None);
|
||||||
}
|
}
|
||||||
p->deleteLater();
|
p->deleteLater();
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,14 +4,16 @@
|
||||||
#include "libsnore/plugins/snorebackend.h"
|
#include "libsnore/plugins/snorebackend.h"
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
|
||||||
class SnoreToast : public Snore::SnoreBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class WindowsToast : public Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
SnoreToast() = default;
|
WindowsToast() = default;
|
||||||
~SnoreToast() = default;
|
~WindowsToast() = default;
|
||||||
|
|
||||||
virtual bool canCloseNotification() const override;
|
virtual bool canCloseNotification() const override;
|
||||||
|
|
||||||
|
@ -27,5 +29,6 @@ private:
|
||||||
QProcess *createProcess(Snore::Notification noti);
|
QProcess *createProcess(Snore::Notification noti);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif // TOASTER_H
|
#endif // TOASTER_H
|
||||||
|
|
|
@ -6,33 +6,31 @@
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
using namespace Snore;
|
SnorePlugin::Trayicon::Trayicon()
|
||||||
|
|
||||||
TrayIconNotifer::TrayIconNotifer()
|
|
||||||
{
|
{
|
||||||
connect(this, &TrayIconNotifer::enabledChanged, [this](bool) {
|
connect(this, &Trayicon::enabledChanged, [this](bool) {
|
||||||
m_currentlyDisplaying = false;
|
m_currentlyDisplaying = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrayIconNotifer::canCloseNotification() const
|
bool SnorePlugin::Trayicon::canCloseNotification() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::slotNotify(Notification notification)
|
void SnorePlugin::Trayicon::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
QSystemTrayIcon *icon = trayIcon(notification.application());
|
QSystemTrayIcon *icon = trayIcon(notification.application());
|
||||||
if (icon) {
|
if (icon) {
|
||||||
m_notificationQue.append(notification);
|
m_notificationQue.append(notification);
|
||||||
displayNotification(icon);
|
displayNotification(icon);
|
||||||
} else {
|
} else {
|
||||||
closeNotification(notification, Notification::Closed);
|
closeNotification(notification, Snore::Notification::Closed);
|
||||||
setErrorString(QLatin1String("No tray-icon hint provided for ") + notification.application().name());
|
setErrorString(QLatin1String("No tray-icon hint provided for ") + notification.application().name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::slotCloseNotification(Notification n)
|
void SnorePlugin::Trayicon::slotCloseNotification(Snore::Notification n)
|
||||||
{
|
{
|
||||||
QSystemTrayIcon *icon = trayIcon(n.application());
|
QSystemTrayIcon *icon = trayIcon(n.application());
|
||||||
if (icon) {
|
if (icon) {
|
||||||
|
@ -42,23 +40,23 @@ void TrayIconNotifer::slotCloseNotification(Notification n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::slotRegisterApplication(const Application &application)
|
void SnorePlugin::Trayicon::slotRegisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
QSystemTrayIcon *icon = trayIcon(application);
|
QSystemTrayIcon *icon = trayIcon(application);
|
||||||
if (icon) {
|
if (icon) {
|
||||||
connect(icon, &QSystemTrayIcon::messageClicked, this, &TrayIconNotifer::actionInvoked);
|
connect(icon, &QSystemTrayIcon::messageClicked, this, &Trayicon::actionInvoked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::slotDeregisterApplication(const Application &application)
|
void SnorePlugin::Trayicon::slotDeregisterApplication(const Snore::Application &application)
|
||||||
{
|
{
|
||||||
QSystemTrayIcon *icon = trayIcon(application);
|
QSystemTrayIcon *icon = trayIcon(application);
|
||||||
if (icon) {
|
if (icon) {
|
||||||
disconnect(icon, &QSystemTrayIcon::messageClicked, this, &TrayIconNotifer::actionInvoked);
|
disconnect(icon, &QSystemTrayIcon::messageClicked, this, &Trayicon::actionInvoked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QSystemTrayIcon *TrayIconNotifer::trayIcon(const Application &app)
|
QSystemTrayIcon *SnorePlugin::Trayicon::trayIcon(const Snore::Application &app)
|
||||||
{
|
{
|
||||||
if (app.constHints().contains("tray-icon")) {
|
if (app.constHints().contains("tray-icon")) {
|
||||||
return app.constHints().value("tray-icon").value<QPointer<QSystemTrayIcon>>();
|
return app.constHints().value("tray-icon").value<QPointer<QSystemTrayIcon>>();
|
||||||
|
@ -66,7 +64,7 @@ QSystemTrayIcon *TrayIconNotifer::trayIcon(const Application &app)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::displayNotification(QSystemTrayIcon *icon)
|
void SnorePlugin::Trayicon::displayNotification(QSystemTrayIcon *icon)
|
||||||
{
|
{
|
||||||
Q_ASSERT(icon);
|
Q_ASSERT(icon);
|
||||||
if (m_currentlyDisplaying) {
|
if (m_currentlyDisplaying) {
|
||||||
|
@ -77,26 +75,26 @@ void TrayIconNotifer::displayNotification(QSystemTrayIcon *icon)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_currentlyDisplaying = true;
|
m_currentlyDisplaying = true;
|
||||||
Notification notification = m_notificationQue.takeFirst();
|
Snore::Notification notification = m_notificationQue.takeFirst();
|
||||||
m_displayed = notification;
|
m_displayed = notification;
|
||||||
icon->showMessage(notification.title(), notification.text(), QSystemTrayIcon::NoIcon, notification.timeout() * 1000);
|
icon->showMessage(notification.title(), notification.text(), QSystemTrayIcon::NoIcon, notification.timeout() * 1000);
|
||||||
slotNotificationDisplayed(notification);
|
slotNotificationDisplayed(notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconNotifer::actionInvoked()
|
void SnorePlugin::Trayicon::actionInvoked()
|
||||||
{
|
{
|
||||||
Notification n = m_displayed;
|
Snore::Notification n = m_displayed;
|
||||||
QSystemTrayIcon *icon = trayIcon(n.application());
|
QSystemTrayIcon *icon = trayIcon(n.application());
|
||||||
if (icon && n.isValid()) {
|
if (icon && n.isValid()) {
|
||||||
slotNotificationActionInvoked(n);
|
slotNotificationActionInvoked(n);
|
||||||
closeNotification(n, Notification::Activated);
|
closeNotification(n, Snore::Notification::Activated);
|
||||||
m_currentlyDisplaying = false;
|
m_currentlyDisplaying = false;
|
||||||
displayNotification(icon);
|
displayNotification(icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrayIconNotifer::isReady()
|
bool SnorePlugin::Trayicon::isReady()
|
||||||
{
|
{
|
||||||
if (!qobject_cast< QApplication * >(qApp)) {
|
if (!qobject_cast< QApplication * >(qApp)) {
|
||||||
setErrorString(tr("This plugin only works with QApplication"));
|
setErrorString(tr("This plugin only works with QApplication"));
|
||||||
|
|
|
@ -3,20 +3,18 @@
|
||||||
|
|
||||||
#include "libsnore/plugins/snorebackend.h"
|
#include "libsnore/plugins/snorebackend.h"
|
||||||
|
|
||||||
namespace Snore
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
class QSystemTrayIcon;
|
class QSystemTrayIcon;
|
||||||
|
|
||||||
class TrayIconNotifer: public Snore::SnoreBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
class Trayicon: public Snore::SnoreBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreBackend)
|
Q_INTERFACES(Snore::SnoreBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
TrayIconNotifer();
|
Trayicon();
|
||||||
~TrayIconNotifer() = default;
|
~Trayicon() = default;
|
||||||
|
|
||||||
bool canCloseNotification() const override;
|
bool canCloseNotification() const override;
|
||||||
bool isReady() override;
|
bool isReady() override;
|
||||||
|
@ -38,5 +36,6 @@ private Q_SLOTS:
|
||||||
void actionInvoked();
|
void actionInvoked();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif // TRAYICONNOTIFER_H
|
#endif // TRAYICONNOTIFER_H
|
||||||
|
|
|
@ -50,6 +50,6 @@ private Q_SLOTS:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(PushoverSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Pushover)
|
||||||
|
|
||||||
#endif // PUSHOVERSETTINGS_H
|
#endif // PUSHOVERSETTINGS_H
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
|
||||||
using namespace Snore;
|
namespace SnorePlugin {
|
||||||
|
|
||||||
void NotifyMyAndroid::slotNotify(Notification notification)
|
void NMA::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
QString key = settingsValue(QStringLiteral("ApiKey")).toString();
|
QString key = settingsValue(QStringLiteral("ApiKey")).toString();
|
||||||
if (key.isEmpty()) {
|
if (key.isEmpty()) {
|
||||||
|
@ -41,8 +41,8 @@ void NotifyMyAndroid::slotNotify(Notification notification)
|
||||||
+ QLatin1String("&description=");
|
+ QLatin1String("&description=");
|
||||||
|
|
||||||
if (notification.constHints().value("supports-markup").toBool()) {
|
if (notification.constHints().value("supports-markup").toBool()) {
|
||||||
data += notification.text(Utils::Href | Utils::Bold | Utils::Break |
|
data += notification.text(Snore::Utils::Href | Snore::Utils::Bold | Snore::Utils::Break |
|
||||||
Utils::Underline | Utils::Font | Utils::Italic)
|
Snore::Utils::Underline | Snore::Utils::Font | Snore::Utils::Italic)
|
||||||
+ QLatin1String("&content-type=text/html");
|
+ QLatin1String("&content-type=text/html");
|
||||||
} else {
|
} else {
|
||||||
data += notification.text();
|
data += notification.text();
|
||||||
|
@ -58,8 +58,10 @@ void NotifyMyAndroid::slotNotify(Notification notification)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotifyMyAndroid::setDefaultSettings()
|
void NMA::setDefaultSettings()
|
||||||
{
|
{
|
||||||
setDefaultSettingsValue(QStringLiteral("ApiKey"), QString());
|
setDefaultSettingsValue(QStringLiteral("ApiKey"), QString());
|
||||||
SnoreSecondaryBackend::setDefaultSettings();
|
SnoreSecondaryBackend::setDefaultSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -22,14 +22,17 @@
|
||||||
|
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
|
|
||||||
class NotifyMyAndroid : public Snore::SnoreSecondaryBackend
|
namespace SnorePlugin {
|
||||||
|
|
||||||
|
|
||||||
|
class NMA : public Snore::SnoreSecondaryBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(Snore::SnoreSecondaryBackend)
|
Q_INTERFACES(Snore::SnoreSecondaryBackend)
|
||||||
Q_PLUGIN_METADATA(IID "org.Snore.SecondaryNotificationBackend/1.0" FILE "snore_plugin.json")
|
Q_PLUGIN_METADATA(IID "org.Snore.SecondaryNotificationBackend/1.0" FILE "snore_plugin.json")
|
||||||
public:
|
public:
|
||||||
NotifyMyAndroid() = default;
|
NMA() = default;
|
||||||
~NotifyMyAndroid() = default;
|
~NMA() = default;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setDefaultSettings() override;
|
void setDefaultSettings() override;
|
||||||
|
@ -42,4 +45,5 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
#endif // NMA_H
|
#endif // NMA_H
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
|
||||||
NotifyMyAndroidSettings::NotifyMyAndroidSettings(Snore::SnorePlugin *plugin, QWidget *parent) :
|
NMASettings::NMASettings(Snore::SnorePlugin *plugin, QWidget *parent) :
|
||||||
Snore::PluginSettingsWidget(plugin, parent),
|
Snore::PluginSettingsWidget(plugin, parent),
|
||||||
m_lineEdit(new QLineEdit)
|
m_lineEdit(new QLineEdit)
|
||||||
{
|
{
|
||||||
|
@ -30,16 +30,16 @@ NotifyMyAndroidSettings::NotifyMyAndroidSettings(Snore::SnorePlugin *plugin, QWi
|
||||||
addRow(QString(), new QLabel(tr("If you don't have an account yet please register at <a href=\"http://notifymyandroid.com/\">Notifymyandroid.com</a>."), this));
|
addRow(QString(), new QLabel(tr("If you don't have an account yet please register at <a href=\"http://notifymyandroid.com/\">Notifymyandroid.com</a>."), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
NotifyMyAndroidSettings::~NotifyMyAndroidSettings()
|
NMASettings::~NMASettings()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotifyMyAndroidSettings::load()
|
void NMASettings::load()
|
||||||
{
|
{
|
||||||
m_lineEdit->setText(settingsValue(QStringLiteral("ApiKey")).toString());
|
m_lineEdit->setText(settingsValue(QStringLiteral("ApiKey")).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotifyMyAndroidSettings::save()
|
void NMASettings::save()
|
||||||
{
|
{
|
||||||
setSettingsValue(QStringLiteral("ApiKey"), m_lineEdit->text());
|
setSettingsValue(QStringLiteral("ApiKey"), m_lineEdit->text());
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,12 +23,12 @@
|
||||||
|
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
|
|
||||||
class NotifyMyAndroidSettings : public Snore::PluginSettingsWidget
|
class NMASettings : public Snore::PluginSettingsWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit NotifyMyAndroidSettings(Snore::SnorePlugin *plugin, QWidget *parent = 0);
|
explicit NMASettings(Snore::SnorePlugin *plugin, QWidget *parent = 0);
|
||||||
~NotifyMyAndroidSettings();
|
~NMASettings();
|
||||||
|
|
||||||
void load() override;
|
void load() override;
|
||||||
void save() override;
|
void save() override;
|
||||||
|
@ -38,6 +38,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(NotifyMyAndroidSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(NMA)
|
||||||
|
|
||||||
#endif // NOTIFYMYANDROID_HH
|
#endif // NOTIFYMYANDROID_HH
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
add_snore_plugin(Puhover SOURCES pushover.cpp SETTINGS_SOURCES pushoversettings.cpp TYPE SecondaryBackend)
|
add_snore_plugin(Pushover SOURCES pushover.cpp SETTINGS_SOURCES pushoversettings.cpp TYPE SecondaryBackend)
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <QHttpMultiPart>
|
#include <QHttpMultiPart>
|
||||||
|
|
||||||
using namespace Snore;
|
namespace SnorePlugin {
|
||||||
|
|
||||||
void Pushover::slotNotify(Notification notification)
|
void Pushover::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
if (notification.data()->sourceAndTargetAreSimilar(this)) {
|
if (notification.data()->sourceAndTargetAreSimilar(this)) {
|
||||||
return;
|
return;
|
||||||
|
@ -47,7 +47,7 @@ void Pushover::slotNotify(Notification notification)
|
||||||
|
|
||||||
QString textString;
|
QString textString;
|
||||||
if (notification.constHints().value("use-markup").toBool()) {
|
if (notification.constHints().value("use-markup").toBool()) {
|
||||||
textString = notification.text(Utils::Href | Utils::Bold | Utils::Underline | Utils::Font | Utils::Italic);
|
textString = notification.text(Snore::Utils::Href | Snore::Utils::Bold | Snore::Utils::Underline | Snore::Utils::Font | Snore::Utils::Italic);
|
||||||
|
|
||||||
QHttpPart html;
|
QHttpPart html;
|
||||||
html.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"html\"")));
|
html.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"html\"")));
|
||||||
|
@ -68,7 +68,7 @@ void Pushover::slotNotify(Notification notification)
|
||||||
priority.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"priority\"")));
|
priority.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"priority\"")));
|
||||||
priority.setBody(QString::number(notification.priority()).toUtf8().constData());
|
priority.setBody(QString::number(notification.priority()).toUtf8().constData());
|
||||||
mp->append(priority);
|
mp->append(priority);
|
||||||
if (notification.priority() == Notification::Emergency) {
|
if (notification.priority() == Snore::Notification::Emergency) {
|
||||||
|
|
||||||
QHttpPart retry;
|
QHttpPart retry;
|
||||||
retry.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"retry\"")));
|
retry.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"retry\"")));
|
||||||
|
@ -86,14 +86,14 @@ void Pushover::slotNotify(Notification notification)
|
||||||
if (notification.hints().value("silent").toBool()) {
|
if (notification.hints().value("silent").toBool()) {
|
||||||
sound.setBody("none");
|
sound.setBody("none");
|
||||||
} else {
|
} else {
|
||||||
sound.setBody(settingsValue(QStringLiteral("Sound"), LocalSetting).toString().toUtf8().constData());
|
sound.setBody(settingsValue(QStringLiteral("Sound"), Snore::LocalSetting).toString().toUtf8().constData());
|
||||||
}
|
}
|
||||||
mp->append(sound);
|
mp->append(sound);
|
||||||
|
|
||||||
if (!settingsValue(QStringLiteral("Devices"), LocalSetting).toString().isEmpty()) {
|
if (!settingsValue(QStringLiteral("Devices"), Snore::LocalSetting).toString().isEmpty()) {
|
||||||
QHttpPart devices;
|
QHttpPart devices;
|
||||||
devices.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"device\"")));
|
devices.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QLatin1String("form-data; name=\"device\"")));
|
||||||
devices.setBody(settingsValue(QStringLiteral("Devices"), LocalSetting).toString().toUtf8().constData());
|
devices.setBody(settingsValue(QStringLiteral("Devices"), Snore::LocalSetting).toString().toUtf8().constData());
|
||||||
mp->append(devices);
|
mp->append(devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,9 @@ void Pushover::slotNotify(Notification notification)
|
||||||
void Pushover::setDefaultSettings()
|
void Pushover::setDefaultSettings()
|
||||||
{
|
{
|
||||||
setDefaultSettingsValue(QStringLiteral("UserKey"), QString());
|
setDefaultSettingsValue(QStringLiteral("UserKey"), QString());
|
||||||
setDefaultSettingsValue(QStringLiteral("Sound"), QLatin1String("pushover"), LocalSetting);
|
setDefaultSettingsValue(QStringLiteral("Sound"), QLatin1String("pushover"), Snore::LocalSetting);
|
||||||
setDefaultSettingsValue(QStringLiteral("Devices"), QString(), LocalSetting);
|
setDefaultSettingsValue(QStringLiteral("Devices"), QString(), Snore::LocalSetting);
|
||||||
SnoreSecondaryBackend::setDefaultSettings();
|
SnoreSecondaryBackend::setDefaultSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
|
|
||||||
|
namespace SnorePlugin {
|
||||||
|
|
||||||
class Pushover : public Snore::SnoreSecondaryBackend
|
class Pushover : public Snore::SnoreSecondaryBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -42,4 +44,5 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
#endif // PUSHOVER_H
|
#endif // PUSHOVER_H
|
||||||
|
|
|
@ -40,6 +40,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(PushoverSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Pushover)
|
||||||
|
|
||||||
#endif // PUSHOVERSETTINGS_H
|
#endif // PUSHOVERSETTINGS_H
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <QtMultimedia/QMediaPlayer>
|
#include <QtMultimedia/QMediaPlayer>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
using namespace Snore;
|
namespace SnorePlugin {
|
||||||
|
|
||||||
Sound::Sound():
|
Sound::Sound():
|
||||||
m_player(new QMediaPlayer(this))
|
m_player(new QMediaPlayer(this))
|
||||||
|
@ -64,3 +64,5 @@ void Sound::slotNotificationDisplayed(Snore::Notification notification)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
class QMediaPlayer;
|
class QMediaPlayer;
|
||||||
|
|
||||||
|
namespace SnorePlugin {
|
||||||
|
|
||||||
class Sound : public Snore::SnoreSecondaryBackend
|
class Sound : public Snore::SnoreSecondaryBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -41,4 +43,5 @@ private:
|
||||||
QMediaPlayer *m_player;
|
QMediaPlayer *m_player;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
#endif // SOUND_H
|
#endif // SOUND_H
|
||||||
|
|
|
@ -23,9 +23,7 @@
|
||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
|
||||||
using namespace Snore;
|
SoundSettings::SoundSettings(Snore::SnorePlugin *snorePlugin, QWidget *parent) :
|
||||||
|
|
||||||
SoundSettings::SoundSettings(SnorePlugin *snorePlugin, QWidget *parent) :
|
|
||||||
PluginSettingsWidget(snorePlugin, parent),
|
PluginSettingsWidget(snorePlugin, parent),
|
||||||
m_lineEditFileName(new QLineEdit),
|
m_lineEditFileName(new QLineEdit),
|
||||||
m_spinBoxVolume(new QSpinBox)
|
m_spinBoxVolume(new QSpinBox)
|
||||||
|
|
|
@ -24,6 +24,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(SoundSettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Sound)
|
||||||
|
|
||||||
#endif // SOUNDSETTINGS_H
|
#endif // SOUNDSETTINGS_H
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
#include <QHttpMultiPart>
|
#include <QHttpMultiPart>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
using namespace Snore;
|
namespace SnorePlugin {
|
||||||
|
|
||||||
void Toasty::slotNotify(Notification notification)
|
void Toasty::slotNotify(Snore::Notification notification)
|
||||||
{
|
{
|
||||||
QString key = settingsValue(QStringLiteral("DeviceID")).toString();
|
QString key = settingsValue(QStringLiteral("DeviceID")).toString();
|
||||||
if (key.isEmpty()) {
|
if (key.isEmpty()) {
|
||||||
|
@ -77,3 +77,5 @@ void Toasty::setDefaultSettings()
|
||||||
setDefaultSettingsValue(QStringLiteral("DeviceID"), QString());
|
setDefaultSettingsValue(QStringLiteral("DeviceID"), QString());
|
||||||
SnoreSecondaryBackend::setDefaultSettings();
|
SnoreSecondaryBackend::setDefaultSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
|
|
||||||
|
namespace SnorePlugin {
|
||||||
|
|
||||||
class Toasty : public Snore::SnoreSecondaryBackend
|
class Toasty : public Snore::SnoreSecondaryBackend
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -42,4 +44,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif // TOASTY_H
|
#endif // TOASTY_H
|
||||||
|
|
|
@ -38,6 +38,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SNORE_DECLARE_SETTINGS_PLUGIN(ToastySettings)
|
SNORE_DECLARE_SETTINGS_PLUGIN(Toasty)
|
||||||
|
|
||||||
#endif // TOASTYSETTINGS_H
|
#endif // TOASTYSETTINGS_H
|
||||||
|
|
|
@ -2,13 +2,14 @@ ecm_add_app_icon(SNORENOTIFY_SETTINGS_DEPS ICONS ${PROJECT_SOURCE_DIR}/data/128-
|
||||||
|
|
||||||
add_executable( snoresettings-cli main-cli.cpp settingsutils.cpp ${SNORENOTIFY_SETTINGS_DEPS})
|
add_executable( snoresettings-cli main-cli.cpp settingsutils.cpp ${SNORENOTIFY_SETTINGS_DEPS})
|
||||||
ecm_mark_nongui_executable(snoresettings-cli)
|
ecm_mark_nongui_executable(snoresettings-cli)
|
||||||
target_link_libraries( snoresettings-cli Snore::Libsnore)
|
target_link_libraries( snoresettings-cli Snore::Libsnore ${SNORE_PLUGINS})
|
||||||
|
install(TARGETS snoresettings-cli ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
|
||||||
if(Qt5Widgets_FOUND)
|
if(Qt5Widgets_FOUND)
|
||||||
qt5_wrap_ui(UI settingswindow.ui)
|
qt5_wrap_ui(UI settingswindow.ui)
|
||||||
add_executable( snoresettings main.cpp settingswindow.cpp settingsutils.cpp ${UI} ${SNORENOTIFY_SETTINGS_DEPS})
|
add_executable( snoresettings main.cpp settingswindow.cpp settingsutils.cpp ${UI} ${SNORENOTIFY_SETTINGS_DEPS})
|
||||||
target_link_libraries( snoresettings Snore::Libsnore Snore::LibsnoreSettings)
|
target_link_libraries( snoresettings Snore::Libsnore Snore::LibsnoreSettings ${SNORE_PLUGINS})
|
||||||
install(TARGETS snoresettings snoresettings-cli ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
install(TARGETS snoresettings ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/snoresettings.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/snoresettings.desktop" @ONLY)
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/snoresettings.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/snoresettings.desktop" @ONLY)
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include "libsnore/snoreglobals.h"
|
#include "libsnore/snoreglobals.h"
|
||||||
#include "libsnore/utils.h"
|
#include "libsnore/utils.h"
|
||||||
|
|
||||||
|
#include "libsnore/snore_static_plugins.h"
|
||||||
|
|
||||||
#include "settingsutils.h"
|
#include "settingsutils.h"
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include "libsnore/version.h"
|
#include "libsnore/version.h"
|
||||||
#include "settingswindow.h"
|
#include "settingswindow.h"
|
||||||
|
|
||||||
|
#include "libsnore/snore_static_plugins.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
ecm_add_app_icon(SNORENOTIFY_SNORESEND_DEPS ICONS ${PROJECT_SOURCE_DIR}/data/128-apps-snore.png)
|
ecm_add_app_icon(SNORENOTIFY_SNORESEND_DEPS ICONS ${PROJECT_SOURCE_DIR}/data/128-apps-snore.png)
|
||||||
|
|
||||||
add_executable(snoresend main.cpp ${SNORENOTIFY_SNORESEND_DEPS})
|
add_executable(snoresend main.cpp ${SNORENOTIFY_SNORESEND_DEPS})
|
||||||
target_link_libraries(snoresend Snore::Libsnore)
|
target_link_libraries(snoresend Snore::Libsnore ${SNORE_PLUGINS})
|
||||||
ecm_mark_nongui_executable(snoresend)
|
ecm_mark_nongui_executable(snoresend)
|
||||||
|
|
||||||
install(TARGETS snoresend ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
install(TARGETS snoresend ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include <libsnore/notification/notification.h>
|
#include <libsnore/notification/notification.h>
|
||||||
#include <libsnore/version.h>
|
#include <libsnore/version.h>
|
||||||
#include <libsnore/utils.h>
|
#include <libsnore/utils.h>
|
||||||
|
#include <libsnore/snore_static_plugins.h>
|
||||||
|
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
|
@ -116,7 +118,7 @@ int main(int argc, char *argv[])
|
||||||
if (parser.isSet(title) && parser.isSet(message)) {
|
if (parser.isSet(title) && parser.isSet(message)) {
|
||||||
SnoreCore &core = SnoreCore::instance();
|
SnoreCore &core = SnoreCore::instance();
|
||||||
|
|
||||||
core.loadPlugins(SnorePlugin::Backend | SnorePlugin::SecondaryBackend);
|
core.loadPlugins(Snore::SnorePlugin::Backend | Snore::SnorePlugin::SecondaryBackend);
|
||||||
|
|
||||||
Icon icon = Icon::defaultIcon();
|
Icon icon = Icon::defaultIcon();
|
||||||
if (parser.isSet(iconPath)) {
|
if (parser.isSet(iconPath)) {
|
||||||
|
|
Loading…
Reference in New Issue