diff options
| author | David Faure <[email protected]> | 2009-10-02 10:55:59 +0000 |
|---|---|---|
| committer | David Faure <[email protected]> | 2009-10-02 10:55:59 +0000 |
| commit | 6a20b9c96295fa73434ec83c7ae4fccbbd7e3fc5 (patch) | |
| tree | 870b5bf2b4d1bfea3af4b9642cb9a9d11b4b0306 | |
| parent | ebf4f3c82f344e40fdc6aa5445e60a0d02fac4f1 (diff) | |
Make "most local url" determination asynchronous so that it doesn't block the GUI for a long time
(e.g. when accessing the non-existing sftp://192.168.1.100/home)
and only run this job if the terminal panel is shown (or at the time when it is made visible).
Sorry kdebase users, you get to update kdelibs again.
BUG: 202176
svn path=/trunk/KDE/kdebase/apps/; revision=1030480
| -rw-r--r-- | src/panels/terminal/terminalpanel.cpp | 44 | ||||
| -rw-r--r-- | src/panels/terminal/terminalpanel.h | 7 |
2 files changed, 41 insertions, 10 deletions
diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 7dbedd17d..3b77cd92e 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -23,7 +23,8 @@ #include <kde_terminal_interface_v2.h> #include <kparts/part.h> #include <kshell.h> -#include <kio/netaccess.h> +#include <kio/job.h> +#include <KIO/JobUiDelegate> #include <QBoxLayout> #include <QShowEvent> @@ -58,15 +59,13 @@ void TerminalPanel::setUrl(const KUrl& url) } Panel::setUrl(url); - KUrl mostLocalUrl = KIO::NetAccess::mostLocalUrl(url, 0); + const bool sendInput = (m_terminal != 0) && (m_terminal->foregroundProcessId() == -1) - && isVisible() - && mostLocalUrl.isLocalFile(); + && isVisible(); if (sendInput) { - m_terminal->sendInput("cd " + KShell::quoteArg(mostLocalUrl.toLocalFile()) + '\n'); + cdUrl(url); } - } void TerminalPanel::terminalExited() @@ -90,16 +89,41 @@ void TerminalPanel::showEvent(QShowEvent* event) m_terminalWidget = part->widget(); m_layout->addWidget(m_terminalWidget); m_terminal = qobject_cast<TerminalInterfaceV2 *>(part); - } + } } if (m_terminal != 0) { - m_terminal->showShellInDir(url().path()); - m_terminal->sendInput("cd " + KShell::quoteArg(url().path()) + '\n'); - m_terminal->sendInput("clear\n"); + m_terminal->showShellInDir(url().toLocalFile()); + cdUrl(url()); + m_terminal->sendInput("clear\n"); // TODO do clear after slotMostLocalUrlResult is called, for remote dirs? m_terminalWidget->setFocus(); } Panel::showEvent(event); } +void TerminalPanel::cdUrl(const KUrl& url) +{ + if (url.isLocalFile()) { + cdDirectory(url.toLocalFile()); + } else { + KIO::StatJob* job = KIO::mostLocalUrl(url, KIO::HideProgressInfo); + job->ui()->setWindow(this); + connect(job, SIGNAL(result(KJob*)), this, SLOT(slotMostLocalUrlResult(KJob*))); + } +} + +void TerminalPanel::cdDirectory(const QString& dir) +{ + m_terminal->sendInput("cd " + KShell::quoteArg(dir) + '\n'); +} + +void TerminalPanel::slotMostLocalUrlResult(KJob* job) +{ + KIO::StatJob* statJob = static_cast<KIO::StatJob *>(job); + const KUrl url = statJob->mostLocalUrl(); + if (url.isLocalFile()) { + cdDirectory(url.toLocalFile()); + } +} + #include "terminalpanel.moc" diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index 4e060bbef..7b08483f6 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -53,6 +53,13 @@ protected: /** @see QWidget::showEvent() */ virtual void showEvent(QShowEvent* event); +private slots: + void slotMostLocalUrlResult(KJob* job); + +private: + void cdUrl(const KUrl& url); + void cdDirectory(const QString& path); + private: QVBoxLayout* m_layout; TerminalInterfaceV2* m_terminal; |
