diff --git a/app/session.h b/app/session.h --- a/app/session.h +++ b/app/session.h @@ -28,7 +28,7 @@ #include #include - +#include class Terminal; @@ -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, QString dir = QDir::homePath(), QWidget* parent = 0); ~Session(); int id() { return m_sessionId; } @@ -118,9 +118,9 @@ private: - void setupSession(SessionType type); + void setupSession(SessionType type, QString dir); - Terminal* addTerminal(QWidget* parent); + Terminal* addTerminal(QWidget* parent, QString dir); 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, QString dir, QWidget* parent) : 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, dir); } Session::~Session() @@ -48,13 +48,13 @@ emit destroyed(m_sessionId); } -void Session::setupSession(SessionType type) +void Session::setupSession(SessionType type, QString dir) { switch (type) { case Single: { - Terminal* terminal = addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, dir); setActiveTerminal(terminal->id()); break; @@ -64,8 +64,8 @@ { int splitterWidth = m_baseSplitter->width(); - Terminal* terminal = addTerminal(m_baseSplitter); - addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, dir); + addTerminal(m_baseSplitter, dir); QList newSplitterSizes; newSplitterSizes << (splitterWidth / 2) << (splitterWidth / 2); @@ -88,8 +88,8 @@ int splitterHeight = m_baseSplitter->height(); - Terminal* terminal = addTerminal(m_baseSplitter); - addTerminal(m_baseSplitter); + Terminal* terminal = addTerminal(m_baseSplitter, dir); + addTerminal(m_baseSplitter, dir); QList newSplitterSizes; newSplitterSizes << (splitterHeight / 2) << (splitterHeight / 2); @@ -119,11 +119,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, dir); + addTerminal(upperSplitter, dir); - addTerminal(lowerSplitter); - addTerminal(lowerSplitter); + addTerminal(lowerSplitter, dir); + addTerminal(lowerSplitter, dir); QList newSplitterSizes; newSplitterSizes << (splitterHeight / 2) << (splitterHeight / 2); @@ -147,16 +147,16 @@ default: { - addTerminal(m_baseSplitter); + addTerminal(m_baseSplitter, dir); break; } } } -Terminal* Session::addTerminal(QWidget* parent) +Terminal* Session::addTerminal(QWidget* parent, QString dir) { - Terminal* terminal = new Terminal(parent); + Terminal* terminal = new Terminal(parent, dir); 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))); @@ -276,7 +276,7 @@ int Session::split(Terminal* terminal, Qt::Orientation orientation) { Splitter* splitter = static_cast(terminal->splitter()); - + QString currrntPath = m_terminals[activeTerminalId()]->getCurrentWorkingDirectory(); if (splitter->count() == 1) { int splitterWidth = splitter->width(); @@ -284,7 +284,7 @@ if (splitter->orientation() != orientation) splitter->setOrientation(orientation); - terminal = addTerminal(splitter); + terminal = addTerminal(splitter, currrntPath); QList newSplitterSizes; newSplitterSizes << (splitterWidth / 2) << (splitterWidth / 2); @@ -310,7 +310,7 @@ terminal->setSplitter(newSplitter); - terminal = addTerminal(newSplitter); + terminal = addTerminal(newSplitter, currrntPath); 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,16 @@ int SessionStack::addSessionImpl(Session::SessionType type) { - Session* session = new Session(type, this); + Session* currentSession = m_sessions[m_activeSessionId]; + QString currentPath; + if (currentSession) + { + currentPath = currentSession->getTerminal(currentSession->activeTerminalId())->getCurrentWorkingDirectory(); + } else + { + QDir::homePath(); + } + Session* session = new Session(type, currentPath, 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 @@ -24,6 +24,7 @@ #include +#include #include @@ -37,7 +38,7 @@ Q_OBJECT public: - explicit Terminal(QWidget* parent = 0); + explicit Terminal(QWidget* parent = 0, QString dir = QDir::homePath()); ~Terminal(); bool eventFilter(QObject* watched, QEvent* event) override; @@ -66,6 +67,7 @@ void setMonitorSilenceEnabled(bool enabled); void deletePart(); + QString getCurrentWorkingDirectory(); Q_SIGNALS: diff --git a/app/terminal.cpp b/app/terminal.cpp --- a/app/terminal.cpp +++ b/app/terminal.cpp @@ -32,7 +32,6 @@ #include #include -#include #include #include #include @@ -42,7 +41,7 @@ int Terminal::m_availableTerminalId = 0; -Terminal::Terminal(QWidget* parent) : QObject(parent) +Terminal::Terminal(QWidget* parent, QString dir) : QObject(parent) { m_terminalId = m_availableTerminalId; m_availableTerminalId++; @@ -86,7 +85,7 @@ disableOffendingPartActions(); m_terminalInterface = qobject_cast(m_part); - if (m_terminalInterface) m_terminalInterface->showShellInDir(QDir::homePath()); + if (m_terminalInterface) m_terminalInterface->showShellInDir(dir); } else displayKPartLoadError(); @@ -301,3 +300,8 @@ { emit silenceDetected(this); } + +QString Terminal::getCurrentWorkingDirectory() +{ + return m_terminalInterface->currentWorkingDirectory(); +}