commit
d1c409451e
@ -0,0 +1,6 @@
|
||||
[DEFAULT]
|
||||
debian-branch = debian/sid
|
||||
upstream-branch = upstream/latest
|
||||
pristine-tar = True
|
||||
compression = xz
|
||||
|
@ -0,0 +1,49 @@
|
||||
Description: Fix DND for MTP mounted folders
|
||||
Author: Tsu Jan <tsujan2000@gmail.com>
|
||||
Bug-Upstream: https://github.com/lxqt/pcmanfm-qt/issues/301
|
||||
Applied-Upstream: https://github.com/lxqt/libfm-qt/commit/7de18bc89b9b47f66de54a7e347bf8d391d44a48
|
||||
Last-Update: 2019-08-17
|
||||
--- a/src/foldermodel.cpp
|
||||
+++ b/src/foldermodel.cpp
|
||||
@@ -384,7 +384,7 @@ QStringList FolderModel::mimeTypes() con
|
||||
// the real implementation is in FolderView::childDropEvent().
|
||||
types << "XdndDirectSave0";
|
||||
types << "text/uri-list";
|
||||
- // types << "x-special/gnome-copied-files";
|
||||
+ types << QStringLiteral("libfm/files"); // see FolderModel::mimeData() below
|
||||
return types;
|
||||
}
|
||||
|
||||
@@ -407,6 +407,9 @@ QMimeData* FolderModel::mimeData(const Q
|
||||
}
|
||||
}
|
||||
data->setData("text/uri-list", urilist);
|
||||
+ // NOTE: The mimetype "text/uri-list" changes the list in QMimeData::setData() to get URLs
|
||||
+ // but some protocols (like MTP) may need the original list to query file info.
|
||||
+ data->setData(QStringLiteral("libfm/files"), urilist);
|
||||
|
||||
return data;
|
||||
}
|
||||
@@ -442,10 +445,19 @@ bool FolderModel::dropMimeData(const QMi
|
||||
destPath = path();
|
||||
}
|
||||
|
||||
+ Fm::FilePathList srcPaths;
|
||||
+ // try to get paths from the original data
|
||||
+ if(data->hasFormat(QStringLiteral("libfm/files"))) {
|
||||
+ QByteArray _data = data->data(QStringLiteral("libfm/files"));
|
||||
+ srcPaths = pathListFromUriList(_data.data());
|
||||
+ }
|
||||
+ if(srcPaths.empty() && data->hasUrls()) {
|
||||
+ srcPaths = Fm::pathListFromQUrls(data->urls());
|
||||
+ }
|
||||
+
|
||||
// FIXME: should we put this in dropEvent handler of FolderView instead?
|
||||
- if(data->hasUrls()) {
|
||||
+ if(!srcPaths.empty()) {
|
||||
//qDebug("drop action: %d", action);
|
||||
- auto srcPaths = pathListFromQUrls(data->urls());
|
||||
switch(action) {
|
||||
case Qt::CopyAction:
|
||||
FileOperation::copyFiles(srcPaths, destPath);
|
||||
|
@ -0,0 +1,143 @@
|
||||
Description: Realod folder after transfer job if it lacks file monitoring
|
||||
Closes https://github.com/lxqt/pcmanfm-qt/issues/933 and closes
|
||||
https://github.com/lxqt/libfm-qt/issues/280. After a file transfer job is
|
||||
finished inside a directory, if it is the path of an open folder that lacks
|
||||
file monitoring, this patch reloads its corresponding folder. In this way, the
|
||||
lack of file monitoring is partially compensated for.
|
||||
Please note that this doesn't work with `search://` because the files inside
|
||||
`search://` don't belong to it. By covering file creation, renaming, moving
|
||||
from one shared folder to another and deleting after trying to move into Trash.
|
||||
|
||||
Last-Update: 2019-06-08
|
||||
|
||||
--- libfm-qt-0.14.1.orig/src/core/folder.cpp
|
||||
+++ libfm-qt-0.14.1/src/core/folder.cpp
|
||||
@@ -112,6 +112,20 @@ std::shared_ptr<Folder> Folder::fromPath
|
||||
return folder;
|
||||
}
|
||||
|
||||
+// static
|
||||
+// Checks if this is the path of a folder in use.
|
||||
+std::shared_ptr<Folder> Folder::findByPath(const FilePath& path) {
|
||||
+ std::lock_guard<std::mutex> 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());
|
||||
--- libfm-qt-0.14.1.orig/src/core/folder.h
|
||||
+++ libfm-qt-0.14.1/src/core/folder.h
|
||||
@@ -56,6 +56,8 @@ public:
|
||||
|
||||
static std::shared_ptr<Folder> fromPath(const FilePath& path);
|
||||
|
||||
+ static std::shared_ptr<Folder> 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;
|
||||
--- libfm-qt-0.14.1.orig/src/fileoperation.cpp
|
||||
+++ libfm-qt-0.14.1/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<Fm::TrashJob*>(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();
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--- libfm-qt-0.14.1.orig/src/utilities.cpp
|
||||
+++ libfm-qt-0.14.1/src/utilities.cpp
|
||||
@@ -157,7 +157,8 @@ bool isCurrentPidClipboardData(const QMi
|
||||
}
|
||||
|
||||
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&
|
||||
}
|
||||
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) {
|
Loading…
Reference in new issue