┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2012-04-26 08:31:46 +0200
committerFrank Reininghaus <[email protected]>2012-04-26 08:31:59 +0200
commit12c239ae149cfed254066248f411b114743f5836 (patch)
treef6b27cede4b07376bcfaa71d48c7881326583881 /src/panels
parent640696db728ad3163384e19f789ebc022d183da6 (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.cpp40
-rw-r--r--src/panels/terminal/terminalpanel.h12
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