X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c68f1f6f8d6c24123c9c5df4d2e91a9d2462ceb6..40cc5f665d:/src/panels/terminal/terminalpanel.cpp diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 75bfe93d0..22f840f5c 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -25,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -234,25 +232,17 @@ void TerminalPanel::changeDir(const QUrl& url) void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHistory) { - if (dir == m_konsolePartCurrentDirectory) { + if (dir == m_konsolePartCurrentDirectory // We are already there + && m_sendCdToTerminalHistory.isEmpty() // …and that is not because the terminal couldn't keep up + ) { m_clearTerminal = false; return; } -#ifndef Q_OS_WIN - 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 SIGINT is sent. - const int processId = m_terminal->terminalProcessId(); - if (processId > 0) { - kill(processId, SIGINT); - } - } -#endif - - m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); + // Send prior Ctrl-E, Ctrl-U to ensure the line is empty. This is + // mandatory, otherwise sending a 'cd x\n' to a prompt with 'rm -rf *' + // would result in data loss. + m_terminal->sendInput(QStringLiteral("\x05\x15")); // 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 @@ -261,6 +251,8 @@ void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHist if (addToHistory == HistoryPolicy::AddToHistory) m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); + m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); + if (m_clearTerminal) { m_terminal->sendInput(QStringLiteral(" clear\n")); m_clearTerminal = false;