diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 1e5a33617d..f827503a2b 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -42,7 +42,8 @@ TerminalPanel::TerminalPanel(QWidget* parent) : m_terminal(0), m_terminalWidget(0), m_konsolePart(0), - m_konsolePartCurrentDirectory() + m_konsolePartCurrentDirectory(), + m_sendCdToTerminalHistory() { m_layout = new QVBoxLayout(this); m_layout->setMargin(0); @@ -161,7 +162,12 @@ void TerminalPanel::sendCdToTerminal(const QString& dir) } m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); - m_konsolePartCurrentDirectory = dir; + + // We want to ignore the currentDirectoryChanged(QString) signal, which we will receive after + // the directory change, because this directory change is not caused by a "cd" command that the + // user entered in the panel. Therefore, we have to remember 'dir'. Note that it could also be + // a symbolic link -> remember the 'canonical' path. + m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); if (m_clearTerminal) { m_terminal->sendInput(" clear\n"); @@ -182,16 +188,17 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job) void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) { - m_konsolePartCurrentDirectory = dir; + m_konsolePartCurrentDirectory = QDir(dir).canonicalPath(); - // Only change the view URL if 'dir' is different from the current view URL. - // Note that the current view URL could also be a symbolic link to 'dir' - // -> use QDir::canonicalPath() to check that. - const KUrl oldUrl(url()); - const KUrl newUrl(dir); - if (newUrl != oldUrl && dir != QDir(oldUrl.path()).canonicalPath()) { - emit changeUrl(newUrl); + // Only emit a changeUrl signal if the directory change was caused by the user inside the + // terminal, and not by sendCdToTerminal(QString). + while (!m_sendCdToTerminalHistory.empty()) { + if (m_konsolePartCurrentDirectory == m_sendCdToTerminalHistory.dequeue()) { + return; + } } + + emit changeUrl(dir); } #include "terminalpanel.moc" diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index 374476e1c0..b65239baf3 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -22,6 +22,8 @@ #include +#include + class TerminalInterfaceV2; class QVBoxLayout; class QWidget; @@ -82,6 +84,7 @@ private: QWidget* m_terminalWidget; KParts::ReadOnlyPart* m_konsolePart; QString m_konsolePartCurrentDirectory; + QQueue m_sendCdToTerminalHistory; }; #endif // TERMINALPANEL_H