summaryrefslogtreecommitdiff
path: root/x11-libs/libfm-qt
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2018-09-30 11:24:55 +0100
committerV3n3RiX <venerix@redcorelinux.org>2018-09-30 11:24:55 +0100
commita2450d727da202ad4355fd9f4b32eac773815919 (patch)
tree08b45510a102112709d8aa9cbd8f94633249206d /x11-libs/libfm-qt
parentdcad3cc2c5eb8601c4beafe8896f44b8630c96cb (diff)
x11-libs/libfm-qt : fix smb
Diffstat (limited to 'x11-libs/libfm-qt')
-rw-r--r--x11-libs/libfm-qt/files/libfm-qt-0.13.1-check-if-app-exists-before-opening.patch45
-rw-r--r--x11-libs/libfm-qt/files/libfm-qt-0.13.1-correctly-handle-mountable-types.patch80
-rw-r--r--x11-libs/libfm-qt/files/libfm-qt-0.13.1-fix-smb-error.patch279
-rw-r--r--x11-libs/libfm-qt/libfm-qt-0.13.1-r1.ebuild (renamed from x11-libs/libfm-qt/libfm-qt-0.13.1.ebuild)6
4 files changed, 410 insertions, 0 deletions
diff --git a/x11-libs/libfm-qt/files/libfm-qt-0.13.1-check-if-app-exists-before-opening.patch b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-check-if-app-exists-before-opening.patch
new file mode 100644
index 00000000..92b45be4
--- /dev/null
+++ b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-check-if-app-exists-before-opening.patch
@@ -0,0 +1,45 @@
+From 4923f860094787d14052e9dc416c9388ff1bb53b Mon Sep 17 00:00:00 2001
+From: Tsu Jan <tsujan2000@gmail.com>
+Date: Thu, 7 Jun 2018 06:10:37 +0430
+Subject: [PATCH] Check if the opening app exists before using it
+
+Also, show an error message if there's no app.
+---
+ src/core/basicfilelauncher.cpp | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/src/core/basicfilelauncher.cpp b/src/core/basicfilelauncher.cpp
+index 8390531..2c7f00e 100644
+--- a/src/core/basicfilelauncher.cpp
++++ b/src/core/basicfilelauncher.cpp
+@@ -256,18 +256,25 @@ FilePath BasicFileLauncher::handleShortcut(const FileInfoPtr& fileInfo, GAppLaun
+ || strcmp(scheme.get(), "trash") == 0
+ || strcmp(scheme.get(), "network") == 0
+ || strcmp(scheme.get(), "computer") == 0) {
+- return FilePath::fromUri(fileInfo->target().c_str());
++ return FilePath::fromUri(target.c_str());
+ }
+ else {
+ // ask gio to launch the default handler for the uri scheme
+- GAppInfoPtr app{g_app_info_get_default_for_uri_scheme(scheme.get()), false};
+- FilePathList uris{FilePath::fromUri(fileInfo->target().c_str())};
+- launchWithApp(app.get(), uris, ctx);
++ if(GAppInfoPtr app{g_app_info_get_default_for_uri_scheme(scheme.get()), false}) {
++ FilePathList uris{FilePath::fromUri(target.c_str())};
++ launchWithApp(app.get(), uris, ctx);
++ }
++ else {
++ GErrorPtr err{G_IO_ERROR, G_IO_ERROR_FAILED,
++ QObject::tr("No default application is set to launch '%1'")
++ .arg(target.c_str())};
++ showError(nullptr, err);
++ }
+ }
+ }
+ else {
+ // see it as a local path
+- return FilePath::fromLocalPath(fileInfo->target().c_str());
++ return FilePath::fromLocalPath(target.c_str());
+ }
+ return FilePath();
+ }
diff --git a/x11-libs/libfm-qt/files/libfm-qt-0.13.1-correctly-handle-mountable-types.patch b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-correctly-handle-mountable-types.patch
new file mode 100644
index 00000000..adaed387
--- /dev/null
+++ b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-correctly-handle-mountable-types.patch
@@ -0,0 +1,80 @@
+From dc7a5753b934e323d4d8d13f3253cbe7ae55a111 Mon Sep 17 00:00:00 2001
+From: "Hong Jen Yee (PCMan)" <pcman.tw@gmail.com>
+Date: Sun, 10 Jun 2018 00:07:31 +0800
+Subject: [PATCH] Correctly handle mountable types.
+
+---
+ src/core/basicfilelauncher.cpp | 6 +++---
+ src/core/fileinfo.cpp | 4 ++--
+ src/core/fileinfo.h | 3 ++-
+ 3 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/src/core/basicfilelauncher.cpp b/src/core/basicfilelauncher.cpp
+index 0dc8208..0ae1177 100644
+--- a/src/core/basicfilelauncher.cpp
++++ b/src/core/basicfilelauncher.cpp
+@@ -30,11 +30,10 @@ bool BasicFileLauncher::launchFiles(const FileInfoList& fileInfos, GAppLaunchCon
+ // classify files according to different mimetypes
+ for(auto& fileInfo : fileInfos) {
+ /*
+- qDebug("path: %s, type: %s, target: %s, isDir: %i, isDesktopEntry: %i",
++ qDebug("path: %s, type: %s, target: %s, isDir: %i, isShortcut: %i, isMountable: %i, isDesktopEntry: %i",
+ fileInfo->path().toString().get(), fileInfo->mimeType()->name(), fileInfo->target().c_str(),
+- fileInfo->isDir(), fileInfo->isDesktopEntry());
++ fileInfo->isDir(), fileInfo->isShortcut(), fileInfo->isMountable(), fileInfo->isDesktopEntry());
+ */
+-
+ if(fileInfo->isMountable()) {
+ if(fileInfo->target().empty()) {
+ // the mountable is not yet mounted so we have no target URI.
+@@ -269,6 +268,7 @@ FilePath BasicFileLauncher::handleShortcut(const FileInfoPtr& fileInfo, GAppLaun
+ // if we know the target is a dir, we are not going to open it using other apps
+ // for example: `network:///smb-root' is a shortcut targeting `smb:///' and it's also a dir
+ if(fileInfo->isDir()) {
++ qDebug("shortcut is dir: %s", target.c_str());
+ return FilePath::fromPathStr(target.c_str());
+ }
+
+diff --git a/src/core/fileinfo.cpp b/src/core/fileinfo.cpp
+index b19a751..5838fe5 100644
+--- a/src/core/fileinfo.cpp
++++ b/src/core/fileinfo.cpp
+@@ -118,7 +118,8 @@ void FileInfo::setFromGFileInfo(const GObjectPtr<GFileInfo>& inf, const FilePath
+ isDeletable_ = true;
+ }
+
+- isShortcut_ = false;
++ isShortcut_ = (type == G_FILE_TYPE_SHORTCUT);
++ isMountable_ = (type == G_FILE_TYPE_MOUNTABLE);
+
+ /* special handling for symlinks */
+ if(g_file_info_get_is_symlink(inf.get())) {
+@@ -129,7 +130,6 @@ void FileInfo::setFromGFileInfo(const GObjectPtr<GFileInfo>& inf, const FilePath
+
+ switch(type) {
+ case G_FILE_TYPE_SHORTCUT:
+- isShortcut_ = true;
+ /* Falls through. */
+ case G_FILE_TYPE_MOUNTABLE:
+ uri = g_file_info_get_attribute_string(inf.get(), G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
+diff --git a/src/core/fileinfo.h b/src/core/fileinfo.h
+index 8437d92..27f7508 100644
+--- a/src/core/fileinfo.h
++++ b/src/core/fileinfo.h
+@@ -150,7 +150,7 @@ class LIBFM_QT_API FileInfo {
+ }
+
+ bool isMountable() const {
+- return mimeType_->isMountable();
++ return isMountable_;
+ }
+
+ bool isShortcut() const {
+@@ -238,6 +238,7 @@ class LIBFM_QT_API FileInfo {
+ std::string target_; /* target of shortcut or mountable. */
+
+ bool isShortcut_ : 1; /* TRUE if file is shortcut type */
++ bool isMountable_ : 1; /* TRUE if file is mountable type */
+ bool isAccessible_ : 1; /* TRUE if can be read by user */
+ bool isWritable_ : 1; /* TRUE if can be written to by user */
+ bool isDeletable_ : 1; /* TRUE if can be deleted by user */
diff --git a/x11-libs/libfm-qt/files/libfm-qt-0.13.1-fix-smb-error.patch b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-fix-smb-error.patch
new file mode 100644
index 00000000..12611650
--- /dev/null
+++ b/x11-libs/libfm-qt/files/libfm-qt-0.13.1-fix-smb-error.patch
@@ -0,0 +1,279 @@
+From 1a6fa2632388ffcc57ce723501a588c90b940f93 Mon Sep 17 00:00:00 2001
+From: "Hong Jen Yee (PCMan)" <pcman.tw@gmail.com>
+Date: Sat, 9 Jun 2018 21:04:19 +0800
+Subject: [PATCH] Fix failure to open smb:// caused by incorrect file info
+ handling.
+
+---
+ src/core/basicfilelauncher.cpp | 40 ++++++++++++++++++++++++-------
+ src/core/basicfilelauncher.h | 2 +-
+ src/core/fileinfo.cpp | 9 ++++---
+ src/core/fileinfojob.cpp | 44 +++++++++++++++++++++-------------
+ src/core/fileinfojob.h | 5 ++++
+ src/core/gioptrs.h | 4 ++++
+ src/filelauncher.cpp | 2 +-
+ src/filelauncher.h | 2 +-
+ 8 files changed, 77 insertions(+), 31 deletions(-)
+
+diff --git a/src/core/basicfilelauncher.cpp b/src/core/basicfilelauncher.cpp
+index 2c7f00e..0dc8208 100644
+--- a/src/core/basicfilelauncher.cpp
++++ b/src/core/basicfilelauncher.cpp
+@@ -29,11 +29,13 @@ bool BasicFileLauncher::launchFiles(const FileInfoList& fileInfos, GAppLaunchCon
+ FilePathList pathsToLaunch;
+ // classify files according to different mimetypes
+ for(auto& fileInfo : fileInfos) {
+- // qDebug("path: %s, target: %s", fileInfo->path().toString().get(), fileInfo->target().c_str());
+- if(fileInfo->isDir()) {
+- folderInfos.emplace_back(fileInfo);
+- }
+- else if(fileInfo->isMountable()) {
++ /*
++ qDebug("path: %s, type: %s, target: %s, isDir: %i, isDesktopEntry: %i",
++ fileInfo->path().toString().get(), fileInfo->mimeType()->name(), fileInfo->target().c_str(),
++ fileInfo->isDir(), fileInfo->isDesktopEntry());
++ */
++
++ if(fileInfo->isMountable()) {
+ if(fileInfo->target().empty()) {
+ // the mountable is not yet mounted so we have no target URI.
+ GErrorPtr err{G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED,
+@@ -67,6 +69,9 @@ bool BasicFileLauncher::launchFiles(const FileInfoList& fileInfos, GAppLaunchCon
+ pathsToLaunch.emplace_back(path);
+ }
+ }
++ else if(fileInfo->isDir()) {
++ folderInfos.emplace_back(fileInfo);
++ }
+ else {
+ auto& mimeType = fileInfo->mimeType();
+ mimeTypeToFiles[mimeType->name()].emplace_back(fileInfo);
+@@ -103,16 +108,27 @@ bool BasicFileLauncher::launchFiles(const FileInfoList& fileInfos, GAppLaunchCon
+ bool BasicFileLauncher::launchPaths(FilePathList paths, GAppLaunchContext* ctx) {
+ // FIXME: blocking with an event loop is not a good design :-(
+ QEventLoop eventLoop;
+-
+ auto job = new FileInfoJob{paths};
+ job->setAutoDelete(false); // do not automatically delete the job since we want its results later.
+
+ GObjectPtr<GAppLaunchContext> ctxPtr{ctx};
++
++ // error handling (for example: handle path not mounted error)
++ QObject::connect(job, &FileInfoJob::error,
++ &eventLoop, [this, job, ctx](const GErrorPtr & err, Job::ErrorSeverity /* severity */ , Job::ErrorAction &act) {
++ auto path = job->currentPath();
++ if(showError(ctx, err, path, nullptr)) {
++ // the user handled the error and ask for retry
++ act = Job::ErrorAction::RETRY;
++ }
++ }, Qt::BlockingQueuedConnection); // BlockingQueuedConnection is required here to pause the job and wait for user response
++
+ QObject::connect(job, &FileInfoJob::finished,
+ [&eventLoop]() {
+ // exit the event loop when the job is done
+ eventLoop.exit();
+ });
++
+ // run the job in another thread to not block the UI
+ job->runAsync();
+
+@@ -145,7 +161,7 @@ BasicFileLauncher::ExecAction BasicFileLauncher::askExecFile(const FileInfoPtr &
+ return ExecAction::DIRECT_EXEC;
+ }
+
+-bool BasicFileLauncher::showError(GAppLaunchContext* /* ctx */, GErrorPtr& /* err */, const FilePath& /* path */, const FileInfoPtr& /* info */) {
++bool BasicFileLauncher::showError(GAppLaunchContext* /* ctx */, const GErrorPtr & /* err */, const FilePath& /* path */, const FileInfoPtr& /* info */) {
+ return false;
+ }
+
+@@ -249,13 +265,21 @@ bool BasicFileLauncher::launchDesktopEntry(const char *desktopEntryName, const F
+
+ FilePath BasicFileLauncher::handleShortcut(const FileInfoPtr& fileInfo, GAppLaunchContext* ctx) {
+ auto target = fileInfo->target();
++
++ // if we know the target is a dir, we are not going to open it using other apps
++ // for example: `network:///smb-root' is a shortcut targeting `smb:///' and it's also a dir
++ if(fileInfo->isDir()) {
++ return FilePath::fromPathStr(target.c_str());
++ }
++
+ auto scheme = CStrPtr{g_uri_parse_scheme(target.c_str())};
+ if(scheme) {
+ // collect the uri schemes we support
+ if(strcmp(scheme.get(), "file") == 0
+ || strcmp(scheme.get(), "trash") == 0
+ || strcmp(scheme.get(), "network") == 0
+- || strcmp(scheme.get(), "computer") == 0) {
++ || strcmp(scheme.get(), "computer") == 0
++ || strcmp(scheme.get(), "menu") == 0) {
+ return FilePath::fromUri(target.c_str());
+ }
+ else {
+diff --git a/src/core/basicfilelauncher.h b/src/core/basicfilelauncher.h
+index a28aa75..3b1545d 100644
+--- a/src/core/basicfilelauncher.h
++++ b/src/core/basicfilelauncher.h
+@@ -53,7 +53,7 @@ class LIBFM_QT_API BasicFileLauncher {
+
+ virtual bool openFolder(GAppLaunchContext* ctx, const FileInfoList& folderInfos, GErrorPtr& err);
+
+- virtual bool showError(GAppLaunchContext* ctx, GErrorPtr& err, const FilePath& path = FilePath{}, const FileInfoPtr& info = FileInfoPtr{});
++ virtual bool showError(GAppLaunchContext* ctx, const GErrorPtr& err, const FilePath& path = FilePath{}, const FileInfoPtr& info = FileInfoPtr{});
+
+ virtual ExecAction askExecFile(const FileInfoPtr& file);
+
+diff --git a/src/core/fileinfo.cpp b/src/core/fileinfo.cpp
+index 8e86f8d..b19a751 100644
+--- a/src/core/fileinfo.cpp
++++ b/src/core/fileinfo.cpp
+@@ -36,10 +36,9 @@ void FileInfo::setFromGFileInfo(const GObjectPtr<GFileInfo>& inf, const FilePath
+ size_ = g_file_info_get_size(inf.get());
+
+ tmp = g_file_info_get_content_type(inf.get());
+- if(!tmp) {
+- tmp = "application/octet-stream";
++ if(tmp) {
++ mimeType_ = MimeType::fromName(tmp);
+ }
+- mimeType_ = MimeType::fromName(tmp);
+
+ mode_ = g_file_info_get_attribute_uint32(inf.get(), G_FILE_ATTRIBUTE_UNIX_MODE);
+
+@@ -196,6 +195,10 @@ void FileInfo::setFromGFileInfo(const GObjectPtr<GFileInfo>& inf, const FilePath
+ }
+ }
+
++ if(!mimeType_) {
++ mimeType_ = MimeType::fromName("application/octet-stream");
++ }
++
+ /* if there is a custom folder icon, use it */
+ if(isNative() && type == G_FILE_TYPE_DIRECTORY) {
+ auto local_path = path().localPath();
+diff --git a/src/core/fileinfojob.cpp b/src/core/fileinfojob.cpp
+index 3c222af..7bf8bb3 100644
+--- a/src/core/fileinfojob.cpp
++++ b/src/core/fileinfojob.cpp
+@@ -13,31 +13,41 @@ FileInfoJob::FileInfoJob(FilePathList paths, FilePathList deletionPaths, FilePat
+
+ void FileInfoJob::exec() {
+ for(const auto& path: paths_) {
+- if(!isCancelled()) {
++ if(isCancelled()) {
++ break;
++ }
++ currentPath_ = path;
++
++ bool retry;
++ do {
++ retry = false;
+ GErrorPtr err;
+ GFileInfoPtr inf{
+ g_file_query_info(path.gfile().get(), defaultGFileInfoQueryAttribs,
+ G_FILE_QUERY_INFO_NONE, cancellable().get(), &err),
+ false
+ };
+- if(!inf) {
+- continue;
++ if(inf) {
++ // Reuse the same dirPath object when the path remains the same (optimize for files in the same dir)
++ auto dirPath = commonDirPath_.isValid() ? commonDirPath_ : path.parent();
++ auto fileInfoPtr = std::make_shared<FileInfo>(inf, dirPath);
++
++ // FIXME: this is not elegant
++ if(cutFilesHashSet_
++ && cutFilesHashSet_->count(path.hash())) {
++ fileInfoPtr->bindCutFiles(cutFilesHashSet_);
++ }
++
++ results_.push_back(fileInfoPtr);
++ Q_EMIT gotInfo(path, results_.back());
+ }
+-
+- // Reuse the same dirPath object when the path remains the same (optimize for files in the same dir)
+- auto dirPath = commonDirPath_.isValid() ? commonDirPath_ : path.parent();
+- FileInfo fileInfo(inf, dirPath);
+-
+- if(cutFilesHashSet_
+- && cutFilesHashSet_->count(fileInfo.path().hash())) {
+- fileInfo.bindCutFiles(cutFilesHashSet_);
++ else {
++ auto act = emitError(err);
++ if(act == Job::ErrorAction::RETRY) {
++ retry = true;
++ }
+ }
+-
+- auto fileInfoPtr = std::make_shared<const FileInfo>(fileInfo);
+-
+- results_.push_back(fileInfoPtr);
+- Q_EMIT gotInfo(path, fileInfoPtr);
+- }
++ } while(retry && !isCancelled());
+ }
+ }
+
+diff --git a/src/core/fileinfojob.h b/src/core/fileinfojob.h
+index 53a03c5..d75e88f 100644
+--- a/src/core/fileinfojob.h
++++ b/src/core/fileinfojob.h
+@@ -27,6 +27,10 @@ class LIBFM_QT_API FileInfoJob : public Job {
+ return results_;
+ }
+
++ const FilePath& currentPath() const {
++ return currentPath_;
++ }
++
+ Q_SIGNALS:
+ void gotInfo(const FilePath& path, std::shared_ptr<const FileInfo>& info);
+
+@@ -39,6 +43,7 @@ class LIBFM_QT_API FileInfoJob : public Job {
+ FileInfoList results_;
+ FilePath commonDirPath_;
+ const std::shared_ptr<const HashSet> cutFilesHashSet_;
++ FilePath currentPath_;
+ };
+
+ } // namespace Fm
+diff --git a/src/core/gioptrs.h b/src/core/gioptrs.h
+index 401424b..ae22602 100644
+--- a/src/core/gioptrs.h
++++ b/src/core/gioptrs.h
+@@ -112,6 +112,10 @@ class GErrorPtr {
+ return err_;
+ }
+
++ const GError* operator->() const {
++ return err_;
++ }
++
+ bool operator == (const GErrorPtr& other) const {
+ return err_ == other.err_;
+ }
+diff --git a/src/filelauncher.cpp b/src/filelauncher.cpp
+index 5f667fc..ff14533 100644
+--- a/src/filelauncher.cpp
++++ b/src/filelauncher.cpp
+@@ -76,7 +76,7 @@ bool FileLauncher::openFolder(GAppLaunchContext *ctx, const FileInfoList &folder
+ return BasicFileLauncher::openFolder(ctx, folderInfos, err);
+ }
+
+-bool FileLauncher::showError(GAppLaunchContext* /*ctx*/, GErrorPtr &err, const FilePath &path, const FileInfoPtr &info) {
++bool FileLauncher::showError(GAppLaunchContext* /*ctx*/, const GErrorPtr &err, const FilePath &path, const FileInfoPtr &info) {
+ /* ask for mount if trying to launch unmounted path */
+ if(err->domain == G_IO_ERROR) {
+ if(path && err->code == G_IO_ERROR_NOT_MOUNTED) {
+diff --git a/src/filelauncher.h b/src/filelauncher.h
+index be5be5a..991a00a 100644
+--- a/src/filelauncher.h
++++ b/src/filelauncher.h
+@@ -43,7 +43,7 @@ class LIBFM_QT_API FileLauncher: public BasicFileLauncher {
+
+ bool openFolder(GAppLaunchContext* ctx, const FileInfoList& folderInfos, GErrorPtr& err) override;
+
+- bool showError(GAppLaunchContext* ctx, GErrorPtr& err, const FilePath& path = FilePath{}, const FileInfoPtr& info = FileInfoPtr{}) override;
++ bool showError(GAppLaunchContext* ctx, const GErrorPtr &err, const FilePath& path = FilePath{}, const FileInfoPtr& info = FileInfoPtr{}) override;
+
+ ExecAction askExecFile(const FileInfoPtr& file) override;
+
diff --git a/x11-libs/libfm-qt/libfm-qt-0.13.1.ebuild b/x11-libs/libfm-qt/libfm-qt-0.13.1-r1.ebuild
index cc6ed5d1..67a7b721 100644
--- a/x11-libs/libfm-qt/libfm-qt-0.13.1.ebuild
+++ b/x11-libs/libfm-qt/libfm-qt-0.13.1-r1.ebuild
@@ -14,6 +14,12 @@ HOMEPAGE="http://lxqt.org/"
LICENSE="LGPL-2.1+"
SLOT="0/5.0.0"
+PATCHES=(
+ "${FILESDIR}/${P}-check-if-app-exists-before-opening.patch"
+ "${FILESDIR}/${P}-fix-smb-error.patch"
+ "${FILESDIR}/${P}-correctly-handle-mountable-types.patch"
+)
+
RDEPEND="
dev-libs/glib:2
dev-qt/qtcore:5