From 566d1508cbf2ec79a708c70bf2b1836be6ea109d Mon Sep 17 00:00:00 2001 From: LXQt Packaging Team Date: Sat, 17 Aug 2019 12:00:08 +0100 Subject: [PATCH] workaround-missed-file-monitoring Last-Update: 2019-06-08 Gbp-Pq: Name workaround-missed-file-monitoring.patch --- src/core/folder.cpp | 18 ++++++++++++++++++ src/core/folder.h | 4 ++++ src/fileoperation.cpp | 22 ++++++++++++++++++++++ src/utilities.cpp | 16 +++++++++++++++- 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/core/folder.cpp b/src/core/folder.cpp index adbb480..01e1297 100644 --- a/src/core/folder.cpp +++ b/src/core/folder.cpp @@ -112,6 +112,20 @@ std::shared_ptr Folder::fromPath(const FilePath& path) { return folder; } +// static +// Checks if this is the path of a folder in use. +std::shared_ptr Folder::findByPath(const FilePath& path) { + std::lock_guard lock{mutex_}; + auto it = cache_.find(path); + if(it != cache_.end()) { + auto folder = it->second.lock(); + if(folder) { + return folder; + } + } + return nullptr; +} + bool Folder::makeDirectory(const char* /*name*/, GError** /*error*/) { // TODO: // FIXME: what the API is used for in the original libfm C API? @@ -142,6 +156,10 @@ bool Folder::isEmpty() const { return files_.empty(); } +bool Folder::hasFileMonitor() const { + return (dirMonitor_ != nullptr); +} + FileInfoList Folder::files() const { FileInfoList ret; ret.reserve(files_.size()); diff --git a/src/core/folder.h b/src/core/folder.h index 098d218..1c257e9 100644 --- a/src/core/folder.h +++ b/src/core/folder.h @@ -56,6 +56,8 @@ public: static std::shared_ptr fromPath(const FilePath& path); + static std::shared_ptr findByPath(const FilePath& path); + bool makeDirectory(const char* name, GError** error); void queryFilesystemInfo(); @@ -74,6 +76,8 @@ public: bool isEmpty() const; + bool hasFileMonitor() const; + FileInfoList files() const; const FilePath& path() const; diff --git a/src/fileoperation.cpp b/src/fileoperation.cpp index 5db818b..683d092 100644 --- a/src/fileoperation.cpp +++ b/src/fileoperation.cpp @@ -298,6 +298,8 @@ void FileOperation::onJobFinish() { } Q_EMIT finished(); + bool tryReload = true; + // special handling for trash job if(type_ == Trash && !job_->isCancelled()) { auto trashJob = static_cast(job_); @@ -313,6 +315,26 @@ void FileOperation::onJobFinish() { "Do you want to delete them instead?")) == QMessageBox::Yes) { deleteFiles(std::move(unsupportedFiles), false); } + tryReload = false; + } + } + + // reload the containing folder if it is in use but does not have a file monitor + if(tryReload) { + if(!srcPaths_.empty() && (type_ == Trash || type_ == Delete || type_ == Move)) { + auto parent_path = srcPaths_[0].parent(); + if(parent_path != destPath_) { // otherwise, it will be done below + auto folder = Fm::Folder::findByPath(parent_path); + if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { + folder->reload(); + } + } + } + if(destPath_) { + auto folder = Fm::Folder::findByPath(destPath_); + if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { + folder->reload(); + } } } diff --git a/src/utilities.cpp b/src/utilities.cpp index 9da7a55..18e2b2f 100644 --- a/src/utilities.cpp +++ b/src/utilities.cpp @@ -157,7 +157,8 @@ bool isCurrentPidClipboardData(const QMimeData& data) { } bool changeFileName(const Fm::FilePath& filePath, const QString& newName, QWidget* parent, bool showMessage) { - auto dest = filePath.parent().child(newName.toLocal8Bit().constData()); + auto parent_path = filePath.parent(); + auto dest = parent_path.child(newName.toLocal8Bit().constData()); Fm::GErrorPtr err; if(!g_file_move(filePath.gfile().get(), dest.gfile().get(), GFileCopyFlags(G_FILE_COPY_ALL_METADATA | @@ -170,6 +171,13 @@ bool changeFileName(const Fm::FilePath& filePath, const QString& newName, QWidge } return false; } + + // reload the containing folder if it is in use but does not have a file monitor + auto folder = Fm::Folder::findByPath(parent_path); + if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { + folder->reload(); + } + return true; } @@ -263,6 +271,12 @@ _retry: QMessageBox::critical(parent ? parent->window() : nullptr, QObject::tr("Error"), err.message()); } + else { // reload the containing folder if it is in use but does not have a file monitor + auto folder = Fm::Folder::findByPath(parentDir); + if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { + folder->reload(); + } + } } uid_t uidFromName(QString name) { -- 2.30.2