Files
flameshot/src/utils/systemnotification.cpp
Magnus Groß 5174f8dc1b Allow notification to be dragged and dropped (#473)
* Set x-kde-urls for notifications

The x-kde-urls field in the hints map allows us to provide a direct URL
to the saved screenshot. The notification server may then use this hint
to provide extra functionality, such as drag and drop support and
thumbnails.

For more information see https://community.kde.org/Plasma/Notifications#File_Path

Fixes #256

Note that other notification servers may ignore this hint.

* Avoid branching twice for ok
2019-03-20 22:41:55 +01:00

64 lines
2.1 KiB
C++

#include "systemnotification.h"
#include "src/utils/confighandler.h"
#include <QApplication>
#include <QUrl>
#ifndef Q_OS_WIN
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusInterface>
#else
#endif
#include "src/core/controller.h"
#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX)
SystemNotification::SystemNotification(QObject *parent) : QObject(parent) {
m_interface = new QDBusInterface(QStringLiteral("org.freedesktop.Notifications"),
QStringLiteral("/org/freedesktop/Notifications"),
QStringLiteral("org.freedesktop.Notifications"),
QDBusConnection::sessionBus(),
this);
}
#else
SystemNotification::SystemNotification(QObject *parent) : QObject(parent) {
m_interface = nullptr;
}
#endif
void SystemNotification::sendMessage(const QString &text, const QString &savePath) {
sendMessage(text, tr("Flameshot Info"), savePath);
}
void SystemNotification::sendMessage(
const QString &text,
const QString &title,
const QString &savePath,
const int timeout)
{
if(!ConfigHandler().desktopNotificationValue()) {
return;
}
#ifndef Q_OS_WIN
QList<QVariant> args;
QVariantMap hintsMap;
if (!savePath.isEmpty()) {
QUrl fullPath = QUrl::fromLocalFile(savePath);
// allows the notification to be dragged and dropped
hintsMap[QStringLiteral("x-kde-urls")] = QStringList({fullPath.toString()});
}
args << (qAppName()) //appname
<< static_cast<unsigned int>(0) //id
<< "flameshot" //icon
<< title //summary
<< text //body
<< QStringList() //actions
<< hintsMap //hints
<< timeout; //timeout
m_interface->callWithArgumentList(QDBus::AutoDetect, QStringLiteral("Notify"), args);
#else
auto c = Controller::getInstance();
c->sendTrayNotification(text, title, timeout);
#endif
}