From 2abf1c9ddbffce7a25bd9d700b29bb50dbb75282 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Sun, 13 Sep 2020 15:28:33 +0200 Subject: [PATCH] TerminalPanel: StatJob::mostLocalUrl only works with ":local" protocols StatJob::mostLocalUrl was changed to cancel the job automatically if the protocol Class isn't ":local", mostLocalUrl only makes sense with ioslaves that actually set UDS_LOCAL_PATH (which should have calss ":local"). I tested that kio-fuse still works, when having the terminal panel open and changing direcotries in Dolphin, with an sftp:// server. --- src/panels/terminal/terminalpanel.cpp | 39 ++++++++++++++++++--------- src/panels/terminal/terminalpanel.h | 2 +- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 131d166304..52ff494b2c 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -186,13 +187,21 @@ void TerminalPanel::changeDir(const QUrl& url) if (url.isLocalFile()) { sendCdToTerminal(url.toLocalFile()); - } else { + return; + } + + // Try stat'ing the url; note that mostLocalUrl only works with ":local" protocols + if (KProtocolInfo::protocolClass(url.scheme()) == QLatin1String(":local")) { m_mostLocalUrlJob = KIO::mostLocalUrl(url, KIO::HideProgressInfo); if (m_mostLocalUrlJob->uiDelegate()) { KJobWidgets::setWindow(m_mostLocalUrlJob, this); } connect(m_mostLocalUrlJob, &KIO::StatJob::result, this, &TerminalPanel::slotMostLocalUrlResult); + return; } + + // Last chance, try kio fuse + sendCdToTerminalKIOFuse(url); } void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHistory) @@ -230,6 +239,21 @@ void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHist } } +void TerminalPanel::sendCdToTerminalKIOFuse (const QUrl &url) { + // URL isn't local, only hope for the terminal to be in sync with the + // DolphinView is to mount the remote URL in KIOFuse and point to it. + // If we can't do that for any reason, silently fail. + auto reply = m_kiofuseInterface.mountUrl(url.toString()); + QDBusPendingCallWatcher * watcher = new QDBusPendingCallWatcher(reply, this); + QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] (QDBusPendingCallWatcher* watcher) { + watcher->deleteLater(); + if (!reply.isError()) { + // Successfully mounted, point to the KIOFuse equivalent path. + sendCdToTerminal(reply.value()); + } + }); +} + void TerminalPanel::slotMostLocalUrlResult(KJob* job) { KIO::StatJob* statJob = static_cast(job); @@ -237,18 +261,7 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job) if (url.isLocalFile()) { sendCdToTerminal(url.toLocalFile()); } else { - // URL isn't local, only hope for the terminal to be in sync with the - // DolphinView is to mount the remote URL in KIOFuse and point to it. - // If we can't do that for any reason, silently fail. - auto reply = m_kiofuseInterface.mountUrl(url.toString()); - QDBusPendingCallWatcher * watcher = new QDBusPendingCallWatcher(reply, this); - QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] (QDBusPendingCallWatcher* watcher) { - watcher->deleteLater(); - if (!reply.isError()) { - // Successfully mounted, point to the KIOFuse equivalent path. - sendCdToTerminal(reply.value()); - } - }); + sendCdToTerminalKIOFuse(url); } m_mostLocalUrlJob = nullptr; diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index 85f175da1f..82c2c3fc76 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -77,7 +77,7 @@ private: void changeDir(const QUrl& url); void sendCdToTerminal(const QString& path, HistoryPolicy addToHistory = HistoryPolicy::AddToHistory); - + void sendCdToTerminalKIOFuse (const QUrl &url); private: bool m_clearTerminal; KIO::StatJob* m_mostLocalUrlJob;