diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fab7372 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2cf9fc5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.14) + +project(ukui-notification LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +include(GNUInstallDirs) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core LinguistTools DBus REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core LinguistTools DBus REQUIRED) +include_directories() +add_subdirectory(notification-server) +add_subdirectory(libukui-notification) + + diff --git a/README.en.md b/README.en.md index edc975d..73dba88 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,4 @@ # ukui-notification #### Description -通知中心 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +ukui-notification diff --git a/README.md b/README.md index c4fcf9e..ceabfa5 100644 --- a/README.md +++ b/README.md @@ -2,36 +2,3 @@ #### 介绍 通知中心 - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/libukui-notification/CMakeLists.txt b/libukui-notification/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/notification-server/CMakeLists.txt b/notification-server/CMakeLists.txt new file mode 100644 index 0000000..f33db43 --- /dev/null +++ b/notification-server/CMakeLists.txt @@ -0,0 +1,21 @@ +set(notificationServer_SRCS + server.h + server-private.h + server.cpp + main.cpp + ) +qt_add_dbus_adaptor(notificationServer_SRCS dbus/org.freedesktop.Notifications.xml server-private.h NotificationServer::ServerPrivate) +qt_add_dbus_adaptor(notificationServer_SRCS dbus/org.ukui.notificationServer.xml server-private.h NotificationServer::ServerPrivate) + +add_executable(ukui-notification-server ${notificationServer_SRCS}) +target_link_libraries(ukui-notification-server + PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + ) +set(TS_FILES ukui-notification_zh_CN.ts) +if(COMMAND qt_create_translation) + qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR}/translations ${TS_FILES}) +else() + qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR}/translations ${TS_FILES}) +endif() \ No newline at end of file diff --git a/notification-server/dbus/org.freedesktop.Notifications.xml b/notification-server/dbus/org.freedesktop.Notifications.xml new file mode 100644 index 0000000..55fe73c --- /dev/null +++ b/notification-server/dbus/org.freedesktop.Notifications.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/notification-server/dbus/org.ukui.notificationServer.xml b/notification-server/dbus/org.ukui.notificationServer.xml new file mode 100644 index 0000000..d6bb928 --- /dev/null +++ b/notification-server/dbus/org.ukui.notificationServer.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/notification-server/main.cpp b/notification-server/main.cpp new file mode 100644 index 0000000..1d6114a --- /dev/null +++ b/notification-server/main.cpp @@ -0,0 +1,20 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "ukui-notification_" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } + + return a.exec(); +} diff --git a/notification-server/server-private.h b/notification-server/server-private.h new file mode 100644 index 0000000..8a52b7b --- /dev/null +++ b/notification-server/server-private.h @@ -0,0 +1,56 @@ +// +// Created by zpf on 23-1-31. +// + +#ifndef UKUI_NOTIFICATION_SERVER_PRIVATE_H +#define UKUI_NOTIFICATION_SERVER_PRIVATE_H +#include +#include +class QDBusServiceWatcher; +namespace NotificationServer { + +class ServerPrivate : public QObject, protected QDBusContext +{ + Q_OBJECT +public: + ServerPrivate(QObject *parent); + ~ServerPrivate(); + bool init(); + + static QString notificationServiceName(); + static QString notificationServicePath(); + static QString notificationServiceInterface(); + + QStringList GetCapabilities() const; + uint Notify(const QString &app_name, + uint replaces_id, + const QString &app_icon, + const QString &summary, + const QString &body, + const QStringList &actions, + const QVariantMap &hints, + int timeout); + void CloseNotification(uint id); + QString GetServerInformation(QString &vendor, QString &version, QString &specVersion) const; + + /** + * 注册成为通知中心客户端 + */ + void RegisterClient(); + /** + * 注销 + */ + void UnRegisterClient(); +Q_SIGNALS: + void NotificationClosed(uint id, uint reason); + void ActionInvoked(uint id, const QString &actionKey); + void ActivationToken(uint id, const QString &ActivationToken); +private: + QDBusServiceWatcher *m_notificationWatchers = nullptr; +}; + + + +} // NotificationServer + +#endif //UKUI_NOTIFICATION_SERVER_PRIVATE_H diff --git a/notification-server/server.cpp b/notification-server/server.cpp new file mode 100644 index 0000000..fd130b4 --- /dev/null +++ b/notification-server/server.cpp @@ -0,0 +1,99 @@ +// +// Created by zpf on 23-1-31. +// +#include +#include +#include "server.h" +#include "server-private.h" +#include "notificationsadaptor.h" + +namespace NotificationServer { +ServerPrivate::ServerPrivate(QObject *parent) : QObject(parent), m_notificationWatchers(new QDBusServiceWatcher(this)) +{ + m_notificationWatchers->setConnection(QDBusConnection::sessionBus()); + m_notificationWatchers->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); + connect(m_notificationWatchers, &QDBusServiceWatcher::serviceUnregistered, m_notificationWatchers, &QDBusServiceWatcher::removeWatchedService); +} + +ServerPrivate::~ServerPrivate() = default; + +QStringList ServerPrivate::GetCapabilities() const +{ + return QStringList(); +} + +uint ServerPrivate::Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, + const QString &body, const QStringList &actions, const QVariantMap &hints, int timeout) +{ + return 0; +} + +QString ServerPrivate::GetServerInformation(QString &vendor, QString &version, QString &specVersion) const +{ + return QString(); +} + +void ServerPrivate::CloseNotification(uint id) +{ + +} + +bool ServerPrivate::init() +{ + new NotificationsAdaptor(this); + if(QDBusConnection::sessionBus().registerObject(notificationServicePath(), this)) { + qWarning() << "Failed to register Notification DBus object!"; + return false; + } + auto registration = QDBusConnection::sessionBus().interface()->registerService(notificationServiceName(), + QDBusConnectionInterface::ReplaceExistingService, + QDBusConnectionInterface::DontAllowReplacement); + if (registration.value() != QDBusConnectionInterface::ServiceRegistered) { + qWarning() << "Failed to register Notification service on DBus!"; + return false; + } + return true; +} + +QString ServerPrivate::notificationServiceName() +{ + return QStringLiteral("org.freedesktop.Notifications"); +} + +QString ServerPrivate::notificationServicePath() +{ + return QStringLiteral("/org/freedesktop/Notifications"); +} + +QString ServerPrivate::notificationServiceInterface() +{ + return QStringLiteral("org.freedesktop.Notifications");; +} + +void ServerPrivate::RegisterClient() +{ + m_notificationWatchers->addWatchedService(message().service()); +} + +void ServerPrivate::UnRegisterClient() +{ + m_notificationWatchers->removeWatchedService(message().service()); +} + +Server::Server(QObject *parent): QObject(parent), d(new ServerPrivate(this)) +{ +} + +Server &Server::self() +{ + static Server self; + return self; +} + +bool Server::init() +{ + return d->init(); +} + +Server::~Server() = default; +} // NotificationServer \ No newline at end of file diff --git a/notification-server/server.h b/notification-server/server.h new file mode 100644 index 0000000..0a54cb0 --- /dev/null +++ b/notification-server/server.h @@ -0,0 +1,25 @@ +// +// Created by zpf on 23-1-31. +// + +#ifndef UKUI_NOTIFICATION_SERVER_H +#define UKUI_NOTIFICATION_SERVER_H +#include +namespace NotificationServer { +class ServerPrivate; +class Server : public QObject +{ + Q_OBJECT +public: + static Server &self(); + ~Server(); + bool init(); +private: + explicit Server(QObject *parent = nullptr); + Q_DISABLE_COPY(Server) + ServerPrivate *d = nullptr; +}; + +} // NotificationServer + +#endif //UKUI_NOTIFICATION_SERVER_H diff --git a/notification-server/translations/ukui-notification_zh_CN.ts b/notification-server/translations/ukui-notification_zh_CN.ts new file mode 100644 index 0000000..e5ca8aa --- /dev/null +++ b/notification-server/translations/ukui-notification_zh_CN.ts @@ -0,0 +1,4 @@ + + + +