clean apply of the whole snore patches
authorPatrick von Reth <vonreth@kde.org>
Tue, 15 Oct 2013 15:13:43 +0000 (17:13 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 19 Nov 2013 23:14:07 +0000 (00:14 +0100)
CMakeLists.txt
cmake/modules/FindLibsnore.cmake [new file with mode: 0644]
src/qtui/CMakeLists.txt
src/qtui/mainwin.cpp
src/qtui/snorenotificationbackend.cpp [new file with mode: 0644]
src/qtui/snorenotificationbackend.h [new file with mode: 0644]
src/qtui/ui/snorentificationconfigwidget.ui [new file with mode: 0644]

index 24deb86..57b51de 100644 (file)
@@ -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 (file)
index 0000000..4dc0b9e
--- /dev/null
@@ -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 <vonreth@kde.org>
+
+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)
index e696606..6cb6cdb 100644 (file)
@@ -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)
index a4be9fd..5460a34 100644 (file)
@@ -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 (file)
index 0000000..af23dce
--- /dev/null
@@ -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 <QtGui>
+#include <QtGlobal>
+#include <QDebug>
+
+#include "client.h"
+#include "iconloader.h"
+#include "networkmodel.h"
+#include "systraynotificationbackend.h"
+#include "qtui.h"
+
+#include <iostream>
+
+
+#include <snore/core/snore.h>
+#include <snore/core/notification/notification.h>
+
+
+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 (file)
index 0000000..ef3c1af
--- /dev/null
@@ -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 <snore/core/notification/notification.h>
+
+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<uint,uint> 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 (file)
index 0000000..0e33248
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SnoreNotificationConfigWidget</class>
+ <widget class="QWidget" name="SnoreNotificationConfigWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>440</width>
+    <height>110</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>440</width>
+    <height>110</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="sizeConstraint">
+    <enum>QLayout::SetNoConstraint</enum>
+   </property>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Snore</string>
+     </property>
+     <widget class="QLabel" name="label">
+      <property name="geometry">
+       <rect>
+        <x>10</x>
+        <y>25</y>
+        <width>46</width>
+        <height>13</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Backend:</string>
+      </property>
+     </widget>
+     <widget class="QComboBox" name="backends">
+      <property name="geometry">
+       <rect>
+        <x>70</x>
+        <y>20</y>
+        <width>331</width>
+        <height>22</height>
+       </rect>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_2">
+      <property name="geometry">
+       <rect>
+        <x>10</x>
+        <y>65</y>
+        <width>46</width>
+        <height>13</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Timeout:</string>
+      </property>
+     </widget>
+     <widget class="QSpinBox" name="timeout">
+      <property name="geometry">
+       <rect>
+        <x>70</x>
+        <y>60</y>
+        <width>81</width>
+        <height>22</height>
+       </rect>
+      </property>
+      <property name="specialValueText">
+       <string/>
+      </property>
+      <property name="suffix">
+       <string> s</string>
+      </property>
+      <property name="minimum">
+       <number>0</number>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_3">
+      <property name="geometry">
+       <rect>
+        <x>170</x>
+        <y>65</y>
+        <width>101</width>
+        <height>16</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>0 means infinite</string>
+      </property>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>