┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/terminal
diff options
context:
space:
mode:
authorDavid Faure <[email protected]>2009-10-02 10:55:59 +0000
committerDavid Faure <[email protected]>2009-10-02 10:55:59 +0000
commit6a20b9c96295fa73434ec83c7ae4fccbbd7e3fc5 (patch)
tree870b5bf2b4d1bfea3af4b9642cb9a9d11b4b0306 /src/panels/terminal
parentebf4f3c82f344e40fdc6aa5445e60a0d02fac4f1 (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
Diffstat (limited to 'src/panels/terminal')
-rw-r--r--src/panels/terminal/terminalpanel.cpp44
-rw-r--r--src/panels/terminal/terminalpanel.h7
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;