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(SessionType type = Single, QWidget* parent = 0, Session* previousSession = 0); ~Session(); int id() { return m_sessionId; } @@ -118,9 +118,9 @@ private: - void setupSession(SessionType type); + void setupSession(SessionType type, Session* previousSession); - Terminal* addTerminal(QWidget* parent); + Terminal* addTerminal(QWidget* parent, Terminal *previousTerminal = 0); int split(Terminal* terminal, Qt::Orientation orientation); static int m_availableSessionId; diff --git a/app/session.cpp b/app/session.cpp --- a/app/session.cpp +++ b/app/session.cpp @@ -26,7 +26,7 @@ int Session::m_availableSessionId = 0; -Session::Session(SessionType type, QWidget* parent) : QObject(parent) +Session::Session(SessionType type, QWidget* parent, Session *previousSession) : QObject(parent) { m_sessionId = m_availableSessionId; m_availableSessionId++; @@ -38,7 +38,7 @@ m_baseSplitter = new Splitter(Qt::Horizontal, parent); connect(m_baseSplitter, SIGNAL(destroyed()), this, SLOT(prepareShutdown())); - setupSession(type); + setupSession(type, previousSession); } Session::~Session() @@ -48,13 +48,17 @@ emit destroyed(m_sessionId); } -void Session::setupSession(SessionType type) +void Session::setupSession(SessionType type, Session *previousSession) { + Terminal* previousTerminal = nullptr; + if (previousSession != nullptr) { + previousTerminal = previousSession->getTerminal(previousSession->activeTerminalId()); + } switch (type) { case Single: { - Terminal* terminal = addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, previousTerminal); setActiveTerminal(terminal->id()); break; @@ -64,8 +68,8 @@ { int splitterWidth = m_baseSplitter->width(); - Terminal* terminal = addTerminal(m_baseSplitter); - addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, previousTerminal); + addTerminal(m_baseSplitter, previousTerminal); QList newSplitterSizes; newSplitterSizes << (splitterWidth / 2) << (splitterWidth / 2); @@ -88,8 +92,8 @@ int splitterHeight = m_baseSplitter->height(); - Terminal* terminal = addTerminal(m_baseSplitter); - addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, previousTerminal); + addTerminal(m_baseSplitter, previousTerminal); QList newSplitterSizes; newSplitterSizes << (splitterHeight / 2) << (splitterHeight / 2); @@ -119,11 +123,11 @@ Splitter* lowerSplitter = new Splitter(Qt::Horizontal, m_baseSplitter); connect(lowerSplitter, SIGNAL(destroyed()), this, SLOT(cleanup())); - Terminal* terminal = addTerminal(upperSplitter); - addTerminal(upperSplitter); + Terminal* terminal = addTerminal(upperSplitter, previousTerminal); + addTerminal(upperSplitter, previousTerminal); - addTerminal(lowerSplitter); - addTerminal(lowerSplitter); + addTerminal(lowerSplitter, previousTerminal); + addTerminal(lowerSplitter, previousTerminal); QList newSplitterSizes; newSplitterSizes << (splitterHeight / 2) << (splitterHeight / 2); @@ -147,16 +151,22 @@ default: { - addTerminal(m_baseSplitter); + addTerminal(m_baseSplitter, previousTerminal); break; } } } -Terminal* Session::addTerminal(QWidget* parent) +Terminal* Session::addTerminal(QWidget* parent, Terminal* previousTerminal) { - Terminal* terminal = new Terminal(parent); + Terminal* terminal = nullptr; + if (previousTerminal == nullptr) previousTerminal = getTerminal(activeTerminalId()); + + if (previousTerminal == nullptr) + terminal = new Terminal(parent); + else + terminal = new Terminal(parent, previousTerminal->getCwd()); 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))); diff --git a/app/sessionstack.h b/app/sessionstack.h --- a/app/sessionstack.h +++ b/app/sessionstack.h @@ -52,6 +52,8 @@ bool requiresVisualEventOverlay(); + Session* getSession(int sessionId); + public Q_SLOTS: int addSessionImpl(Session::SessionType type = Session::Single); diff --git a/app/sessionstack.cpp b/app/sessionstack.cpp --- a/app/sessionstack.cpp +++ b/app/sessionstack.cpp @@ -51,7 +51,7 @@ int SessionStack::addSessionImpl(Session::SessionType type) { - Session* session = new Session(type, this); + Session* session = new Session(type, this, getSession(m_activeSessionId)); 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*))); @@ -598,6 +598,13 @@ return m_sessions.value(m_activeSessionId)->hasTerminalsWithKeyboardInputDisabled(); } +Session* SessionStack::getSession(int sessionId) +{ + if (!m_sessions.contains(sessionId)) return nullptr; + + return m_sessions.value(sessionId); +} + void SessionStack::handleTerminalHighlightRequest(int terminalId) { Terminal* terminal = 0; diff --git a/app/terminal.h b/app/terminal.h --- a/app/terminal.h +++ b/app/terminal.h @@ -24,6 +24,7 @@ #include +#include #include @@ -37,7 +38,7 @@ Q_OBJECT public: - explicit Terminal(QWidget* parent = 0); + explicit Terminal(QWidget* parent = 0, const QString& workingDir = QDir::homePath()); ~Terminal(); bool eventFilter(QObject* watched, QEvent* event) override; @@ -49,6 +50,7 @@ QWidget* terminalWidget() { return m_terminalWidget; } QWidget* splitter() { return m_parentSplitter; } + QString getCwd(); void setSplitter(QWidget* splitter) { m_parentSplitter = splitter; } void runCommand(const QString& command); diff --git a/app/terminal.cpp b/app/terminal.cpp --- a/app/terminal.cpp +++ b/app/terminal.cpp @@ -42,7 +42,7 @@ int Terminal::m_availableTerminalId = 0; -Terminal::Terminal(QWidget* parent) : QObject(parent) +Terminal::Terminal(QWidget* parent, const QString& workingDir) : QObject(parent) { m_terminalId = m_availableTerminalId; m_availableTerminalId++; @@ -86,7 +86,7 @@ disableOffendingPartActions(); m_terminalInterface = qobject_cast(m_part); - if (m_terminalInterface) m_terminalInterface->showShellInDir(QDir::homePath()); + if (m_terminalInterface) m_terminalInterface->showShellInDir(workingDir); } else displayKPartLoadError(); @@ -233,6 +233,11 @@ m_terminalInterface->sendInput(command + QStringLiteral("\n")); } +QString Terminal::getCwd() +{ + return m_terminalInterface->currentWorkingDirectory(); +} + void Terminal::manageProfiles() { QMetaObject::invokeMethod(m_part, "showManageProfilesDialog",