diff options
| author | Frank Reininghaus <[email protected]> | 2012-04-26 08:31:46 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2012-04-26 08:31:59 +0200 |
| commit | 12c239ae149cfed254066248f411b114743f5836 (patch) | |
| tree | f6b27cede4b07376bcfaa71d48c7881326583881 /src/panels | |
| parent | 640696db728ad3163384e19f789ebc022d183da6 (diff) | |
Update the view when changing the directory using 'cd' in the terminal
Thanks to Jekyll Wu for helping to implement this feature!
FEATURE: 156732
FIXED-IN: 4.9.0
Diffstat (limited to 'src/panels')
| -rw-r--r-- | src/panels/terminal/terminalpanel.cpp | 40 | ||||
| -rw-r--r-- | src/panels/terminal/terminalpanel.h | 12 |
2 files changed, 46 insertions, 6 deletions
diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 51df81806..5fa0a0762 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -38,7 +38,9 @@ TerminalPanel::TerminalPanel(QWidget* parent) : m_mostLocalUrlJob(0), m_layout(0), m_terminal(0), - m_terminalWidget(0) + m_terminalWidget(0), + m_konsolePart(0), + m_konsolePartCurrentDirectory() { m_layout = new QVBoxLayout(this); m_layout->setMargin(0); @@ -60,8 +62,18 @@ void TerminalPanel::dockVisibilityChanged() // respond when e.g. Dolphin is minimized. if (parentWidget() && parentWidget()->isHidden() && m_terminal && (m_terminal->foregroundProcessId() == -1)) { + // Make sure that the following "cd /" command will not affect the view. + disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), + this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString))); + // Make sure this terminal does not prevent unmounting any removable drives changeDir(KUrl::fromPath("/")); + + // Because we have disconnected from the part's currentDirectoryChanged() + // signal, we have to update m_konsolePartCurrentDirectory manually. If this + // was not done, showing the panel again might not set the part's working + // directory correctly. + m_konsolePartCurrentDirectory = "/"; } } @@ -89,15 +101,17 @@ void TerminalPanel::showEvent(QShowEvent* event) if (!m_terminal) { m_clearTerminal = true; KPluginFactory* factory = KPluginLoader("libkonsolepart").factory(); - KParts::ReadOnlyPart* part = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : 0; - if (part) { - connect(part, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited())); - m_terminalWidget = part->widget(); + m_konsolePart = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : 0; + if (m_konsolePart) { + connect(m_konsolePart, SIGNAL(destroyed(QObject*)), this, SLOT(terminalExited())); + m_terminalWidget = m_konsolePart->widget(); m_layout->addWidget(m_terminalWidget); - m_terminal = qobject_cast<TerminalInterfaceV2 *>(part); + m_terminal = qobject_cast<TerminalInterfaceV2 *>(m_konsolePart); } } if (m_terminal) { + connect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), + this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString))); m_terminal->showShellInDir(url().toLocalFile()); changeDir(url()); m_terminalWidget->setFocus(); @@ -124,6 +138,10 @@ void TerminalPanel::changeDir(const KUrl& url) void TerminalPanel::sendCdToTerminal(const QString& dir) { + if (dir == m_konsolePartCurrentDirectory) { + return; + } + if (!m_clearTerminal) { // The TerminalV2 interface does not provide a way to delete the // current line before sending a new input. This is mandatory, @@ -154,4 +172,14 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job) m_mostLocalUrlJob = 0; } +void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) +{ + m_konsolePartCurrentDirectory = dir; + + const KUrl newUrl(dir); + if (newUrl != url()) { + emit changeUrl(newUrl); + } +} + #include "terminalpanel.moc" diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index cc27212e8..374476e1c 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -30,6 +30,10 @@ namespace KIO { class StatJob; } +namespace KParts { + class ReadOnlyPart; +} + /** * @brief Shows the terminal which is synchronized with the URL of the * active view. @@ -49,6 +53,11 @@ public slots: signals: void hideTerminalPanel(); + /** + * Is emitted if the an URL change is requested. + */ + void changeUrl(const KUrl& url); + protected: /** @see Panel::urlChanged() */ virtual bool urlChanged(); @@ -58,6 +67,7 @@ protected: private slots: void slotMostLocalUrlResult(KJob* job); + void slotKonsolePartCurrentDirectoryChanged(const QString& dir); private: void changeDir(const KUrl& url); @@ -70,6 +80,8 @@ private: QVBoxLayout* m_layout; TerminalInterfaceV2* m_terminal; QWidget* m_terminalWidget; + KParts::ReadOnlyPart* m_konsolePart; + QString m_konsolePartCurrentDirectory; }; #endif // TERMINALPANEL_H |
