From: Patrick von Reth Date: Tue, 15 Oct 2013 15:13:43 +0000 (+0200) Subject: clean apply of the whole snore patches X-Git-Tag: 0.10-beta1~94 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=a43f68a84621d11b61f0e712890a5feb76939553 clean apply of the whole snore patches --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 24deb865..57b51dec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,6 +402,12 @@ if(BUILD_GUI) ) endif() +find_package(Libsnore) +if(LIBSNORE_FOUND) + add_definitions(-DHAVE_LIBSNORE -DLIBSNORE_PLUGIN_PATH="${LIBSNORE_PLUGIN_PATH}") + set(CLIENT_LIBRARIES ${CLIENT_LIBRARIES} ${LIBSNORE_LIBRARIES}) + set(HAVE_SNORENOTIFY true) +endif(LIBSNORE_FOUND) endif(BUILD_GUI) # Core-only deps diff --git a/cmake/modules/FindLibsnore.cmake b/cmake/modules/FindLibsnore.cmake new file mode 100644 index 00000000..4dc0b9e0 --- /dev/null +++ b/cmake/modules/FindLibsnore.cmake @@ -0,0 +1,34 @@ +# - Try to find the libsnore library +# Once done this will define +# +# LIBSNORE_FOUND - system has the LIBSNORE library +# LIBSNORE_LIBRARIES - The libraries needed to use LIBSNORE +# LIBSNORE_INCLUDE_DIRS - The includes needed to use LIBSNORE +# LIBSNORE_PLUGIN_PATH - Path of the plugins +# Copyright 2013 Patrick von Reth + +find_path(LIBSNORE_INCLUDE_DIR + NAMES snore/core/snore.h + PATHS ${KDE4_INCLUDE_DIR} +) + +find_library(LIBSNORE_LIBRARY + NAMES + libsnore + snore + PATHS ${KDE4_LIB_DIR} +) + +find_path(LIBSNORE_PLUGIN_PATH snoreplugins) + +if(LIBSNORE_LIBRARY AND LIBSNORE_PLUGIN_PATH) + set(LIBSNORE_PLUGIN_PATH ${LIBSNORE_PLUGIN_PATH}/snoreplugins) +endif() + +set(LIBSNORE_LIBRARIES ${LIBSNORE_LIBRARY}) +set(LIBSNORE_INCLUDE_DIRS ${LIBSNORE_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LIBSNORE DEFAULT_MSG LIBSNORE_LIBRARIES LIBSNORE_INCLUDE_DIRS) + +mark_as_advanced(LIBSNORE_LIBRARIES LIBSNORE_INCLUDE_DIRS) diff --git a/src/qtui/CMakeLists.txt b/src/qtui/CMakeLists.txt index e6966060..6cb6cdb5 100644 --- a/src/qtui/CMakeLists.txt +++ b/src/qtui/CMakeLists.txt @@ -146,6 +146,11 @@ if(HAVE_KDE) set(SOURCES ${SOURCES} knotificationbackend.cpp) set(MOC_HDRS ${MOC_HDRS} knotificationbackend.h) else(HAVE_KDE) + if(HAVE_SNORENOTIFY) + set(SOURCES ${SOURCES} snorenotificationbackend.cpp) + set(MOC_HDRS ${MOC_HDRS} snorenotificationbackend.h) + set(FORMS ${FORMS} snorentificationconfigwidget.ui) + endif(HAVE_SNORENOTIFY) if(HAVE_PHONON) set(SOURCES ${SOURCES} phononnotificationbackend.cpp) set(MOC_HDRS ${MOC_HDRS} phononnotificationbackend.h) diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index a4be9fd9..5460a345 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -94,6 +94,9 @@ # ifdef HAVE_PHONON # include "phononnotificationbackend.h" # endif +# ifdef HAVE_LIBSNORE +# include "snorenotificationbackend.h" +# endif # include "systraynotificationbackend.h" # include "taskbarnotificationbackend.h" #else /* HAVE_KDE */ @@ -212,7 +215,9 @@ void MainWin::init() # ifdef HAVE_PHONON QtUi::registerNotificationBackend(new PhononNotificationBackend(this)); # endif -# ifndef QT_NO_SYSTEMTRAYICON +# ifdef HAVE_LIBSNORE + QtUi::registerNotificationBackend(new SnoreNotificationBackend(this)); +# elif !defined(QT_NO_SYSTEMTRAYICON) QtUi::registerNotificationBackend(new SystrayNotificationBackend(this)); # endif diff --git a/src/qtui/snorenotificationbackend.cpp b/src/qtui/snorenotificationbackend.cpp new file mode 100644 index 00000000..af23dced --- /dev/null +++ b/src/qtui/snorenotificationbackend.cpp @@ -0,0 +1,169 @@ +/*************************************************************************** +* Copyright (C) 2011-2013 by Patrick von Reth * +* vonreth@kde.org * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) version 3. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +***************************************************************************/ + +#include "snorenotificationbackend.h" + +#include +#include +#include + +#include "client.h" +#include "iconloader.h" +#include "networkmodel.h" +#include "systraynotificationbackend.h" +#include "qtui.h" + +#include + + +#include +#include + + +SnoreNotificationBackend::SnoreNotificationBackend (QObject *parent) + :AbstractNotificationBackend(parent), + m_systrayBackend(NULL) +{ + NotificationSettings notificationSettings; + QString backend = notificationSettings.value("Snore/Backend", "SystemTray").toString(); + m_timeout = notificationSettings.value("Snore/Timeout",10).toInt(); + + notificationSettings.notify("Snore/Backend", this, SLOT(backendChanged(const QVariant &))); + notificationSettings.notify("Snore/Backend", this, SLOT(timeoutChanged(const QVariant &))); + + //TODO: try to get an instance of the tray icon to be able to show popups + m_snore = new Snore::SnoreCore(); + m_snore->hints().setValue("WINDOWS_APP_ID","QuasselProject.QuasselIRC"); + m_snore->loadPlugins(Snore::PluginContainer::BACKEND); + Snore::Application *a = new Snore::Application("Quassel",Snore::Icon(DesktopIcon("quassel").toImage())); + + connect(m_snore,SIGNAL(actionInvoked(Snore::Notification)),this,SLOT(actionInvoked(Snore::Notification))); + + m_icon = Snore::Icon(DesktopIcon("dialog-information").toImage()); + + a->addAlert(new Snore::Alert(tr("Private Message"),tr("Private Message"))); + + m_snore->addApplication(a); + m_snore->applicationIsInitialized (a); + + m_snore->setPrimaryNotificationBackend(backend); +} + +SnoreNotificationBackend::~SnoreNotificationBackend(){ + m_snore->removeApplication("Quassel"); + m_snore->deleteLater(); +} + +void SnoreNotificationBackend::backendChanged(const QVariant &v){ + QString backend = v.toString(); + if(backend == "SystemTray"){ + if(m_systrayBackend == NULL){ + m_systrayBackend = new SystrayNotificationBackend(this); + QtUi::registerNotificationBackend(m_systrayBackend); + } + }else{ + if(m_systrayBackend != NULL){ + QtUi::unregisterNotificationBackend(m_systrayBackend); + delete m_systrayBackend; + m_systrayBackend = NULL; + } + m_snore->setPrimaryNotificationBackend(backend); + } +} + +void SnoreNotificationBackend::timeoutChanged(const QVariant &v){ + m_timeout = v.toInt(); +} + +void SnoreNotificationBackend::notify(const Notification &n){ + if(m_systrayBackend != NULL) + return; + QString title = Client::networkModel()->networkName(n.bufferId) + " - " + Client::networkModel()->bufferName(n.bufferId); + QString message = QString("<%1> %2").arg(n.sender, n.message); + Snore::Notification noti("Quassel",tr("Private Message"),title,message,m_icon,m_timeout); + noti.hints().setValue("QUASSEL_ID",n.notificationId); + m_notificationIds.insert(n.notificationId,noti.id()); + m_snore->broadcastNotification(noti); +} + +void SnoreNotificationBackend::close(uint notificationId){ + if(m_systrayBackend != NULL) + return; + Snore::Notification n = m_snore->getActiveNotificationByID(m_notificationIds.take(notificationId)); + m_snore->requestCloseNotification(n,Snore::NotificationEnums::CloseReasons::CLOSED); +} + +void SnoreNotificationBackend::actionInvoked(Snore::Notification n){ + emit activated(n.hints().value("QUASSEL_ID").toUInt()); +} + +SettingsPage *SnoreNotificationBackend::createConfigWidget()const{ + return new ConfigWidget(m_snore); +} + + +/***************************************************************************/ + +SnoreNotificationBackend::ConfigWidget::ConfigWidget(Snore::SnoreCore *snore,QWidget *parent) + :SettingsPage("Internal", "SnoreNotification", parent), + m_snore(snore) +{ + ui.setupUi(this); + ui.backends->insertItems(0,m_snore->notificationBackends()); + + connect(ui.backends, SIGNAL(currentIndexChanged(QString)), SLOT(backendChanged(QString))); + connect(ui.timeout,SIGNAL(valueChanged(int)),this,SLOT(timeoutChanged(int))); +} + +void SnoreNotificationBackend::ConfigWidget::backendChanged(const QString &b){ + ui.backends->setCurrentIndex(ui.backends->findText(b)); + setChangedState(true); +} + +void SnoreNotificationBackend::ConfigWidget::timeoutChanged(int i){ + ui.timeout->setValue(i); + setChangedState(true); + +} + +bool SnoreNotificationBackend::ConfigWidget::hasDefaults() const { + return true; +} + +void SnoreNotificationBackend::ConfigWidget::defaults() { + backendChanged("SystemTray"); + timeoutChanged(10); +} + +void SnoreNotificationBackend::ConfigWidget::load() { + NotificationSettings s; + QString backend = s.value("Snore/Backend", "SystemTray").toString(); + int timeout = s.value("Snore/Timeout",10).toInt(); + ui.backends->setCurrentIndex(ui.backends->findText(backend)); + ui.timeout->setValue(timeout); + setChangedState(false); +} + +void SnoreNotificationBackend::ConfigWidget::save() { + NotificationSettings s; + s.setValue("Snore/Backend", ui.backends->currentText()); + s.setValue("Snore/Timeout",ui.timeout->value()); + load(); +} diff --git a/src/qtui/snorenotificationbackend.h b/src/qtui/snorenotificationbackend.h new file mode 100644 index 00000000..ef3c1af0 --- /dev/null +++ b/src/qtui/snorenotificationbackend.h @@ -0,0 +1,91 @@ +/*************************************************************************** +* Copyright (C) 2011-2013 by Patrick von Reth * +* vonreth@kde.org * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) version 3. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +***************************************************************************/ + +#ifndef SNORENOTIFICATIONBACKEND_H_ +#define SNORENOTIFICATIONBACKEND_H_ + +#include "abstractnotificationbackend.h" + +#include "settingspage.h" + +#include "ui_snorentificationconfigwidget.h" + +namespace Snore{ +class SnoreCore; +class Icon; +} +class SystrayNotificationBackend; + +#include + +class SnoreNotificationBackend : public AbstractNotificationBackend { + Q_OBJECT +public: + SnoreNotificationBackend (QObject *parent); + ~SnoreNotificationBackend(); + + void notify(const Notification &); + void close(uint notificationId); + + virtual SettingsPage *createConfigWidget()const; + +signals: + void activated(uint notificationId = 0); + +public slots: + void actionInvoked(Snore::Notification); +private slots: + void backendChanged(const QVariant &); + void timeoutChanged(const QVariant &); + +private: + class ConfigWidget; + SystrayNotificationBackend * m_systrayBackend; + Snore::SnoreCore *m_snore; + QHash m_notificationIds; + Snore::Icon m_icon; + int m_timeout; +}; + +class SnoreNotificationBackend::ConfigWidget : public SettingsPage { + Q_OBJECT + +public: + ConfigWidget(Snore::SnoreCore *snore,QWidget *parent = 0); + void save(); + void load(); + bool hasDefaults() const; + void defaults(); + +private slots: + void backendChanged(const QString&); + void timeoutChanged(int); + +private: + Ui::SnoreNotificationConfigWidget ui; + Snore::SnoreCore *m_snore; + + // QSpinBox *timeoutBox; + + // bool enabled; + // int timeout; +}; + +#endif diff --git a/src/qtui/ui/snorentificationconfigwidget.ui b/src/qtui/ui/snorentificationconfigwidget.ui new file mode 100644 index 00000000..0e33248b --- /dev/null +++ b/src/qtui/ui/snorentificationconfigwidget.ui @@ -0,0 +1,105 @@ + + + SnoreNotificationConfigWidget + + + + 0 + 0 + 440 + 110 + + + + + 440 + 110 + + + + Form + + + + QLayout::SetNoConstraint + + + + + Snore + + + + + 10 + 25 + 46 + 13 + + + + Backend: + + + + + + 70 + 20 + 331 + 22 + + + + + + + 10 + 65 + 46 + 13 + + + + Timeout: + + + + + + 70 + 60 + 81 + 22 + + + + + + + s + + + 0 + + + + + + 170 + 65 + 101 + 16 + + + + 0 means infinite + + + + + + + + +