diff options
| author | Frank Reininghaus <[email protected]> | 2014-10-24 18:13:47 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2014-10-24 18:14:08 +0200 |
| commit | d9700c4d432ba5ae034bb76635984800373ade33 (patch) | |
| tree | 32fe0b743b7a5debc12cb61fde5880a42667125c /src | |
| parent | 592e1730e268c680d1d7d7a7fca234b33775dc99 (diff) | |
Make the view/Terminal Panel synchronization less error-prone
The previous solution could cause problems if the user navigates to a
different URL in one view, and then activates another split view very
quickly: the new active view might be switched to the same URL as the
first view, which is unwanted.
To fix this problem, we record a history of "cd" commands that Dolphin
sends to the Terminal Panel in a queue. If a currentDirectoryChanged
signal is received, and the new terminal directory is "dir", this patch
does the following:
1. If the queue is empty, change the view URL to "dir".
2. Otherwise, take the queue's head, and check if it is equal to
"dir". If that is the case, ignore the signal and return.
3. Go back to step 1.
This ensures that every currentDirectoryChange signal that is caused by
a "cd" that was sent from Dolphin to the terminal is ignored.
BUG: 339009
BUG: 314038
REVIEW: 120768
Diffstat (limited to 'src')
| -rw-r--r-- | src/panels/terminal/terminalpanel.cpp | 27 | ||||
| -rw-r--r-- | src/panels/terminal/terminalpanel.h | 3 |
2 files changed, 20 insertions, 10 deletions
diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 1e5a33617..f827503a2 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 374476e1c..b65239baf 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -22,6 +22,8 @@ #include <panels/panel.h> +#include <QQueue> + class TerminalInterfaceV2; class QVBoxLayout; class QWidget; @@ -82,6 +84,7 @@ private: QWidget* m_terminalWidget; KParts::ReadOnlyPart* m_konsolePart; QString m_konsolePartCurrentDirectory; + QQueue<QString> m_sendCdToTerminalHistory; }; #endif // TERMINALPANEL_H |
