X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f37ecd6ecfab9bc1d2929504b4f6e4363f8137b9..fd74aa8e2057158d2eadb835eb61564854c81020:/src/panels/terminal/terminalpanel.cpp diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index cc3b85318..6ff16e766 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Peter Penz * + * Copyright (C) 2007-2010 by Peter Penz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -19,16 +19,21 @@ #include "terminalpanel.h" -#include -#include +#include +#include +#include #include -#include +#include +#include +#include #include #include TerminalPanel::TerminalPanel(QWidget* parent) : Panel(parent), + m_clearTerminal(true), + m_mostLocalUrlJob(0), m_layout(0), m_terminal(0), m_terminalWidget(0) @@ -41,29 +46,26 @@ TerminalPanel::~TerminalPanel() { } -QSize TerminalPanel::sizeHint() const +void TerminalPanel::terminalExited() { - QSize size = Panel::sizeHint(); - size.setHeight(200); - return size; + emit hideTerminalPanel(); + m_terminal = 0; } -void TerminalPanel::setUrl(const KUrl& url) +bool TerminalPanel::urlChanged() { - if (!url.isValid() || (url == Panel::url())) { - return; + if (!url().isValid()) { + return false; } - Panel::setUrl(url); - if ((m_terminal != 0) && isVisible() && url.isLocalFile()) { - m_terminal->sendInput("cd " + KShell::quoteArg(url.path()) + '\n'); + const bool sendInput = (m_terminal != 0) + && (m_terminal->foregroundProcessId() == -1) + && isVisible(); + if (sendInput) { + changeDir(url()); } -} -void TerminalPanel::terminalExited() -{ - emit hideTerminalPanel(); - m_terminal = 0; + return true; } void TerminalPanel::showEvent(QShowEvent* event) @@ -74,23 +76,69 @@ void TerminalPanel::showEvent(QShowEvent* event) } if (m_terminal == 0) { + m_clearTerminal = true; KPluginFactory* factory = KPluginLoader("libkonsolepart").factory(); KParts::ReadOnlyPart* part = factory ? (factory->create(this)) : 0; if (part != 0) { connect(part, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited())); m_terminalWidget = part->widget(); m_layout->addWidget(m_terminalWidget); - m_terminal = qobject_cast(part); - m_terminal->showShellInDir(url().path()); + m_terminal = qobject_cast(part); } } if (m_terminal != 0) { - m_terminal->sendInput("cd " + KShell::quoteArg(url().path()) + '\n'); - m_terminal->sendInput("clear\n"); + m_terminal->showShellInDir(url().toLocalFile()); + changeDir(url()); m_terminalWidget->setFocus(); } Panel::showEvent(event); } +void TerminalPanel::changeDir(const KUrl& url) +{ + delete m_mostLocalUrlJob; + m_mostLocalUrlJob = 0; + + if (url.isLocalFile()) { + sendCdToTerminal(url.toLocalFile()); + } else { + m_mostLocalUrlJob = KIO::mostLocalUrl(url, KIO::HideProgressInfo); + m_mostLocalUrlJob->ui()->setWindow(this); + connect(m_mostLocalUrlJob, SIGNAL(result(KJob*)), this, SLOT(slotMostLocalUrlResult(KJob*))); + } +} + +void TerminalPanel::sendCdToTerminal(const QString& dir) +{ + if (!m_clearTerminal) { + // The TerminalV2 interface does not provide a way to delete the + // current line before sending a new input. This is mandatory, + // otherwise sending a 'cd x' to a existing 'rm -rf *' might + // result in data loss. As workaround Ctrl+C is send. + QString cancel; + cancel.append(QChar(3)); + cancel.append(QChar('c')); + m_terminal->sendInput(cancel); + } + + m_terminal->sendInput("cd " + KShell::quoteArg(dir) + '\n'); + + if (m_clearTerminal) { + m_terminal->sendInput("clear\n"); + m_clearTerminal = false; + } +} + +void TerminalPanel::slotMostLocalUrlResult(KJob* job) +{ + KIO::StatJob* statJob = static_cast(job); + const KUrl url = statJob->mostLocalUrl(); + if (url.isLocalFile()) { + sendCdToTerminal(url.toLocalFile()); + } + + m_mostLocalUrlJob = 0; +} + #include "terminalpanel.moc"