diff --git a/app/session.h b/app/session.h --- a/app/session.h +++ b/app/session.h @@ -41,7 +41,7 @@ enum SessionType { Single, TwoHorizontal, TwoVertical, Quad }; enum GrowthDirection { Up, Right, Down, Left }; - explicit Session(SessionType type = Single, QWidget* parent = 0); + explicit Session(const QString& workingDir, SessionType type = Single, QWidget* parent = 0); ~Session(); int id() { return m_sessionId; } @@ -120,9 +120,10 @@ private: void setupSession(SessionType type); - Terminal* addTerminal(QWidget* parent); + Terminal* addTerminal(QWidget* parent, QString workingDir = QString()); int split(Terminal* terminal, Qt::Orientation orientation); + QString m_workingDir; static int m_availableSessionId; int m_sessionId; diff --git a/app/session.cpp b/app/session.cpp --- a/app/session.cpp +++ b/app/session.cpp @@ -26,8 +26,9 @@ int Session::m_availableSessionId = 0; -Session::Session(SessionType type, QWidget* parent) : QObject(parent) +Session::Session(const QString& workingDir, SessionType type, QWidget* parent) : QObject(parent) { + m_workingDir = workingDir; m_sessionId = m_availableSessionId; m_availableSessionId++; @@ -154,9 +155,14 @@ } } -Terminal* Session::addTerminal(QWidget* parent) +Terminal* Session::addTerminal(QWidget* parent, QString workingDir) { - Terminal* terminal = new Terminal(parent); + if (workingDir.isEmpty()) { + // fallback to session's default working dir + workingDir = m_workingDir; + } + + Terminal* terminal = new Terminal(workingDir, parent); connect(terminal, SIGNAL(activated(int)), this, SLOT(setActiveTerminal(int))); connect(terminal, SIGNAL(manuallyActivated(Terminal*)), this, SIGNAL(terminalManuallyActivated(Terminal*))); connect(terminal, SIGNAL(titleChanged(int,QString)), this, SLOT(setTitle(int,QString))); @@ -284,7 +290,7 @@ if (splitter->orientation() != orientation) splitter->setOrientation(orientation); - terminal = addTerminal(splitter); + terminal = addTerminal(splitter, terminal->currentWorkingDirectory()); QList newSplitterSizes; newSplitterSizes << (splitterWidth / 2) << (splitterWidth / 2); @@ -310,7 +316,7 @@ terminal->setSplitter(newSplitter); - terminal = addTerminal(newSplitter); + terminal = addTerminal(newSplitter, terminal->currentWorkingDirectory()); splitter->setSizes(splitterSizes); QList newSplitterSizes; diff --git a/app/sessionstack.cpp b/app/sessionstack.cpp --- a/app/sessionstack.cpp +++ b/app/sessionstack.cpp @@ -51,7 +51,11 @@ int SessionStack::addSessionImpl(Session::SessionType type) { - Session* session = new Session(type, this); + Session* currentSession = m_sessions.value(activeSessionId()); + Terminal* currentTerminal = currentSession ? currentSession->getTerminal(currentSession->activeTerminalId()) : NULL; + QString workingDir = currentTerminal ? currentTerminal->currentWorkingDirectory() : QString(); + + Session* session = new Session(workingDir, type, this); connect(session, SIGNAL(titleChanged(int,QString)), this, SIGNAL(titleChanged(int,QString))); connect(session, SIGNAL(terminalManuallyActivated(Terminal*)), this, SLOT(handleManualTerminalActivation(Terminal*))); connect(session, SIGNAL(keyboardInputBlocked(Terminal*)), m_visualEventOverlay, SLOT(indicateKeyboardInputBlocked(Terminal*))); diff --git a/app/terminal.h b/app/terminal.h --- a/app/terminal.h +++ b/app/terminal.h @@ -29,15 +29,15 @@ class QKeyEvent; -class TerminalInterface; +class TerminalInterfaceV2; class Terminal : public QObject { Q_OBJECT public: - explicit Terminal(QWidget* parent = 0); + explicit Terminal(const QString& workingDir, QWidget* parent = 0); ~Terminal(); bool eventFilter(QObject* watched, QEvent* event) override; @@ -65,6 +65,8 @@ bool monitorSilenceEnabled() { return m_monitorSilenceEnabled; } void setMonitorSilenceEnabled(bool enabled); + QString currentWorkingDirectory () const; + void deletePart(); @@ -94,7 +96,7 @@ int m_terminalId; KParts::Part* m_part; - TerminalInterface* m_terminalInterface; + TerminalInterfaceV2* m_terminalInterface; QWidget* m_partWidget; QPointer m_terminalWidget; QWidget* m_parentSplitter; diff --git a/app/terminal.cpp b/app/terminal.cpp --- a/app/terminal.cpp +++ b/app/terminal.cpp @@ -41,7 +41,7 @@ int Terminal::m_availableTerminalId = 0; -Terminal::Terminal(QWidget* parent) : QObject(parent) +Terminal::Terminal(const QString& workingDir, QWidget* parent) : QObject(parent) { m_terminalId = m_availableTerminalId; m_availableTerminalId++; @@ -84,7 +84,12 @@ disableOffendingPartActions(); - m_terminalInterface = qobject_cast(m_part); + m_terminalInterface = qobject_cast(m_part); + + bool startInWorkingDir = m_terminalInterface->profileProperty(QStringLiteral("StartInCurrentSessionDir")).toBool(); + if (startInWorkingDir && !workingDir.isEmpty()) { + m_terminalInterface->showShellInDir(workingDir); + } } else displayKPartLoadError(); @@ -299,3 +304,8 @@ { emit silenceDetected(this); } + +QString Terminal::currentWorkingDirectory () const +{ + return m_terminalInterface->currentWorkingDirectory(); +}