From 933710292454159e7f6bb5092cf5dc458a7c6355 Mon Sep 17 00:00:00 2001 From: reionwong Date: Sat, 25 Sep 2021 13:07:59 +0800 Subject: [PATCH] Notification support icon --- notificationd/CMakeLists.txt | 1 + notificationd/notificationserver.cpp | 9 +++++-- notificationd/qml/NotificationPopup.qml | 2 ++ notificationd/utils.cpp | 31 +++++++++++++++++++++++++ notificationd/utils.h | 16 +++++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 notificationd/utils.cpp create mode 100644 notificationd/utils.h diff --git a/notificationd/CMakeLists.txt b/notificationd/CMakeLists.txt index 4bffa1c..25e8c4a 100644 --- a/notificationd/CMakeLists.txt +++ b/notificationd/CMakeLists.txt @@ -3,6 +3,7 @@ set(SRCS main.cpp notificationsmodel.cpp notificationserver.cpp notification.cpp + utils.cpp dbus/notificationsadaptor.cpp resources.qrc ) diff --git a/notificationd/notificationserver.cpp b/notificationd/notificationserver.cpp index a208b2a..58454e7 100644 --- a/notificationd/notificationserver.cpp +++ b/notificationd/notificationserver.cpp @@ -6,6 +6,7 @@ #include "notificationserver.h" #include "dbus/notificationsadaptor.h" +#include "utils.h" #include @@ -69,6 +70,9 @@ uint NotificationServer::Notify(const QString &app_name, notification.actions = actions; notification.timeout = timeout; + if (notification.appIcon.startsWith("file://")) + notification.appIcon = notification.appIcon.replace("file://", ""); + uint pid = 0; QDBusReply pidReply = connection().interface()->servicePid(message().service()); if (pidReply.isValid()) { @@ -77,8 +81,9 @@ uint NotificationServer::Notify(const QString &app_name, if (pid > 0) { // 查找 app name - if (notification.appName.isEmpty()) { - + if (notification.appIcon.isEmpty()) { + // const QString processName = Utils::processNameFromPid(pid); + // notification.appIcon = processName; } } diff --git a/notificationd/qml/NotificationPopup.qml b/notificationd/qml/NotificationPopup.qml index 0ce132e..0b43ff2 100644 --- a/notificationd/qml/NotificationPopup.qml +++ b/notificationd/qml/NotificationPopup.qml @@ -88,6 +88,8 @@ Window { source: "image://icontheme/%1".arg(model.iconName) sourceSize: Qt.size(width, height) Layout.alignment: Qt.AlignVCenter + antialiasing: true + smooth: true } ColumnLayout { diff --git a/notificationd/utils.cpp b/notificationd/utils.cpp new file mode 100644 index 0000000..af10f09 --- /dev/null +++ b/notificationd/utils.cpp @@ -0,0 +1,31 @@ +#include "utils.h" +#include + +Utils::Utils(QObject *parent) : QObject(parent) +{ + +} + +QString Utils::processNameFromPid(uint pid) +{ + QFile file(QString("/proc/%1/cmdline").arg(pid)); + QString name; + + if (file.open(QIODevice::ReadOnly)) { + QByteArray cmd = file.readAll(); + + if (!cmd.isEmpty()) { + // extract non-truncated name from cmdline + int zeroIndex = cmd.indexOf('\0'); + int processNameStart = cmd.lastIndexOf('/', zeroIndex); + if (processNameStart == -1) { + processNameStart = 0; + } else { + processNameStart++; + } + name = QString::fromLocal8Bit(cmd.mid(processNameStart, zeroIndex - processNameStart)); + } + } + + return name; +} diff --git a/notificationd/utils.h b/notificationd/utils.h new file mode 100644 index 0000000..d7ad4f0 --- /dev/null +++ b/notificationd/utils.h @@ -0,0 +1,16 @@ +#ifndef UTILS_H +#define UTILS_H + +#include + +class Utils : public QObject +{ + Q_OBJECT + +public: + explicit Utils(QObject *parent = nullptr); + + static QString processNameFromPid(uint pid); +}; + +#endif // UTILS_H