/* SPDX-FileCopyrightText: 2008, 2009 Fredrik Höglund SPDX-License-Identifier: LGPL-2.0-only */ #include "desktopnotifier.h" #include #include #include #include #include #include #include K_PLUGIN_CLASS_WITH_JSON(DesktopNotifier, "desktopnotifier.json") using namespace Qt::StringLiterals; DesktopNotifier::DesktopNotifier(QObject *parent, const QList &) : KDEDModule(parent) { m_desktopLocation = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); dirWatch = new KDirWatch(this); dirWatch->addDir(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); dirWatch->addDir(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + u'/' + u"Trash/files"); dirWatch->addFile(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/user-dirs.dirs")); connect(dirWatch, &KDirWatch::created, this, &DesktopNotifier::created); connect(dirWatch, &KDirWatch::dirty, this, &DesktopNotifier::dirty); } void DesktopNotifier::watchDir(const QString &path) { dirWatch->addDir(path); } void DesktopNotifier::created(const QString &path) { if (path == QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/user-dirs.dirs")) { checkDesktopLocation(); } } void DesktopNotifier::dirty(const QString &path) { Q_UNUSED(path) if (path.startsWith(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + u'/' + u"Trash/files")) { QList trashUrls; // Check for any .desktop file linking to trash:/ to update its icon const auto desktopFiles = QDir(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).entryInfoList({QStringLiteral("*.desktop")}); for (const auto &fi : desktopFiles) { KDesktopFile df(fi.absoluteFilePath()); if (df.hasLinkType() && df.readUrl() == QLatin1String("trash:/")) { trashUrls << QUrl(QString(u"desktop:/" + fi.fileName())); } } if (!trashUrls.isEmpty()) { org::kde::KDirNotify::emitFilesChanged(trashUrls); } } else if (path == QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/user-dirs.dirs")) { checkDesktopLocation(); } else { // Emitting FilesAdded forces a re-read of the dir QUrl url; url.setScheme(QStringLiteral("desktop")); const auto relativePath = QDir(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).relativeFilePath(path); url.setPath(QStringLiteral("%1/%2").arg(url.path(), relativePath)); url.setPath(QDir::cleanPath(url.path())); org::kde::KDirNotify::emitFilesAdded(url); } } void DesktopNotifier::checkDesktopLocation() { const QUrl ¤tLocation = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); if (m_desktopLocation != currentLocation) { m_desktopLocation = currentLocation; org::kde::KDirNotify::emitFilesChanged(QList() << QUrl(QStringLiteral("desktop:/"))); } } #include