From 6a20b9c96295fa73434ec83c7ae4fccbbd7e3fc5 Mon Sep 17 00:00:00 2001 From: David Faure Date: Fri, 2 Oct 2009 10:55:59 +0000 Subject: [PATCH] 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 --- src/panels/terminal/terminalpanel.cpp | 44 +++++++++++++++++++++------ 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 #include #include -#include +#include +#include #include #include @@ -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(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(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; -- 2.47.3